Spring AI 入门级学习 3:RAG
接下来我们来了解一个AI领域中重要的概念:RAG
RAG 的全称是 Retrieval-Augmented Generation(检索增强生成),是一种结合了信息检索和 AI 大语言模型生成能力的混合架构,它通过为 AI 提供外部“知识库”来确保回答的准确性、实时性和专业性。
RAG 的工作流程
- 文档收集与切割:从 PDF、网页或数据库中收集原始资料,并将其切割成适合 AI 处理的文本块(Chunks)。
- 向量转换与存储:利用 Embedding 模型将文本转化为计算机能理解的数学向量,并存入向量数据库(也有其他数据库存向量的)。
- 文档检索:当用户提问时,系统会将问题也转化为向量,在数据库中搜索最相似、最相关的文本块(Rank 模型(排序模型)负责对召回阶段筛选出的候选集进行精确排序,考虑多种特征评估相关性)
- 查询增强与生成:将检索到的相关内容与用户的问题组合在一起,发送给大模型,最终生成精准的回答。
RAG 中的 ETL (Extract-Transform-Load)
Extract (提取/读取) : 由 DocumentReader(如 TextReader, PagePdfDocumentReader)负责。它将原始文件(PDF, Word, TXT)读入内存,变成一个个 Document 对象。
Transform (转换/处理) : 这是最关键的一步。由于大模型的上下文长度有限,我们需要用 DocumentTransformer(常用的是 TokenTextSplitter)将长文章切分成小块 (Chunks)。
(MarkdownTextSplitter (Markdown 切分器):会识别 Markdown 的语法,尽量保证同一个标题下的内容被分在一起)
Load (加载/存储) : 当你调用 vectorStore.add(documents) 时,它内部会自动调用 EmbeddingModel(如 OpenAI 的 text-embedding-3-small)将文本变成一串数字(向量),然后存入数据库。
(在 Spring AI 的标准接口设计中,VectorStore.add 方法通常接收的是 List<Document>)
简化版示例
VectorStore vectorStore(EmbeddingModel dashscopeEmbeddingModel) {
// 1. Extract: 读取原始文本
// 加载文档
List documents = appDocumentLoader.loadMarkdowns();
// 2. Transform: 将长文本切分成 500 Token 左右的小块
// 这是为了让检索更精准,也避免超过大模型的窗口限制
TokenTextSplitter splitter = new TokenTextSplitter(
800, // 块的大小
200, // 相邻块的重叠度(保持上下文连贯)
5, // 最大迭代次数
true // 是否保留标点
);
List<Document> splitDocuments = splitter.apply(documents);
// 3. Load: 存入向量数据库(内部会自动进行 Embedding 转换)
SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(dashscopeEmbeddingModel)
.build();
// 将文档存入向量数据库
simpleVectorStore.add(splitDocuments);
return simpleVectorStore;
}
@Resource
private VectorStore vectorStore;
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 QuestionAnswerAdvisor(vectorStore))
.call()
.chatResponse();
String content = chatResponse.getResult().getOutput().getText();
log.info("content: {}", content);
return content;
}
QuestionAnsweringAdvisor 的逻辑是固定的:用户提问 -> 查向量库 -> 塞进 Prompt
RetrievalAugmentationAdvisor 可以实现企业级、复杂 RAG 工作流
RetrievalAugmentationAdvisor advisor = RetrievalAugmentationAdvisor.builder()
.documentRetriever(retrievalStrategy) // 设置检索源 //
.queryTransformer(new RewriteQueryTransformer()) // 可选:添加查询转换逻辑
.build();
更多推荐



所有评论(0)