当前位置:   article > 正文

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

langchain es

前言

在过去的一年中,我们看到了生成式人工智能领域的许多进展。许多新服务和库应运而生。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 中时,我们可以轻松地在最常见的检索策略之间进行选择,例如密集向量、稀疏向量、关键字或混合。我们允许高级用户进一步定制这些策略。继续阅读以查看一些示例。

LangChain 集成包

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

pip install langchain-elasticsearch

  • 1
  • 2

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



1.  from langchain_elasticsearch import ElasticsearchStore

3.  es_store = ElasticsearchStore(
4.      es_cloud_id="your-cloud-id",
5.      es_api_key="your-api-key",
6.      index_,
7.      strategy=ElasticsearchStore.SparseVectorRetrievalStrategy(model_id=".elser_model_2"),
8.  ),



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

一个简单的 RAG 应用程序

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



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



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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



1.  from langchain_openai import ChatOpenAI

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



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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



1.  from langchain import hub
2.  from langchain_core.runnables import RunnablePassthrough

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

6.  retriever = es_store.as_retriever()

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

11.  rag_chain = (
12.      {"context": retriever | format_docs, "question": RunnablePassthrough()}
13.      | prompt
14.      | llm
15.      | StrOutputParser()
16.  )



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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

rag_chain.invoke("Which frameworks can help me build LLM apps?") 

  • 1
  • 2
"LangChain is a framework specifically designed for building LLM-powered applications. ..." 

  • 1
  • 2

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

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

Elasticsearch 存储提供开箱即用的常见检索策略,开发人员可以自由尝试最适合特定用例的策略。但是,如果你的数据模型比仅包含单个字段的文本更复杂,该怎么办?例如,如果你的索引设置包括一个网络爬虫,该爬虫会生成包含文本、标题、URL 和标签的文档,并且所有这些字段对于搜索都很重要,该怎么办?



1.  def text_similarity_reranking(search_query: str) -> Dict:
2.      return {
3.          "retriever": {
4.              "text_similarity_rank": {
5.                  "retriever": {
6.                      "semantic": {
7.                          "query": {
8.                              "match": {
9.                                  "text_field": search_query
10.                              }
11.                          }
12.                      }
13.                  },
14.                  "field": "text_field",
15.                  "inference_id": "cohere-rerank-service",
16.                  "inference_text": search_query,
17.                  "window_size": 10
18.              }
19.          }
20.      }

22.  retriever = ElasticsearchRetriever.from_es_params(
23.      es_cloud_id="your-cloud-id",
24.      es_api_key="your-api-key",
25.      index_,
26.      content_field=text_field,
27.      body_func=text_similarity_reranking,
28.  )



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

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

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

结论

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

如何系统的去学习大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/1004683
推荐阅读
相关标签