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命令 …

ElementPlus轮播图-Vue3

注意&#xff1a;安装时建议使用手机热点&#xff0c;wifi不稳定&#xff0c;会出现执行不成功的现象。 安装 使用包管理器 # 选择一个你喜欢的包管理器# NPM npm install element-plus --save# Yarn yarn add element-plus# pnpm pnpm install element-plus引入配置 完整引…

视频主题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文件 记录包的清单信息 二&…

NSIS打包脚本第二篇

NSIS打包脚本 NSIS打包脚本第一篇 字符串提取过滤 WordFind 使用方法 ${WordFind} "[string]" "[delimiter]" "[E][options]" $varoption解读 +1和+01一样,代表分割后的第一个字符串 +表示从左往右,-表示从右向左 +2}} 表示从左到右,前2…

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

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

第五十天 第十一章:图论part01 图论理论基础 深搜理论基础 98. 所有可达路径 广搜理论基础

图论理论基础 了解邻接矩阵(*)&#xff0c;度&#xff0c;邻接表&#xff08;数组链表&#xff09;等 遍历顺序&#xff1a;深搜加广搜 深搜理论基础 dfs是可一个方向去搜&#xff0c;不到黄河不回头&#xff0c;直到遇到绝境了&#xff0c;搜不下去了&#xff0c…

力扣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 -…

Java代理模式详细

Java代理模式详细 一、引言 代理模式&#xff08;Proxy Pattern&#xff09;是一种常用的设计模式&#xff0c;它为其他对象提供一种代理以控制对这个对象的访问。在Java中&#xff0c;代理模式可以分为静态代理和动态代理两种。本文将详细介绍代理模式的概念、实现方式以及应…

[极客大挑战 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…

Redis zset 共享对象

前言 本文介绍 Redis 中 skiplist 编码的 zset 对象是如何共享对象的。 skiplist 编码的 zset 对象为了同时支持高效的点查询和范围查询&#xff0c;内部使用了跳表和哈希表。倘若将每个插入的元素都拷贝两份&#xff0c;分别插入跳表和哈希表&#xff0c;将浪费大量的内存&a…

Unity 骨骼动画(Skinned Mesh Renderer): 角色动画的高级渲染

在Unity中&#xff0c;骨骼动画(Skinned Mesh Renderer)是一种用于高级角色动画渲染的组件。它允许开发者将复杂的3D模型和动画应用到游戏角色上&#xff0c;实现逼真的视觉效果。本文将探讨Skinned Mesh Renderer的基本概念、使用方法以及如何优化性能。 Skinned Mesh Render…

Docker容器的数据管理

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

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

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

Python脚本批量将md文件转化成pdf

自己学编程时做了很多笔记&#xff0c;如今累积起来已经有几十个了&#xff0c;有很多图片链&#xff0c;怕哪天图床垮了图片就找不到了&#xff0c;于是就想把当时的 md 文件都转成 pdf 。 看了点文章&#xff0c;就开始实践&#xff1a; 1.下载 pandoc 和 CTex 2.ChatGpt …

VS2022创建C C++ GTEST工程

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

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

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