| 此版本仍在开发中,尚未被视为稳定版本。最新的快照版本请使用 Spring AI 1.0.0-SNAPSHOT! | 
检索增强一代
检索增强生成 (RAG) 是一种有助于克服大型语言模型局限性的技术 这些内容与长篇内容、事实准确性和上下文感知作斗争。
Spring AI 通过提供模块化架构来支持 RAG,该架构允许您自己构建自定义 RAG 流
或使用Advisor应用程序接口。
| 在概念部分了解有关 Retrieval Augmented Generation 的更多信息。 | 
顾问
Spring AI 使用Advisor应用程序接口。
QuestionAnswer顾问
矢量数据库存储 AI 模型不知道的数据。
将用户问题发送到 AI 模型时,QuestionAnswerAdvisor查询 Vector 数据库中与用户问题相关的文档。
来自向量数据库的响应将附加到用户文本中,以便为 AI 模型生成响应提供上下文。
假设您已经将数据加载到VectorStore中,您可以通过提供QuestionAnswerAdvisor到ChatClient.
ChatResponse response = ChatClient.builder(chatModel)
        .build().prompt()
        .advisors(new QuestionAnswerAdvisor(vectorStore))
        .user(userText)
        .call()
        .chatResponse();在此示例中,QuestionAnswerAdvisor将对 Vector Database 中的所有文献执行相似性检索。
要限制搜索的文档类型,SearchRequest采用可跨所有VectorStores.
此筛选条件表达式可以在创建QuestionAnswerAdvisor因此将始终适用于所有ChatClient请求,也可以在运行时为每个请求提供。
以下是创建QuestionAnswerAdvisor其中,阈值为0.8并返回顶部6鲁尔斯特。
var qaAdvisor = new QuestionAnswerAdvisor(this.vectorStore,
        SearchRequest.builder().similarityThreshold(0.8d).topK(6).build());动态筛选表达式
更新SearchRequestfilter 表达式在FILTER_EXPRESSIONadvisor context 参数:
ChatClient chatClient = ChatClient.builder(chatModel)
    .defaultAdvisors(new QuestionAnswerAdvisor(vectorStore, SearchRequest.builder().build()))
    .build();
// Update filter expression at runtime
String content = this.chatClient.prompt()
    .user("Please answer my question XYZ")
    .advisors(a -> a.param(QuestionAnswerAdvisor.FILTER_EXPRESSION, "type == 'Spring'"))
    .call()
    .content();这FILTER_EXPRESSIONparameter 允许您根据提供的表达式动态筛选搜索结果。
RetrievalAugmentationAdvisor (孵化)
Spring AI 包括一个 RAG 模块库,您可以使用这些模块来构建自己的 RAG 流。
这RetrievalAugmentationAdvisor是一个实验性的Advisor为最常见的 RAG 流提供开箱即用的实现,
基于模块化架构。
| 这 RetrievalAugmentationAdvisor是一项实验性功能,在未来版本中可能会发生更改。 | 
顺序 RAG 流
天真的 RAG
Advisor retrievalAugmentationAdvisor = RetrievalAugmentationAdvisor.builder()
        .documentRetriever(VectorStoreDocumentRetriever.builder()
                .similarityThreshold(0.50)
                .vectorStore(vectorStore)
                .build())
        .build();
String answer = chatClient.prompt()
        .advisors(retrievalAugmentationAdvisor)
        .user(question)
        .call()
        .content();默认情况下,RetrievalAugmentationAdvisor不允许检索到的上下文为空。当这种情况发生时,
它指示模型不回答用户查询。您可以允许空上下文,如下所示。
Advisor retrievalAugmentationAdvisor = RetrievalAugmentationAdvisor.builder()
        .documentRetriever(VectorStoreDocumentRetriever.builder()
                .similarityThreshold(0.50)
                .vectorStore(vectorStore)
                .build())
        .queryAugmenter(ContextualQueryAugmenter.builder()
                .allowEmptyContext(true)
                .build())
        .build();
String answer = chatClient.prompt()
        .advisors(retrievalAugmentationAdvisor)
        .user(question)
        .call()
        .content();高级 RAG
Advisor retrievalAugmentationAdvisor = RetrievalAugmentationAdvisor.builder()
        .queryTransformer(RewriteQueryTransformer.builder()
                .chatClientBuilder(chatClientBuilder.build().mutate())
                .build())
        .documentRetriever(VectorStoreDocumentRetriever.builder()
                .similarityThreshold(0.50)
                .vectorStore(vectorStore)
                .build())
        .build();
String answer = chatClient.prompt()
        .advisors(retrievalAugmentationAdvisor)
        .user(question)
        .call()
        .content();模块
Spring AI 实现了一个模块化 RAG 架构,其灵感来自论文中详述的模块化概念 “模块化 RAG:将 RAG 系统转变为类似乐高的可重构框架”。
- 警告
- 
模块化 RAG 是一项实验性功能,在未来版本中可能会发生变化。 
预取
预检索模块负责处理用户查询以实现最佳检索结果。
查询转换
一个用于转换输入查询以使其更有效地执行检索任务、解决挑战的组件 例如格式不正确的查询、模棱两可的术语、复杂的词汇或不支持的语言。
CompressionQueryTransformer (压缩查询转换器)
一个CompressionQueryTransformer使用大型语言模型压缩对话历史记录和后续查询
转换为捕获对话本质的独立查询。
当对话历史记录很长且后续查询相关时,此转换器非常有用 添加到对话上下文中。
Query query = Query.builder()
        .text("And what is its second largest city?")
        .history(new UserMessage("What is the capital of Denmark?"),
                new AssistantMessage("Copenhagen is the capital of Denmark."))
        .build();
QueryTransformer queryTransformer = CompressionQueryTransformer.builder()
        .chatClientBuilder(chatClientBuilder)
        .build();
Query transformedQuery = queryTransformer.transform(query);此组件使用的提示可以通过promptTemplate()方法。
重写QueryTransformer
一个RewriteQueryTransformer使用大型语言模型重写用户查询,以便在
查询目标系统,例如矢量存储或 Web 搜索引擎。
当用户查询冗长、不明确或包含不相关信息时,此转换器非常有用 这可能会影响搜索结果的质量。
Query query = new Query("I'm studying machine learning. What is an LLM?");
QueryTransformer queryTransformer = RewriteQueryTransformer.builder()
        .chatClientBuilder(chatClientBuilder)
        .build();
Query transformedQuery = queryTransformer.transform(query);此组件使用的提示可以通过promptTemplate()方法。
TranslationQueryTransformer
一个TranslationQueryTransformer使用大型语言模型将查询转换为支持的目标语言
通过用于生成文档嵌入的嵌入模型。如果查询已使用目标语言,则
它返回原封不动。如果查询的语言未知,则也会原封不动地返回它。
当嵌入模型在特定语言上训练并且用户查询 使用不同的语言。
Query query = new Query("Hvad er Danmarks hovedstad?");
QueryTransformer queryTransformer = TranslationQueryTransformer.builder()
        .chatClientBuilder(chatClientBuilder)
        .targetLanguage("english")
        .build();
Query transformedQuery = queryTransformer.transform(query);此组件使用的提示可以通过promptTemplate()方法。
查询扩展
一个组件,用于将输入查询扩展为查询列表,以解决诸如格式不正确的查询等挑战 通过提供替代查询公式,或将复杂问题分解为更简单的子查询。
MultiQueryExpander
一个MultiQueryExpander使用大型语言模型将查询扩展为多个语义不同的变体
捕获不同的视角,有助于检索其他上下文信息和增加机会
找到相关结果。
MultiQueryExpander queryExpander = MultiQueryExpander.builder()
    .chatClientBuilder(chatClientBuilder)
    .numberOfQueries(3)
    .build();
List<Query> queries = expander.expand(new Query("How to run a Spring Boot app?"));默认情况下,MultiQueryExpander在展开的查询列表中包含原始查询。您可以禁用此行为
通过includeOriginal方法。
MultiQueryExpander queryExpander = MultiQueryExpander.builder()
    .chatClientBuilder(chatClientBuilder)
    .includeOriginal(false)
    .build();此组件使用的提示可以通过promptTemplate()方法。
检索
检索模块负责查询数据系统(如 vector store)并检索最相关的文档。
文件搜索
负责检索的组件Documents从基础数据源(如搜索引擎、矢量存储)、
数据库或知识图谱。
VectorStoreDocumentRetriever
一个VectorStoreDocumentRetriever从向量存储中检索语义上与输入相似的文档
查询。它支持根据元数据、相似性阈值和 top-k 结果进行筛选。
DocumentRetriever retriever = VectorStoreDocumentRetriever.builder()
    .vectorStore(vectorStore)
    .similarityThreshold(0.73)
    .topK(5)
    .filterExpression(new FilterExpressionBuilder()
        .eq("genre", "fairytale")
        .build())
    .build();
List<Document> documents = retriever.retrieve(new Query("What is the main character of the story?"));筛选条件表达式可以是 static 或 dynamic。对于动态筛选条件表达式,您可以传递Supplier.
DocumentRetriever retriever = VectorStoreDocumentRetriever.builder()
    .vectorStore(vectorStore)
    .filterExpression(() -> new FilterExpressionBuilder()
        .eq("tenant", TenantContextHolder.getTenantIdentifier())
        .build())
    .build();
List<Document> documents = retriever.retrieve(new Query("What are the KPIs for the next semester?"));文档联接
一个组件,用于将基于多个查询和从多个数据源检索的文档合并到 单个文档集合。作为连接过程的一部分,它还可以处理重复文档和互惠 排名策略。
ConcatenationDocumentJoiner
一个ConcatenationDocumentJoiner合并基于多个查询和多个数据源检索的文档
将它们连接到单个文档集合中。如果存在重复的文档,则保留第一次出现。
每个文档的分数保持原样。
Map<Query, List<List<Document>>> documentsForQuery = ...
DocumentJoiner documentJoiner = new ConcatenationDocumentJoiner();
List<Document> documents = documentJoiner.join(documentsForQuery);检索后
检索后模块负责处理检索到的文档,以实现最佳的生成结果。
文档排名
一个组件,用于根据文档与查询的相关性对文档进行排序和排名,以引入最相关的文档 到列表顶部,解决诸如 Lost-in-the-middle 等挑战。
与DocumentSelector,此组件不会从列表中删除整个文档,而是进行更改
列表中文档的顺序/分数。与DocumentCompressor,则此组件不会更改内容
的文件。
生成
生成模块负责根据用户查询和检索到的文档生成最终响应。
查询扩充
一个组件,用于使用其他数据来扩充输入查询,可用于提供大型语言模型 替换为回答用户查询所需的上下文。
上下文QueryAugmenter
这ContextualQueryAugmenter使用来自所提供文档内容的上下文数据来扩充用户查询。
QueryAugmenter queryAugmenter = ContextualQueryAugmenter.builder().build();默认情况下,ContextualQueryAugmenter不允许检索到的上下文为空。当这种情况发生时,
它指示模型不回答用户查询。
您可以启用allowEmptyContext选项,以允许模型生成响应,即使检索到的上下文为空。
QueryAugmenter queryAugmenter = ContextualQueryAugmenter.builder()
        .allowEmptyContext(true)
        .build();此组件使用的提示可以通过promptTemplate()和emptyContextPromptTemplate()方法
在构建器中可用。