【保姆级图文详解】RAG 实战(Spring AI + 本地知识库)旅游知识库问答
文章目录
- 前言
- 一、RAG 实战(Spring AI + 本地知识库)流程
- 1.1、 开发步骤
- 1.2、文档RAG过程(ETL 流程)
- 1.3、实战开发
- 二、RAG 实战(Spring AI + 云知识库)流程
- 三、RAG 实战(Spring AI + PG知识库)流程
前言
亲爱的家人们,创作很不容易,若对您有帮助的话,请点赞收藏加关注哦,您的关注是我持续创作的动力,谢谢大家!有问题请私信或联系邮箱:fn_kobe@163.com
一、RAG 实战(Spring AI + 本地知识库)流程
1.1、 开发步骤
- 标准:文档收集切割→向量转换存储→切片过滤检索→查询增强关联。
- 简化:文档准备→文档读取→向量转换存储→查询增强。
1.2、文档RAG过程(ETL 流程)
- 借 Spring AI Alibaba的 文档,关键技术如下:
- DocumentReader(读文档)
- DocumentTransformer(转文档)
- DocumentWriter(存文档),完成 “文档→向量库” 的抽取、转换、加载
1.3、实战开发
- 1、引入依赖。
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-markdown-document-reader</artifactId><version>1.0.0-M6</version>
</dependency>
- 2、编写文档加载器类。
@Component
@Slf4j
class LoveAppDocumentLoader {private final ResourcePatternResolver resourcePatternResolver;LoveAppDocumentLoader(ResourcePatternResolver resourcePatternResolver) {this.resourcePatternResolver = resourcePatternResolver;}public List<Document> loadMarkdowns() {List<Document> allDocuments = new ArrayList<>();try {// 这里可以修改为你要加载的多个 Markdown 文件的路径模式Resource[] resources = resourcePatternResolver.getResources("classpath:document/*.md");for (Resource resource : resources) {String fileName = resource.getFilename();MarkdownDocumentReaderConfig config = MarkdownDocumentReaderConfig.builder().withHorizontalRuleCreateDocument(true).withIncludeCodeBlock(false).withIncludeBlockquote(false).withAdditionalMetadata("filename", fileName).build();MarkdownDocumentReader reader = new MarkdownDocumentReader(resource, config);allDocuments.addAll(reader.get());}} catch (IOException e) {log.error("Markdown 文档加载失败", e);}return allDocuments;}
}// 通过配置(如 MarkdownDocumentReaderConfig )定制读取规则、添加元信息(如文件名)辅助检索。
- 3、向量与查询,用内置 SimpleVectorStore(实现 VectorStore 接口,支持文档写入 ),先借 Embedding 模型转文档为向量,再存向量到内存数据库,简化实现。
- 4、查询增强:靠 Advisor 特性(QuestionAnswerAdvisor/RetrievalAugmentationAdvisor ),用户提问时,QuestionAnswerAdvisor 从向量库查相关文档,附加到用户问题,为大模型生成回答提供上下文,用知识库辅助问答。QuestionAnswerAdvisor 源码含让 AI 基于知识库问答的 Prompt 。
@Configuration
public class AppVectorStoreConfig {@Resourceprivate AppDocumentLoader AppDocumentLoader;@BeanVectorStore AppVectorStore(EmbeddingModel dashscopeEmbeddingModel) {SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(dashscopeEmbeddingModel).build();// 加载文档List<Document> documents = AppDocumentLoader.loadMarkdowns();simpleVectorStore.add(documents);return simpleVectorStore;}
}
- 5、引入Adviso依赖。
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-advisors-vector-store</artifactId>
</dependency>
- 6、编写代码,进行单元测试。
@Resource
private VectorStore AppVectorStore;public String doChatWithRag(String message, String chatId) {ChatResponse chatResponse = chatClient.prompt().user(message).advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))// 开启日志,便于观察效果.advisors(new LoggerAdvisor())// 应用知识库问答.advisors(new QuestionAnswerAdvisor(lpVetorStore)).call().chatResponse();String content = chatResponse.getResult().getOutput().getText();log.info("content: {}", content);return content;
}
@Testvoid doChatWithRag() {String chatId = UUID.randomUUID().toString();String message = "中国热门目的地的最佳旅游季节有哪些";String answer = TravelApp.doChatWithRag(message, chatId);Assertions.assertNotNull(answer);}
- 7、结果验证。
二、RAG 实战(Spring AI + 云知识库)流程
待撰写
三、RAG 实战(Spring AI + PG知识库)流程
待撰写