接下来我们来了解一个AI领域中重要的概念:RAG

RAG 的全称是 Retrieval-Augmented Generation(检索增强生成),是一种结合了信息检索和 AI 大语言模型生成能力的混合架构,它通过为 AI 提供外部“知识库”来确保回答的准确性、实时性和专业性。​

RAG 的工作流程

  1. 文档收集与切割:从 PDF、网页或数据库中收集原始资料,并将其切割成适合 AI 处理的文本块(Chunks)。
  2. 向量转换与存储:利用 Embedding 模型将文本转化为计算机能理解的数学向量,并存入向量数据库(也有其他数据库存向量的)。
  3. 文档检索:当用户提问时,系统会将问题也转化为向量,在数据库中搜索最相似、最相关的文本块(Rank ‏‏‏‏‏‏‏模型(排序模型)‍‍‍‍‍‍负‍责对召回阶段筛‎‎‎‎‎‎选出‎的候选集进行‏‏‏‏‏‏精确排‏序,考虑多⁡⁡⁡⁡⁡⁡种特征评⁡估相关性)
  4. 查询增强与生成:将检索到的相关内容与用户的问题组合在一起,发送给大模型,最终生成精准的回答。

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();

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐