免费绘画软件FireAlpaca完全指南:轻量替代PS/SAI的插画与动画实践
2026/10/13 11:01:57
- Indexing Pipeline(离线文档处理)
- 文档加载
- 文本分块
- Embedding(向量化)
- 存入向量库
- Retrieval(检索增强)
- 用户提问问题
- 向量化
- 相似度检索
- 召回相关文档
Generation(生成)
- 检索结果拼入 Prompt
- 大模型生成答案
用户提问↓问题向量化(Embedding)↓向量库相似度检索↓召回 TopK 相关文档↓拼入 Prompt(上下文 + 问题)↓大模型生成答案
开发者需自行完成检索、拼接上下文、调用大模型三个步骤。
Spring AI 2.0 提供 RetrievalAugmentationAdvisor,自动编排检索和增强流程。
<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><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>@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(); } }@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(); } }@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(); }@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 等组件。
- QueryTransformers:查询改写(可选)
- DocumentRetriever:文档检索
- DocumentPostProcess:文档后处理器,重排或过滤检索结果(如Rerank,可选)
- QueryAugmenter:查询增强(将检索结果拼入 Prompt)
- ChatClient 调用:大模型生成答案
- QueryTransformer:查询改写器,提升检索效果
- DocumentPostProcessor:文档后处理器,支持重排或过滤
- QueryAugmenter:查询增强器,将检索结果拼入 Prompt