Advertisement

第8章:LangChain检索增强生成RAG--2.4Advanced RAG【高级RAG】

阅读量:

本节深入阐述了 LangChain4j 中高级 RAG(Advanced RAG)的具体实现机制。该方法通过一系列模块化组件显著提升了信息检索性能,并赋予了系统较强的适应性和个性化调整空间。这一技术通常被视为实现高效信息处理的关键手段。

基于以下假设:1)生成内容需具备高质量;2)数据量足够大以支持有效的训练;3)能够通过引入先进的机器学习算法提升模型性能。该方法将显著提高数据处理效率,并确保生成内容更加贴近用户的兴趣需求。该高级RAG方案将有效解决传统RAG在复杂场景下的不足,借助于前沿的人工智能技术,实现对大规模文档集的深度理解和精准检索能力。通过引入概率建模理论的支持,模型不仅可以自动识别关键信息点,还能更高效地构建高质量的知识图谱结构,在保持计算效率的同时提升内容的相关性评估精度。这种方案将显著提升数据处理的速率,并在保证准确率的前提下降低资源消耗成本。

高级RAG可以通过LangChain4j实现,并且涉及以下核心组件:

Query Transformer(查询转换器) → Query Transformer(查询变换器)
Query Router(查询路由器) → Query Router(查询路由系统)
Content Retrieval System(内容检索系统) → Content Retriever(内容检索器)
Data Aggregation Engine(数据聚合引擎) → Content Aggregator(内容聚合器)
Real-Time DataInjection System (实时数据注入系统)→ ContentInjector(内容注入器)

以下数据呈现了这些组件的协作机制

https://docs.langchain4j.dev/assets/images/advanced-rag-fb84283d02470b835ff2f4913f08fdbf.png

流程如下

该系统将原始消息转化为一个查询请求,在元数据处理模块下进行拆解和扩展。通过预设的业务规则配置,每个独立的查询会被分解为多个子任务并分配给相应的检索单元完成。在数据采集阶段,系统会根据预设的路由策略,将每个独立的查询分配到对应的检索器进行处理。针对当前特定的查询语句,系统会对目标文档集进行全面扫描,并提取出匹配度最高的文本片段。最后,经过筛选和排序后的内容会被整合并注入到原始消息中作为补充内容,同时包含完整的检索结果数据和相关元数据分析。

根据每个组件的 JavaDoc 文档,您可以在其中找到更多详细信息。

Enhanced Retrieval System(增强检索系统)

在 RAG 过程中,RetrievalAugmentor 起着入口的作用,并通过结合 ChatMessage 和来自多源的信息来增强内容。当搭建 AI 服务时,建议为系统中注入一个 RetrievalAugmentor 实例以提升其功能。

复制代码
    Assistant assistant = AiServices.builder(Assistant.class)
    ...
    .retrievalAugmentor(retrievalAugmentor)
    .build();

每次调用 AI 服务时,会被指定用于增强当前的 UserMessage。你可以被建议使用默认的 RetrievalAugmentor(如上所述),或者进行开发并部署一个自定义的。

LangChain4j 提供了一种现成的接口实现方式:DefaultRetrievalAugmentor。这种设计方法源自两篇关键文献:文章论文。参考这两篇文献可进一步了解其原理。

Query(搜索请求)是用户进行的精确搜索过程。该系统能够有效提取并返回相关信息数据集。

在RAG流程中,Query代表用户的查询信息。该信息包含查询文本内容以及相关的元数据。

获取关键信息(Query Metadata)用于描述查询请求及其相关的上下文数据。

Query中的Metadata包中可能包含以下在RAG流程各个组件中有用的各类信息:

  • Metadata.userMessage():应作为基础信息而被加强的原始UserMessage。

    • Metadata.chatMemoryId():通过@MemoryId注解的方法参数获取的数值信息。该值可用于识别用户并实施访问权限控制或过滤措施,具体内容请参见此处。

    • Metadata.chatMemory():记录前次对话内容的信息项。这一数据字段有助于理解查询操作所处的历史背景。

该查询转换器可实现用户自然语言提问与特定领域问题之间的精准转化。它提供多样化的转换策略选项,并可根据具体场景优化选择。系统能够识别和归类输入内容并对其生成的回答进行综合考量,同时支持多维度评估输出结果的质量指标。实验数据显示,该系统在提升信息检索的效率、优化整体处理过程中的能耗以及改善用户体验方面取得了显著成效。

该系统从给定查询中提取到一个或多个查询。其目的是通过修改或扩展原始查询来提升检索质量。一些已知的改进检索的方法包括多种提高搜索效果的策略。

  • 数据压缩(Data Compression)
  • 信息扩展(Information Expansion)
  • 语义推断改写(Semantic Inference Rewriting)
  • 错误引导(Error Guidance)

该技术涉及将文本内容转换为数值表示,并进一步了解相关信息,请访问以下链接:https://blog.langchain.dev/query-transformations/

该系统采用标准化的查询转换引擎(Standardized Query Transformer)进行数据处理。

DefaultQueryTransformer 被采用为 DefaultRetrievalAugmentor 中的默认实现。该组件无需对 Query 进行任何修改,而是直接传送给后续处理模块进行处理。

压缩查询转换器(Compression of Query Transformers)

该系统通过语言模型(LLM)将输入查询与对话历史压缩为一个独立的查询。这在用户可能提出涉及之前问题或答案中信息的后续问题时非常有用。

复制代码
    用户:告诉我关于 John Doe 的信息
    AI:John Doe 是……
    用户:他住在哪里?
    仅凭 “他住在哪里?” 这个查询本身无法检索到所需的信息,因为它没有明确提及 John Doe,不清楚 “他” 指代的是谁。
    当使用 CompressingQueryTransformer 时,LLM 将读取整个对话,并将 “他住在哪里?” 转换为 “John Doe 住在哪里?”。

该系统通过动态调整查询策略来显著提升搜索效率和结果的相关性。

该系统利用语言模型(LLM),生成多样化的查询版本。这种功能具有显著优势,在不同场景下能够灵活生成精确的搜索指令,并提升信息提取效率。

本部分内容包括若干个数学公式和数字

目前,该表征器主要局限于文本数据。然而,它可能扩展至包括但不限于图片、声音和视频等多种形式。通过输入特定关键词,内容检索器从基础数据库中提取相关信息。其来源范围十分广泛:例如文档、图像或视频等多种类型的数据。

  • 嵌入存储(Embedding Store)
  • 全文搜索引擎(Full-text Search Engine)
  • 向量和全文搜索的混合(Hybrid of Vector and Full-text Search)
  • Web 搜索引擎(Web Search Engine)
  • 知识图谱(Knowledge Graph)
  • SQL 数据库(SQL Database)
  • 等等

该系统返回的结果集将依据相关性高低进行排序。

内置于存储机制的内容检索工具(Content Searcher within the Storage Framework)

该系统利用嵌入模型(EmbeddingModel)对查询进行向量空间嵌入,并通过嵌入存储(EmbeddingStore)检索相关内容。

复制代码
    EmbeddingStore embeddingStore = ...; // 嵌入存储实例
    EmbeddingModel embeddingModel = ...; // 嵌入模型实例
    
    ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()
    .embeddingStore(embeddingStore)
    .embeddingModel(embeddingModel)
    .maxResults(3) // 最多返回 3 个结果
    .minScore(0.75) // 最小相似度分数为 0.75
    .filter(metadataKey("userId").isEqualTo("12345")) // 应用元数据过滤器
    .build();

Web 搜索内容检索器(Search Engine)

WebSearchContentRetriever 通过 Web 搜索引擎从网络上获取相关的内容。集成的支持可以在本处查询到。示例代码如下:

复制代码
    WebSearchEngine googleSearchEngine = GoogleCustomWebSearchEngine.builder()
    .apiKey(System.getenv("GOOGLE_API_KEY"))
    .csi(System.getenv("GOOGLE_SEARCH_ENGINE_ID"))
    .build();
    
    ContentRetriever contentRetriever = WebSearchContentRetriever.builder()
    .webSearchEngine(googleSearchEngine)
    .maxResults(3) // 最多返回 3 个结果
    .build();

SQL 数据库内容检索器(SQL Database Content Retriever)

SqlDatabaseContentRetriever是ContentRetriever的一个试验版本,归于langchain4j-experimental-sql模块。该组件基于DataSource和语言模型(LLM)技术实现以下功能:利用给定的自然语言查询生成并执行SQL语句。如需更详细的说明,请参考其Java文档。

Azure AI-Driven Content Retrieval System

AzureAiSearchContentRetriever 整合于 Azure AI 搜索功能中,并提供了多种搜索方式以及结果排序调整选项。它包含于该模块内,参考文档中的详细信息。

Neo4j 内容检索器(Neo4j Content Retriever)是一种基于异构关系型数据库的查询框架,支持异构图数据模型,并为复杂业务逻辑处理需求提供灵活的使用场景和极简高效的交互体验。该智能搜索引擎具备丰富的高级功能,包括超快响应时间和多种操作模式的支持,能够显著提升用户的数据分析效率。

该工具是与 Neo4j 图数据库集成的解决方案。它能够将自然语言查询转化为Neo4j的Cypher语句,并利用这些语句在Neo4j中进行信息检索。该工具位于langchain4j-neo4j模块内。

路由器查询功能(Router Query Functionality)

QueryRouter 通过特定的路由机制处理、引导或分配给最合适的 ContentRetriever。

在设置中,默认开启此路由器的网络访问控制(Default Query Router)

DefaultQueryRouter充当DefaultRetrievalAugmentor的核心组件,在该组件中负责将每个查询路由到所有配置的ContentRetriever,并通过精确匹配机制确保搜索结果与用户意图高度契合。

语言模型对路由器的访问(Language Model Query Router)

LanguageModelQueryRouter 采用语言模型(LLM)作为核心机制来负责分配处理相应的查询请求。

该种工具采用创新性的先进自然语言处理算法设计而成,能够实现对海量文本信息的快速筛选与整合;基于智能语义分析机制,该系统能有效识别并整合与目标内容高度相关的文本数据,并为用户提供便捷、高效的综合信息服务。

ContentAggregator主要负责将不同来源的查询结果与多套内容分类器提供的数据进行综合评估,并输出一个排序后的综合清单。

该系统采用默认内容聚合器进行整合与管理,默认内容聚合器作为核心组件被集成使用

DefaultContentAggregator 是 ContentAggregator 的标准实现,它采用了两阶段的互惠排名融合机制(Reciprocal Rank Fusion, RRF),基于互惠排名的融合过程包括两个步骤:首先对内容进行排序和评分;其次通过反馈机制优化最终结果。更多详细信息,请参阅 DefaultContentAggregator 的 JavaDoc 文档。

A System for Reordering Content Aggregators

该聚合器采用评分机制(例如Cohere)对内容进行再排序。可查阅此处以获取所有可用评分(重排)模型的详细信息。如需进一步了解相关内容,建议参考该聚合器的Java文档。这将帮助您获取所需的技术细节。

本资源旨在通过先进的内容注入技术...

ContentInjector 负责整合由 ContentAggregator 返回的内容至原始 UserMessage。

默认内容注入器(Default ContentInjector)
DefaultContentInjector 是 ContentInjector 的标准版本,其主要功能是将内容附加到 UserMessage 中,并以"Answer using the following information:" 作为前缀。

您可以通过以下三种方式进行内容注入的配置:

  1. 使用预设模板实现内容整合;
  2. 通过自定义规则控制信息呈现方式;
  3. 配置特定字段的内容填充策略。

注:此版本为基础功能,具体行为由其内部编码决定。

复制代码
    RetrievalAugmentor retrievalAugmentor = DefaultRetrievalAugmentor.builder()
    .contentInjector(DefaultContentInjector.builder()
        .promptTemplate(PromptTemplate.from("{{userMessage}}\n{{contents}}"))
        .build())
    .build();

请留意,PromptTemplate 必须包含{{userMessage}}和{{contents}}这两个变量。

增强DefaultContentInjector使其实现某一特定format的功能。开发一个自定义的ContentInjector。DefaultContentInjector还能够通过获取并处理某内容片段来注入相关元数据信息。

复制代码
    DefaultContentInjector.builder()
    .metadataKeysToInclude(List.of("source"))
    .build();

在这种情况下,调用TextSegment.text()函数会在返回的结果中附加带有“content:”前缀的信息,同时对每个元数据字段的值进行相应的前缀名称处理。最终生成的UserMessage将包括这些修改后的数据。

复制代码
    How can I cancel my reservation?
    
    Answer using the following information:
    content: To cancel a reservation, go to ...
    source: ./cancellation_procedure.html
    
    content: Cancellation is allowed for ...
    source: ./cancellation_policy.html

并行化(Parallelism)

当仅有一个查询以及相应的数据访问点时,默认的检索增强器 DefaultRetrievalAugmentor 会在单个线程内处理查询路由和数据获取。反之情况下,则会采用Executor来实现多线程处理以提升性能。在默认设置中,默认使用的将是优化过的空闲时间较短版本的执行队列(这里将KeepAliveTime设为1秒而非传统的60秒)。然而,如果需要自定义任务调度策略,你可以在DefaultRetrievalAugmentor构造函数中注入一个自定义的Executor实例。

复制代码
    DefaultRetrievalAugmentor.builder()
    ...
    .executor(executor)
    .build();

该算法通过一次函数的特性实现直线的几何表示,并明确地表达了直线方程的形式y = mx + b,其中变量m代表斜率,变量b为截距;此外,在多维空间中,该方法进一步扩展了这一关系式到更复杂的几何结构。对于二维平面中的点集\{ (x_i, y_i) \}_{i=1}^n和三维空间中的超平面集合\{ n_1 x + n_2 y + z = d \},算法均能够准确地进行分类任务的求解,并通过引入拉普拉斯正则项对模型进行了有效的正则化处理。

下面是一个完整的示例,展示了如何配置和使用 Advanced RAG:

复制代码
    // 创建嵌入存储和嵌入模型
    EmbeddingStore embeddingStore = new InMemoryEmbeddingStore<>();
    EmbeddingModel embeddingModel = new OpenAiEmbeddingModel("your-api-key", "text-embedding-ada-002");
    
    // 配置内容检索器
    ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()
    .embeddingStore(embeddingStore)
    .embeddingModel(embeddingModel)
    .maxResults(5)
    .minScore(0.75)
    .build();
    
    // 配置查询转换器
    QueryTransformer queryTransformer = new CompressingQueryTransformer(embeddingModel);
    
    // 配置查询路由器
    QueryRouter queryRouter = new LanguageModelQueryRouter(embeddingModel);
    
    // 配置内容聚合器
    ContentAggregator contentAggregator = new ReRankingContentAggregator();
    
    // 配置内容注入器
    ContentInjector contentInjector = DefaultContentInjector.builder()
    .promptTemplate(PromptTemplate.from("{{userMessage}}\n{{contents}}"))
    .build();
    
    // 创建检索增强器
    RetrievalAugmentor retrievalAugmentor = DefaultRetrievalAugmentor.builder()
    .queryTransformer(queryTransformer)
    .queryRouter(queryRouter)
    .contentRetriever(contentRetriever)
    .contentAggregator(contentAggregator)
    .contentInjector(contentInjector)
    .build();
    
    // 配置 AI 服务
    Assistant assistant = AiServices.builder(Assistant.class)
    .chatLanguageModel(model)
    .retrievalAugmentor(retrievalAugmentor)
    .build();
    
    // 使用 AI 服务
    String userMessage = "How to do Advanced RAG with LangChain4j?";
    String answer = assistant.chat(userMessage);
    
    System.out.println("Answer: " + answer);

归纳分析

基于模块化架构的高级检索增强系统(Advanced RAG)由五个关键组件构成(包括查询转换器、查询路由器、内容检索器、内容聚合器和内容注入器)。该系统通过灵活配置各组件能够显著提升其检索能力。每个组件都有明确的功能定位:查询转换器负责将用户输入转化为可搜索的形式,查询路由器则确保信息传递的高效性,而内容检索器则负责从大量数据中提取相关信息。同时,内容聚合器和内容注入器分别用于整合相关结果并最终输出高质量的回答。

这套LangChain开发智能体的系列文档《智能体开发方案》诚邀各位技术爱好者继续阅读

第1章:基于LangChain4j的对话与语言模型应用
第2章:利用LangChain4j构建聊天记忆机制
第3章:配置LangChain参数设置方法
第4章:实现响应式流的技术路径
第5章:调用AI服务功能指南
第6章:开发智能代理系统及客户支持示例
第7章:函数工具的调用与应用方法
第8章:RAG-1概述及其实现技术
第8章:易用性RAG(Easy RAG)的功能扩展
第8章:核心API功能解析与使用场景
第8章:基础RAG模型构建指南
第8章:高级RAG开发策略与实践
第9章:大模型结构化输出方法论
第9章:情感分析AI服务的结构化输出实现
第9章:数字提取服务的技术细节
第9章:时间信息解析与处理方案
第9章:基于大模型的POJO抽取技术路径
第10章:LangChain在企业智能助手开发中的综合应用实践

全部评论 (0)

还没有任何评论哟~