LangChain4j-RAG高级-检索增强器

Retrieval Augmentor 检索增强器

RetrievalAugmentor 是 RAG 管道的入口点。它负责使用从各种来源检索的相关 Content 来扩充 ChatMessage

可以在创建 AiService 期间指定 RetrievalAugmentor 的实例:

Assistant assistant = AiServices.builder(Assistant.class)....retrievalAugmentor(retrievalAugmentor).build();

每次调用 AiService 时,都会调用指定的 RetrievalAugmentor 来扩充当前的 UserMessage

可以使用LangChain4j中提供的 RetrievalAugmentor 的默认实现(DefaultRetrievalAugmentor) 或 实现自定义实现。

Default Retrieval Augmentor 默认检索增强器

LangChain4j 提供了RetrievalAugmentor接口的现成实现: DefaultRetrievalAugmentor ,它应该适合大多数 RAG 用例。

官方使用示例:

public class _04_Advanced_RAG_with_Metadata_Example {/*** Please refer to {@link Naive_RAG_Example} for a basic context.* <p>* Advanced RAG in LangChain4j is described here: https://github.com/langchain4j/langchain4j/pull/538* <p>* This example illustrates how to include document source and other metadata into the LLM prompt.*/public static void main(String[] args) {Assistant assistant = createAssistant("documents/miles-of-smiles-terms-of-use.txt");// Ask "What is the name of the file where cancellation policy is defined?".// Observe how "file_name" metadata entry was injected into the prompt.startConversationWith(assistant);}private static Assistant createAssistant(String documentPath) {Document document = loadDocument(toPath(documentPath), new TextDocumentParser());EmbeddingModel embeddingModel = new BgeSmallEnV15QuantizedEmbeddingModel();EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder().documentSplitter(DocumentSplitters.recursive(300, 0)).embeddingModel(embeddingModel).embeddingStore(embeddingStore).build();ingestor.ingest(document);ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder().embeddingStore(embeddingStore).embeddingModel(embeddingModel).build();// Each retrieved segment should include "file_name" and "index" metadata values in the promptContentInjector contentInjector = DefaultContentInjector.builder()// .promptTemplate(...) // Formatting can also be changed.metadataKeysToInclude(asList("file_name", "index")).build();RetrievalAugmentor retrievalAugmentor = DefaultRetrievalAugmentor.builder().contentRetriever(contentRetriever).contentInjector(contentInjector).build();ChatLanguageModel chatLanguageModel = OpenAiChatModel.builder().apiKey(OPENAI_API_KEY).baseUrl(OPENAI_API_URL).logRequests(true).build();return AiServices.builder(Assistant.class).chatLanguageModel(chatLanguageModel).retrievalAugmentor(retrievalAugmentor).chatMemory(MessageWindowChatMemory.withMaxMessages(10)).build();}
}

源码逻辑梳理:

  • 用户在定义AiService的时候需要设置是否需要检索增强器
  • 在触发AiService的调用的时候会在invoke()函数中检查是否有添加RetrievalAugmentor增强器
  • 如果有则会调用context.retrievalAugmentor.augment(augmentationRequest)Query进行处理:

  • augment()方法中使用的QueryTransformer有三种实现类:
    • DefaultQueryTransformer: 默认的转换器,不会对Query做任何处理,而是封装成集合后返回。
    • ExpandingQueryTransformer: 扩展转换器,对Query进行措辞的修改和拆分为多个(默认3个)具体的Query,达到增强效果。
    • CompressingQueryTransformer压缩转换器,根据提供的历史聊天和当前提问内容,LLM理解后会给出更精确的提问。

Query

Query表示 RAG 管道中的用户查询。它包含查询文本和查询元数据。

Query Metadata 查询元数据

Query中的Metadata包含可能对 RAG 管道的各个组件有用的信息,例如:

  • Metadata.userMessage() - 应该增强的原始UserMessage
  • Metadata.chatMemoryId() - @MemoryId注释的方法参数的值。这可用于识别用户并在检索期间应用访问限制或过滤器。
  • Metadata.chatMemory() - 所有历史的ChatMessages 。这可以帮助理解提出Query的上下文。

Query Transformer 查询转换

QueryTransformer将给定的Query转换为一个或多个Query 。目标是通过修改扩展原始Query来提高检索质量。

一些已知的改进检索的方法包括:

  • Query compression 查询压缩
  • Query expansion 查询扩展
  • Query re-writing 查询重写
  • Step-back prompting 后退提示
  • Hypothetical document embeddings (HyDE) 假设文档嵌入

Content

Content表示与用户Query相关的内容。目前,它仅限于文本内容(即TextSegment ),但将来它可能支持其他模式(例如,图像、音频、视频等)。

Content Retriever 内容检索

ContentRetriever使用给定的Query从底层数据源检索Content 。底层数据源几乎可以是任何东西:

  • Embedding store 陷入存储
  • Full-text search engine 全文搜索引擎
  • Hybrid of vector and full-text search 矢量和全文搜索的混合
  • Web Search Engine 网络搜索引擎
  • Knowledge graph 知识图谱
  • SQL database SQL数据库

Embedding Store Content Retriever 嵌入存入内容检索

EmbeddingStoreContentRetriever使用EmbeddingModel来嵌入QueryEmbeddingStore检索相关Content

使用示例:

EmbeddingStore embeddingStore = ...
EmbeddingModel embeddingModel = ...ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder().embeddingStore(embeddingStore).embeddingModel(embeddingModel).maxResults(3)// maxResults can also be specified dynamically depending on the query.dynamicMaxResults(query -> 3).minScore(0.75)// minScore can also be specified dynamically depending on the query.dynamicMinScore(query -> 0.75).filter(metadataKey("userId").isEqualTo("12345"))// filter can also be specified dynamically depending on the query.dynamicFilter(query -> {String userId = getUserId(query.metadata().chatMemoryId());return metadataKey("userId").isEqualTo(userId);}).build();

Web Search Content Retriever 网络搜索内容

WebSearchContentRetriever使用WebSearchEngine从网络检索相关Content

目前WebSearchEngine接口有 2 个实现:

  • langchain4j-web-search-engine-google-custom模块中的GoogleCustomWebSearchEngine
  • langchain4j-web-search-engine-tavily模块中的TavilyWebSearchEngine

使用示例:

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

SQL Database Content Retriever SQL数据库内容检索

SqlDatabaseContentRetrieverContentRetriever实验性实现,可以在langchain4j-experimental-sql模块中找到。后续可能会删除或改动较大,所以并不推荐直接使用到生产。

它使用DataSourceLLM为给定的自然语言Query生成并执行 SQL 查询。

使用示例:

public class _10_Advanced_RAG_SQL_Database_Retreiver_Example {/*** Please refer to {@link Naive_RAG_Example} for a basic context.* <p>* Advanced RAG in LangChain4j is described here: https://github.com/langchain4j/langchain4j/pull/538* <p>* This example demonstrates how to use SQL database content retriever.* <p>* WARNING! Although fun and exciting, {@link SqlDatabaseContentRetriever} is dangerous to use!* Do not ever use it in production! The database user must have very limited READ-ONLY permissions!* Although the generated SQL is somewhat validated (to ensure that the SQL is a SELECT statement),* there is no guarantee that it is harmless. Use it at your own risk!* <p>* In this example we will use an in-memory H2 database with 3 tables: customers, products and orders.* See "resources/sql" directory for more details.* <p>* This example requires "langchain4j-experimental-sql" dependency.*/public static void main(String[] args) {Assistant assistant = createAssistant();// You can ask questions such as "How many customers do we have?" and "What is our top seller?".startConversationWith(assistant);}private static Assistant createAssistant() {DataSource dataSource = createDataSource();ChatLanguageModel chatLanguageModel = OpenAiChatModel.withApiKey(OPENAI_API_KEY);ContentRetriever contentRetriever = SqlDatabaseContentRetriever.builder().dataSource(dataSource).chatLanguageModel(chatLanguageModel).build();return AiServices.builder(Assistant.class).chatLanguageModel(chatLanguageModel).contentRetriever(contentRetriever).chatMemory(MessageWindowChatMemory.withMaxMessages(10)).build();}private static DataSource createDataSource() {JdbcDataSource dataSource = new JdbcDataSource();dataSource.setURL("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1");dataSource.setUser("sa");dataSource.setPassword("sa");String createTablesScript = read("sql/create_tables.sql");execute(createTablesScript, dataSource);String prefillTablesScript = read("sql/prefill_tables.sql");execute(prefillTablesScript, dataSource);return dataSource;}private static String read(String path) {try {return new String(Files.readAllBytes(toPath(path)));} catch (IOException e) {throw new RuntimeException(e);}}private static void execute(String sql, DataSource dataSource) {try (Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement()) {for (String sqlStatement : sql.split(";")) {statement.execute(sqlStatement.trim());}} catch (SQLException e) {throw new RuntimeException(e);}}
}

Azure AI Search Content Retriever Azure AI 搜索内容检索

AzureAiSearchContentRetriever可以在langchain4j-azure-ai-search模块中找到。

Neo4j Content Retriever Neo4j 内容检索

Neo4jContentRetriever可以在langchain4j-neo4j模块中找到。

Query Router 查询路由

QueryRouter负责将Query路由到适当的ContentRetriever

Default Query Router 默认查询路由

DefaultQueryRouterDefaultRetrievalAugmentor中使用的默认实现。它将每个Query路由到所有配置的ContentRetriever

Language Model Query Router 大语言模型查询路由

LanguageModelQueryRouter使用LLM决定将给定的Query路由到何处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索大型语言模型LLama 2:原理揭秘与代码实践

一、引言 1.1 大型语言模型的重要性 大型语言模型作为人工智能领域的重要研究方向&#xff0c;近年来取得了显著的成果。这些模型在自然语言处理、机器翻译、对话系统、文本生成等领域展现了强大的能力&#xff0c;为人类带来了诸多便利。大型语言模型的出现&#xff0c;使得…

初识git工具~~上传代码到gitee仓库的方法

目录 1.背景~~其安装 2.gitee介绍 2.1新建仓库 2.2进行相关配置 3.拉取仓库 4.服务器操作 4.1克隆操作 4.2查看本地仓库 4.3代码拖到本地仓库 4.4关于git三板斧介绍 4.4.1add操作 4.4.2commit操作 4.4.3push操作 5.一些其他说明 5.1.ignore说明 5.2git log命令 …

视频主题Qinmei 3.0视频站源码_WordPress影视视频主题/附详细安装教程

Qinmei 3.0主题主要是将 wordpress 改造成纯 api 的站点&#xff0c;以便实现前后端分离的技术栈&#xff0c;目前的进度已经大致完成&#xff0c;唯一的问题就是需要安装 JWT token 插件。 功能介绍&#xff1a; 支持豆瓣以及 bangumi 的一键获取信息, 豆瓣 api 目前使用的是…

【Node.js基础05】包的理解与使用

一&#xff1a;包的理解与简介 1 什么是包 包是一个将模块、代码、以及其他资料聚合成的文件夹 2 包的分类 项目包&#xff1a;编写项目代码的文件夹 软件包&#xff1a;封装工具和方法供开发者使用 3 为什么要在软件包中编写package.json文件 记录包的清单信息 二&…

Matlab arrayfun 与 bsxfun——提高编程效率的利器!

许多人知道 MATLAB 向量化编程&#xff0c;少用 for 循环 可以提高代码运行效率&#xff0c;但关于代码紧凑化编程&#xff0c; arrayfun 与 bsxfun 两个重要函数却鲜有人能够用好&#xff0c;今天针对这两个函数举例说明其威力。 Matlab arrayfun 概述 arrayfun 是 Matlab …

力扣SQL 最后一个能进入巴士的人 自连接

Problem: 1204. 最后一个能进入巴士的人 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考题解 复杂度 时间复杂度: O ( ∗ ) O(*) O(∗)空间复杂度: O ( ∗ ) O(*) O(∗) Code select a.person_name from queue a,queue b where a.turn > b.turn -…

[极客大挑战 2019]PHP1

打开靶机 提示有备份&#xff0c;可以用工具扫描&#xff0c;我还没有配置好环境&#xff0c;搜了一下其他师傅的&#xff1a;备份的地址在这&#xff1a; /www.zip 下载后得到这几个文件&#xff1a; index.php就是上面打开的网页&#xff0c;其中有一段php代码&#xff1a;…

谷粒商城实战笔记-72-商品服务-API-属性分组-获取分类属性分组

文章目录 一&#xff0c;后端接口开发Controller层修改接口接口测试 二&#xff0c;前端开发 这一节的内容是开发获取分类属性分组的接口。 一&#xff0c;后端接口开发 Controller层修改接口 修改AttrGroupController接口。 RequestMapping("/list/{catelogId}")p…

ROS getting started

文章目录 前言一、认识ROS提供的命令行工具nodestopicsservicesparametersactionsrqt_console, rqt_graph批量启动多个节点recorde and playc基础pub-sub 1.5 ROS2和fastdds1 改变订阅模式2 xml配置3 指定xml位置4 talker/listener通过发现服务器发送topic5 ros2 检视6 远程fas…

Docker容器的数据管理

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 我们在使用Docker的过程中&#xff0c;往往需要能查看容器内应用产生的数据&#xff0c;或者需要把容器内的数据进行备份&#x…

信创终端操作系统上vmware的命令行操作

原文链接&#xff1a;信创终端操作系统上vmware的命令行操作 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在信创终端操作系统上使用命令行操作VMware的文章。通过命令行管理VMware虚拟机可以提高效率&#xff0c;特别是在需要批量操作或自动化管理时。本文将…

VS2022创建C C++ GTEST工程

原因 需要对带代码进行单元测试&#xff0c;选择在Visual studio 中使用GTEST 框架。 实施 创建一个常规的控制台可执行程序。然后使用NUGET安装包 安装GTEST 头文件和动态库&#xff0c;同时安装GTEST ADAPTER。 安装可能提示找不到包源&#xff0c;此时需要根据提示配置一…

如何使用API快速打造健康医疗系统?

在数字医疗市场&#xff0c;数据是人们经常谈及的一个话题。当前&#xff0c;消费者医疗和健康应用收集的数据越来越多&#xff0c;电子健康记录的实施也创造出了大量有关病人的电子信息。 API接口在智慧医院跨网、跨机构之间的业务协同和数据共享交换中得到数据共享。支撑了医…

Redis从入门到超神-(十二)Redis监听Key的过期事件

前言 试想一个业务场景&#xff0c;订单超过30分钟未支付需要做自动关单处理,修改订单状态&#xff0c;库存回退等&#xff0c;你怎么实现&#xff1f;方案一&#xff1a;可以使用定时任务扫表&#xff0c;通过支付状态和下单时间来判断是否支付过期。但是这样的方案是非常消耗…

C#使用Clipper2进行多边形合并、相交、相减、异或的示例

Clipper2库介绍 开源库介绍&#xff1a; Clipper2在Github上的地址&#xff1a;https://github.com/AngusJohnson/Clipper2 Clipper2库对简单和复杂多边形执行交集&#xff08;Intersection&#xff09;、并集&#xff08;Union&#xff09;、差分&#xff08;Difference&…

protobuf编译之后找不到isStringEmpty方法

原因: 与mysql的jar包冲突了 解决办法&#xff1a; 在MySQL中排除proto-java <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.22</version><scope>runtime</scope>&l…

Webpack 从入门到精通

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、Webpack 简介 二、Webpack 的核心概念 三、Webpack 的安装与配置 安装 Node.js 安装 Webpack 初始…

戴着苹果Vision Pro,如何吃花生米

6月底苹果Vision Pro国内开售&#xff0c;我早早到官网预订了一台。选择必要的配件&#xff0c;输入视力信息&#xff0c;定制符合自己视力的蔡司镜片。确实贵。把主要配件和镜片配齐&#xff0c;要3万6&#xff0c;比Pico、META的眼镜贵一个数量级。 Vision Pro出来后&#x…

Springboot集成Elasticsearch High Level REST Client实现增删改查实战

获取源码&#x1f6a9; 需要完整代码资料&#xff0c;请一键三连后评论区留下邮箱&#xff0c;安排发送&#xff01;&#xff01;&#xff01;&#x1f916; 什么是High Level REST Client&#xff1f; Elasticsearch 的 High Level REST Client 是一个用于与 Elasticsearch…

ARCGIS PRO DSK GraphicsLayer创建文本要素

一、判断GraphicsLayer层【地块注记】是否存在&#xff0c;如果不存在则新建、如果存在则删除所有要素 Dim GraphicsLayer pmap.GetLayersAsFlattenedList().OfType(Of ArcGIS.Desktop.Mapping.GraphicsLayer).FirstOrDefault() 获取当前map对象中的GetLayer图层 Await Queue…