☰
第二章:4、RAG基础入门指南
2026/10/13 10:14:05 网站建设 项目流程

一、RAG完整链路流程概览

RAG(Retrieval-Augmented Generation)的主要流程如下:
  1. Indexing Pipeline(离线文档处理)
    1. 文档加载
    2. 文本分块
    3. Embedding(向量化)
    4. 存入向量库
  2. Retrieval(检索增强)
    1. 用户提问问题
    2. 向量化
    3. 相似度检索
    4. 召回相关文档
  3. Generation(生成)

    • 检索结果拼入 Prompt
    • 大模型生成答案

二、RAG完整流程示意

用户提问
↓
问题向量化(Embedding)
↓
向量库相似度检索
↓
召回 TopK 相关文档
↓
拼入 Prompt(上下文 + 问题)
↓
大模型生成答案

三、RAG实现方式

1. 手动编排

开发者需自行完成检索、拼接上下文、调用大模型三个步骤。

2. 自动编排(Spring AI 推荐方式)

Spring AI 2.0 提供 RetrievalAugmentationAdvisor,自动编排检索和增强流程。

四、关键代码示例

1. pom.xml 依赖

Spring AI BOM
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>2.0.1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
RAG所需依赖
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-rag</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-openai</artifactId> </dependency>

2. 手动编排配置

@Configuration public class PromptClientConfiguration { @Bean("ragManualChatClient") public ChatClient ragManualChatClient( ChatClient.Builder chatClientBuilder, VectorStore vectorStore) { String promptTemplate = """ 你是一个知识库助手,请根据以下参考资料回答用户问题。 参考资料: {context} 问题:{question} """; return chatClientBuilder.build(); } // 检索文档并拼接上下文 private String retrieveAndBuildContext(String question) { List<Document> docs = vectorStore.similaritySearch( SearchRequest.builder().query(question).topK(5).build() ); StringBuilder sb = new StringBuilder(); for (Document doc : docs) { sb.append(doc.getText()).append("\n\n"); } return sb.toString(); } }

3. 自动编排配置

@Configuration public class PromptClientConfiguration { @Bean("ragAutoChatClient") public ChatClient ragAutoChatClient(ChatClient.Builder chatClientBuilder, VectorStore vectorStore) { RetrievalAugmentationAdvisor ragAdvisor = RetrievalAugmentationAdvisor.builder() .documentRetriever(VectorStoreDocumentRetriever.builder() .vectorStore(vectorStore) .topK(5) .build()) .build(); return chatClientBuilder .defaultAdvisors(ragAdvisor) .build(); } }

4. 手动编排调用

@GetMapping(value = "/ask") public String ask(@RequestParam String question) { // Step 1: 从向量库检索相关文档 List<Document> relevantDocs = knowledgeService.search(question, 5, 0.6); // Step 2: 把检索到的文档拼接成上下文 StringBuilder context = new StringBuilder(); for (int i = 0; i < relevantDocs.size(); i++) { Document doc = relevantDocs.get(i); context.append(String.format("\n【参考资料%d】(来源:%s)\n%s", i + 1, doc.getMetadata().getOrDefault("source", "未知"), doc.getText())); } // Step 3: 构建增强Prompt,发送给大模型 String prompt = String.format(""" 参考资料: %s 用户问题:%s 请根据上述参考资料回答问题。如果参考资料中没有相关信息,请明确告知。 """, context, question); return ragManualChatClient.prompt() .user(prompt) .call() .content(); }

5. 自动编排调用

@GetMapping("/ask-auto") public String askAuto(@RequestParam String question) { return ragAutoChatClient.prompt() .user(question) .call() .content(); }

五、两种编排方式适用场景

1.手动编排 - 学习 RAG 原理,理解分块、检索、增强、生成的完整链路。 - 调试检索效果,单独观察召回、重排序、Prompt 增强等环节。 - 需要自定义混合检索、元数据过滤、多路召回、RRF 合并、Rerank。 - 需要精细控制 Embedding、分块策略、上下文窗口和溯源信息。 - 业务系统已有自己的检索服务、权限体系或数据管道。 2.自动编排 / Advisor - 标准 RAG 问答,希望快速集成。 - 使用 QuestionAnswerAdvisor、RetrievalAugmentationAdvisor 等组件一键装配检索增强流程。 - 需要组合多种 Advisor,例如记忆管理、RAG 检索、工具调用、权限过滤。 - 团队希望减少管线胶水代码,把重心放在数据质量、评估和 Prompt 设计上。 - 原型验证、内部知识库、客服问答等标准化场景。 3.生产环境怎么选? 生产环境不能简单说“推荐 Advisor”或“推荐手动编排”,更合理的判断是: - 优先自动编排 / Advisor:场景较标准、检索逻辑不复杂、希望快速上线和统一维护。 - 优先手动编排:需要混合检索、重排序、多源召回、复杂权限控制、自定义评估链路或深度性能优化。 常见折中方案:用 Advisor 做基础编排,同时替换其中的检索器、Joiner、Ranker、QueryTransformer 等组件。

六、RAG Advisor流程总结

RetrievalAugmentationAdvisor 内部流程:
  1. QueryTransformers:查询改写(可选)
  2. DocumentRetriever:文档检索
  3. DocumentPostProcess:文档后处理器,重排或过滤检索结果(如Rerank,可选)
  4. QueryAugmenter:查询增强(将检索结果拼入 Prompt)
  5. ChatClient 调用:大模型生成答案

七、参考与补充

RAG Advisor 扩展能力:
  • QueryTransformer:查询改写器,提升检索效果
  • DocumentPostProcessor:文档后处理器,支持重排或过滤
  • QueryAugmenter:查询增强器,将检索结果拼入 Prompt

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询