LangChain 与 Elastic 合作为 RAG 添加向量数据库和语义重排序

作者:来自 Elastic Max Jakob

在过去的一年中,我们看到了生成式人工智能领域的许多进展。许多新服务和库应运而生。LangChain 已成为使用大型语言模型 (LLM) 构建应用程序的最受欢迎的库,例如检索增强生成 (RAG) 系统。该库使原型设计和试验不同的模型和检索系统变得非常容易。

为了在 LangChain 中实现对 Elasticsearch 的一流支持,我们最近将我们的集成从社区包提升为官方 LangChain 合作伙伴包。这项工作使将 Elasticsearch 功能导入 LangChain 应用程序变得非常简单。Elastic 团队通过专用存储库管理代码和发布过程。我们将继续改进那里的 LangChain 集成,确保用户可以充分利用 Elasticsearch 的最新改进。

LangChain 联合创始人兼首席执行官 Harrison Chase 表示:“我们与 Elastic 在过去 12 个月的合作非常出色,特别是我们为开发人员和最终用户建立了更好的方式,从原型到生产构建 RAG 应用程序。”“LangChain-Elasticsearch 向量数据库集成将有助于实现这一目标,我们很高兴看到这种合作关系随着未来功能和集成版本的发布而不断发展。”

Elasticsearch 是最灵活、性能最高的检索系统之一,其中包括一个向量数据库。Elastic 的目标之一是成为最开放的检索系统。在像生成式人工智能这样快速发展的领域,我们希望在使用新兴工具和库时为开发人员提供支持。这就是我们与 LangChain 等库密切合作并为 GenAI 生态系统添加原生支持的原因。从使用 Elasticsearch 作为向量数据库到混合搜索和编排完整的 RAG 应用程序。

Elasticsearch 和 LangChain 今年密切合作。我们将利用我们在构建搜索工具方面的丰富经验,让你更轻松、更灵活地体验 LangChain。让我们在这篇博客中深入了解一下。

快速 RAG 原型设计

RAG 是一种为用户提供高度相关问题答案的技术。与直接使用 LLM 相比,其主要优势在于可以轻松集成用户数据,并可以最大限度地减少 LLM 的幻觉。这是通过添加为 LLM 提供相关上下文的文档检索步骤来实现的。

自成立以来,Elasticsearch 一直是相关文档检索的首选解决方案,并且一直是领先的创新者,提供多种检索策略。在将 Elasticsearch 集成到 LangChain 中时,我们可以轻松地在最常见的检索策略之间进行选择,例如密集向量、稀疏向量、关键字或混合。我们允许高级用户进一步定制这些策略。继续阅读以查看一些示例。(请注意,我们假设我们有一个 Elasticsearch 部署。)

LangChain 集成包

要使用 langchain-elasticsearch 合作伙伴包,你首先需要安装它:

pip install langchain-elasticsearch

然后,你可以从 langchain_elasticsearch 模块导入所需的类,例如 ElasticsearchStore,它为你提供了索引和搜索数据的简单方法。在此示例中,我们使用 Elastic 的稀疏向量模型 ELSER(必须先部署)作为我们的检索策略。

from langchain_elasticsearch import ElasticsearchStore

es_store = ElasticsearchStore(
    es_cloud_id="your-cloud-id",
    es_api_key="your-api-key",
    index_name="rag-example",
    strategy=ElasticsearchStore.SparseVectorRetrievalStrategy(model_id=".elser_model_2"),
),

一个简单的 RAG 应用程序

现在,让我们构建一个简单的 RAG 示例应用程序。首先,我们将一些示例文档添加到我们的 Elasticsearch 存储中。

texts = [
    "LangChain is a framework for developing applications powered by large language models (LLMs).",
    "Elasticsearch is a distributed, RESTful search and analytics engine capable of addressing a growing number of use cases.",
    ...
]
es_store.add_texts(texts)

接下来,我们定义 LLM。在这里,我们使用 OpenAI 提供的默认 gpt-3.5-turbo 模型,该模型也为 ChatGPT 提供支持。

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(api_key="sk-...") # or set the OPENAI_API_KEY environment variable

现在我们已准备好将 RAG 系统整合在一起。为简单起见,我们采用标准提示来指导 LLM。我们还将 Elasticsearch 存储转换为 LangChain 检索器。最后,我们将检索步骤与将文档添加到提示并将其发送到 LLM 链接在一起。

from langchain import hub
from langchain_core.runnables import RunnablePassthrough

prompt = hub.pull("rlm/rag-prompt")  # standard prompt from LangChain hub

retriever = es_store.as_retriever()

def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

通过这几行代码,我们现在已经有了一个简单的 RAG 系统。用户现在可以针对数据提出问题:

rag_chain.invoke("Which frameworks can help me build LLM apps?")
"LangChain is a framework specifically designed for building LLM-powered applications. ..."

就这么简单。我们的 RAG 系统现在可以回复有关 LangChain 的信息,而 ChatGPT(3.5 版)则无法做到这一点。当然,有很多方法可以改进这个系统。其中之一就是优化我们检索文档的方式。

通过 Retriever 实现完全的检索灵活性

Elasticsearch 存储提供开箱即用的常见检索策略,开发人员可以自由尝试最适合特定用例的策略。但是,如果你的数据模型比仅包含单个字段的文本更复杂,该怎么办?例如,如果你的索引设置包括一个网络爬虫,该爬虫会生成包含文本、标题、URL 和标签的文档,并且所有这些字段对于搜索都很重要,该怎么办?Elasticsearch 的 Query DSL 让用户可以完全控制如何搜索他们的数据。而在 LangChain 中,ElasticsearchRetriever 直接实现了这种完全的灵活性。所需的只是定义一个将用户输入查询映射到 Elasticsearch 请求的函数。

假设我们想在检索步骤中添加语义重新排名功能(semantic reranking)。通过添加 Cohere 重新排名步骤,顶部的结果会变得更加相关,而无需额外的手动调整。为此,我们定义了一个 Retriever,它接受一个返回相应查询 DSL 结构的函数。

def text_similarity_reranking(search_query: str) -> Dict:
    return {
        "retriever": {
            "text_similarity_rank": {
                "retriever": {
                    "semantic": {
                        "query": {
                            "match": {
                                "text_field": search_query
                            }
                        }
                    }
                },
                "field": "text_field",
                "inference_id": "cohere-rerank-service",
                "inference_text": search_query,
                "window_size": 10
            }
        }
    }

retriever = ElasticsearchRetriever.from_es_params(
    es_cloud_id="your-cloud-id",
    es_api_key="your-api-key",
    index_name="rag-example",
    content_field=text_field,
    body_func=text_similarity_reranking,
)

(请注意,相似性重新排序的查询结构仍在最终确定中。)

此检索器可以无缝插入上面的 RAG 代码。结果是我们的 RAG 管道的检索部分更加准确,从而导致更多相关文档被转发到 LLM,最重要的是,导致更多相关答案。

结论

Elastic 对 LangChain 生态系统的持续投资为最受欢迎的 GenAI 库之一带来了最新的检索创新。通过此次合作,Elastic 和 LangChain 使开发人员能够快速轻松地为最终用户构建 RAG 解决方案,同时提供必要的灵活性以深入调整结果质量。

准备好自己尝试了吗?开始免费试用。
希望将 RAG 构建到你的应用程序中?想要使用向量数据库尝试不同的 LLM?
在 Github 上查看我们针对 LangChain、Cohere 等的示例笔记本,并立即加入 Elasticsearch Relevance Engine 培训。

原文:LangChain and Elastic collaborate to add vector database and semantic reranking for RAG — Elastic Search Labs

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

blender bpy将顶点颜色转换为UV纹理vertex color to texture

一、关于环境 安装blender的bpy,不需要额外再安装blender软件。在python控制台中直接输入pip install bpy即可。 二、关于代码 本文所给出代码仅为参考,禁止转载和引用,仅供个人学习。 本文所给出的例子是https://download.csdn.net/downl…

iOS界面设计要点:四大模块解析

UI设计不是艺术设计,这限制了我们从设备和现有技术开始设计。因此,熟悉每个平台的设计规则已经成为每个设计师的第一课,也是每个设计师必要的专业知识。 今天小边给您带来了iOS设计规范,希望帮助您快速熟悉iOS平台设计规范&#…

搜索与图论:染色法判别二分图

搜索与图论&#xff1a;染色法判别二分图 题目描述参考代码 题目描述 输入样例 4 4 1 3 1 4 2 3 2 4输出样例 Yes参考代码 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 100010, M 200010;int n, m; i…

JAVA小知识16:JAVA常用的API

一、Math 方法名说明public static int abs(int a)获取参数绝对值public static double ceil(double a)向上取整public static double floor(double a)向下取整public static int round(float a)四舍五入public static int max(int a,int b)获取两个int值中的较大值public s…

基于springboot实现车辆管理系统项目【项目源码+论文说明】

基于springboot实现车辆管理系统演示 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前企业对于车辆信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以…

Turbo Console Log自定义配置

写log太麻烦了&#xff1f;可以用下vscode中的Turbo Console Log的插件 因为vscode的其他快捷键可能会和这个插件产生冲突&#xff0c;所以可以从这里设置自定义不重复的快捷键。我这里用的shiftaltG用来生成log 我用的是显示第多少行和路径名 效果&#xff1a; 还有其他的…

Atlas基于云器Lakehouse升级数据平台,实现业务效率与平台稳定性的双重提升

导读 Atlas 是一家富有创新精神的新加坡旅游科技初创公司&#xff0c;由连续创业企业家 Mary 及其团队于 2019 年底成立。公司利用互联网技术高效聚合和分发全球廉价航空公司的特价机票&#xff0c;服务于全球旅游业生态系统。技术部门需要与包括航空公司、在线旅行社&#xf…

深度神经网络——语音识别技术的探索与应用

概述 论文地址&#xff1a;https://arxiv.org/pdf/2402.19443.pdf 使用深度学习的语音识别技术已取得重大进展。这使得语音识别系统更加准确。然而&#xff0c;这项技术非常复杂&#xff0c;很难理解哪些信息用于何处。因此&#xff0c;本文提出了一种识别语音识别系统中哪些信…

pycharm基本使用(常用快捷键)

0.下载 pycharm官网下载 选择合适的版本&#xff0c;本文以2024.1为例 1.简单应用 常用快捷键 ctrlD 复制当前行 ctrlY 删除当前行 ctrlX 剪切当前行&#xff08;可用作删除&#xff0c;更顺手&#xff09; shift↑ 选中多行ctrlshiftF10 运行 shiftF9 调试ctrl/ 注释当前…

土壤墒情监测站

TH-TS400随着全球气候变化的加剧&#xff0c;干旱成为影响农业生产的重要因素之一。在我国广大农田中&#xff0c;干旱现象时有发生&#xff0c;严重制约了农作物的正常生长和产量的稳定。为了有效应对这一问题&#xff0c;土壤墒情监测站应运而生&#xff0c;成为农田土地干旱…

C# WPF入门学习番外篇(二) —— C# WPF使用数据库创建注册登录界面

C# WPF入门学习番外篇&#xff08;二&#xff09; —— C# WPF使用数据库创建注册登录界面 在这篇番外篇博客中&#xff0c;我们将介绍如何在C# WPF应用程序中使用数据库来创建一个简单的注册和登录界面。通过本教程&#xff0c;你将学习到如何在WPF中与数据库进行交互&#xf…

车载网络安全指南 概述(一)

返回总目录->返回总目录<- 目录 前言 参考文档 术语 前言 汽车电子系统网络安全指南给出汽车电子系统网络安全活动框架,以及在此框架下的汽车电子系统网络安全活动、组织管理和支持保障等方面的建议。 汽车电子系统网络安全指南适用于指导整车厂、零部件供应商、软…

Rust基础学习-ModulesPackage

在Rust中&#xff0c;模块有助于将程序分割成逻辑单元&#xff0c;以提高可读性和组织性。一旦程序变得更大&#xff0c;将其拆分为多个文件或命名空间非常重要。 模块有助于构建我们的程序。模块是项目的集合&#xff1a;包括函数、结构体甚至其他模块。 Module 定义模块 在…

手撕设计模式——计划生育之单例模式

1.业务需求 ​ 大家好&#xff0c;我是菠菜啊。80、90后还记得计划生育这个国策吗&#xff1f;估计同龄的小伙伴们&#xff0c;小时候常常被”只生一个好“”少生、优生“等宣传标语洗脑&#xff0c;如今国家已经放开并鼓励生育了。话说回来&#xff0c;现实生活中有计划生育&…

SqlSugar使用DbFirst对象根据数据库表结构创建实体类-C#

本文所述开发环境&#xff1a;.C#、NET8、Visual Studio2022 1. 在项目中安装SqlSugar 在Visual Studio2022中新建一个 C# 的控制台应用程序&#xff0c;框架选择 .Net8。新建后如下图所示&#xff1a; 然后打开NuGet程序包管理器 搜索 SqlSugarCore 并安装 安装后在解决方案…

资源分享—2021版市级制图规范符号库

汇总整理超图平台软件相关的各类资源&#xff08;包括但不限于符号库、地图模板、地理处理模型等&#xff09;&#xff0c;助力项目的高效制图、提高数据生产效率等业务。 本次分享新版国土空间规划【2021版市级制图规范符号库】&#xff0c;提供SuperMap格式符号库下载。 1.市…

数据结构的队列,链表,栈的基础操作

1&#xff1a;队列 #include <stdio.h>#include <stdlib.h>#include "./02队列.h"/** function: 创建一个空的队列* param [ in] * param [out] * return */Sequeue* xinduilie(){Sequeue* sq (Sequeue*)malloc(sizeof(Sequeue)); if(N…

Java 反射机制 -- Java 语言反射的概述、核心类与高级应用

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 010 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自…

镜像拉取失败:[ERROR] Failed to pull docker image

问题描述 执行 bash docker/scripts/dev_start.sh 命令提示错误&#xff1a; permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post “http://%2Fvar%2Frun%2Fdocker.sock/v1.45/images/create?fromImageregistry.b…

在Lua解释器中注册自定义函数

本文目录 1、引言2、函数注册2.1注册原理 2.2 注册函数 3、实操3.1 编写注册函数3.2编写测试代码 4、结论 文章对应视频教程&#xff1a; 暂无&#xff0c;可以关注我的B站账号等待更新。 点击图片或链接访问我的B站主页~~~ 1、引言 在之前的博客中&#xff0c;已经介绍了如何…