深入探索Elasticsearch:使用LangChain的向量存储管理

209 阅读2分钟

引言

Elasticsearch是一个分布式、RESTful的搜索与分析引擎,能够执行矢量和词法搜索。它建立在Apache Lucene库之上,广泛用于全文搜索、日志和指标分析等领域。在本文中,我们将介绍如何使用LangChain与Elasticsearch进行向量存储的管理,从而增强对大型语言模型(LLM)的处理能力。

主要内容

如何安装与设置

首先,为了使用Elasticsearch的向量搜索功能,你需要安装langchain-elasticsearch包:

%pip install -qU langchain-elasticsearch

本地和云端的Elasticsearch实例

  • Elastic Cloud:这是Elasticsearch的托管服务,提供了简单的管理界面和安全性。可以注册免费试用。
  • 本地安装:可以使用官方的Elasticsearch Docker镜像来快速启动。以下是启动单节点Elasticsearch实例的命令(仅用于开发):
%docker run -p 9200:9200 -e "discovery.type=single-node" -e "xpack.security.enabled=false" docker.elastic.co/elasticsearch/elasticsearch:8.12.1

创建与管理向量存储

借助LangChain,你可以轻松管理向量存储。下面是一些关键步骤:

初始化ElasticsearchStore

from langchain_elasticsearch import ElasticsearchStore

elastic_vector_search = ElasticsearchStore(
    es_url="http://localhost:9200",  # 使用API代理服务提高访问稳定性
    index_name="langchain_index",
    embedding=OpenAIEmbeddings(model="text-embedding-3-large"),
    es_user="elastic",
    es_password="changeme",
)

添加文档到向量存储

from langchain_core.documents import Document
from uuid import uuid4

documents = [
    Document(page_content="Building an exciting new project with LangChain - come check it out!", metadata={"source": "tweet"}),
    # 添加更多文档...
]
uuids = [str(uuid4()) for _ in range(len(documents))]
elastic_vector_search.add_documents(documents=documents, ids=uuids)

查询向量存储

使用相似度搜索功能来查询存储:

results = elastic_vector_search.similarity_search(
    query="LangChain provides abstractions to make working with LLMs easy",
    k=2,
    filter=[{"term": {"metadata.source.keyword": "tweet"}}],
)
for res in results:
    print(f"* {res.page_content} [{res.metadata}]")

常见问题和解决方案

问题:当将文档索引到Elasticsearch时出现超时错误。 解决方案:可以调整chunk_sizemax_chunk_bytes参数来减少超时错误。

elastic_vector_search.add_texts(
    texts, 
    bulk_kwargs={"chunk_size": 50, "max_chunk_bytes": 200000000}
)

总结和进一步学习资源

Elasticsearch结合LangChain提供了强大的文本向量搜索能力,是构建检索增强型生成(Retrieval-Augmented Generation, RAG)应用的基础。通过掌握这些基础功能,你可以为LLM应用提供高效的语料查询支持。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---