AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


LangChain与Elasticsearch向量数据库的完美结合
发布日期:2024-08-29 06:28:27 浏览次数: 1799 来源:NLP轻松谈


在过去的一年中,生成式 AI (Generative AI) 领域取得了显著的进展。许多新的服务和工具应运而生。其中,LangChain 已成为构建大语言模型 (LLM) 应用程序(例如检索增强生成 (RAG) 系统)最受欢迎的框架之一。该框架极大地简化了原型开发,并使开发者能够轻松实验不同的模型和检索系统。

最近Elasticsearch将其集成从社区包升级为官方的 LangChain 合作伙伴包。这一升级使得在 LangChain 应用程序中引入 Elasticsearch 功能变得更加简便。Elastic 团队通过专门的代码库管理代码和发布过程。

Elasticsearch 是目前最灵活且性能卓越的检索系统之一,具备可扩展的数据存储和向量数据库功能。Elastic 的一个重要目标是成为最开放的检索系统。Elasticsearch与 LangChain 等库紧密合作,并为生成式 AI 生态系统添加了原生支持功能,从将 Elasticsearch 作为向量数据库,到实现混合搜索,再到协调完整的 RAG 应用程序。

使用 Elasticsearch 和 LangChain 快速构建 RAG 系统

RAG 是一种为用户提供非常相关答案的技术。相比直接使用大语言模型 (LLM),它的主要优点在于可以轻松集成用户数据,并且能够最大程度地降低 LLM 出现错误信息的风险。这是通过增加一个文档检索步骤来实现的,该步骤为 LLM 提供相关的上下文信息。

Elasticsearch 一直是进行相关文档检索的首选解决方案,并且持续引领创新,提供多种检索策略。在将 Elasticsearch 集成到 LangChain 时,我们使用户能够轻松选择最常见的检索策略,比如密集向量、稀疏向量、关键字检索或混合检索。同时,也允许高级用户进一步自定义这些策略。

构建一个简单的 RAG 应用程序

按如下方式安装包pip install langchain-elasticsearch;然后,我们将一些示例文档添加到我们的 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)

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

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

采用一个标准提示来指示LLM。将 Elasticsearch转换为 LangChain 检索器。最后,我们将检索步骤与将文档添加到提示符并将其发送到 LLM.

from langchain import hubfrom 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_chain.invoke("Which frameworks can help me build LLM apps?")

LangChain 和 Elasticsearch 检索器

Elasticsearch 存储提供了现成的常见检索策略,开发者可以自由探索最适合特定场景的方案。但如果数据模型比单一字段的文本更复杂呢?例如,如果索引包含了一个网络爬虫生成的文档,这些文档包含文本、标题、URL 和标签等多个字段,而所有这些字段都对搜索至关重要,应该如何处理?Elasticsearch 的查询 DSL (Query DSL) 为用户提供了完全的搜索数据灵活性。在 LangChain 中,ElasticsearchRetriever 可以直接实现这种灵活性。只需定义一个函数,将用户输入的查询映射到 Elasticsearch 请求即可。

假设我们想在检索步骤中添加语义重新排序功能。通过增加 Cohere 重新排序步骤,排在前面的结果将变得更加相关,而无需额外的手动调整。为此,让我们定义了一个 Retriever,它接收一个返回对应 Query DSL 结构的函数。

def text_similarity_reranking(search_query: str) -> Dict:return {"retriever": {"text_similarity_reranker": {"retriever": {"standard": {"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 生态系统的持续投入,将最新的检索创新融入了这个最受欢迎的生成式 AI (GenAI) 库之一。通过此次合作,Elastic 和 LangChain 让开发者能够快速、轻松地为用户构建 RAG 解决方案,同时提供了对结果质量进行深入调整的灵活性。


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询