引言
Elasticsearch是一款分布式、支持RESTful接口的搜索和分析引擎,广泛应用于对大规模数据的快速搜索和分析。在本篇文章中,我们将结合Elasticsearch与Langchain库中的SelfQueryRetriever
实现智能搜索,通过代码示例展示如何创建和使用Elasticsearch向量存储。
主要内容
创建Elasticsearch向量存储
首先,我们需要创建一个Elasticsearch向量存储并导入一些数据,如电影摘要。请注意,self-query retriever
功能需要安装lark
和elasticsearch
包。
%pip install --upgrade --quiet lark langchain langchain-elasticsearch
导入库并设置API密钥
import getpass
import os
from langchain_core.documents import Document
from langchain_elasticsearch import ElasticsearchStore
from langchain_openai import OpenAIEmbeddings
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:") # 输入OpenAI API密钥
embeddings = OpenAIEmbeddings()
创建文档数据并初始化向量存储
docs = [
Document(page_content="A bunch of scientists bring back dinosaurs and mayhem breaks loose", metadata={"year": 1993, "rating": 7.7, "genre": "science fiction"}),
# 其他文档...
]
vectorstore = ElasticsearchStore.from_documents(
docs,
embeddings,
index_name="elasticsearch-self-query-demo",
es_url="http://localhost:9200", # 使用API代理服务提高访问稳定性
)
创建自查询检索器
接下来,我们实例化一个检索器,为文档的元数据字段提供信息,并描述其内容。
from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain_openai import OpenAI
metadata_field_info = [
AttributeInfo(name="genre", description="The genre of the movie", type="string or list[string]"),
AttributeInfo(name="year", description="The year the movie was released", type="integer"),
# 其他字段...
]
document_content_description = "Brief summary of a movie"
llm = OpenAI(temperature=0)
retriever = SelfQueryRetriever.from_llm(
llm, vectorstore, document_content_description, metadata_field_info, verbose=True
)
代码示例
测试检索器功能
# 仅指定相关查询
retriever.invoke("What are some movies about dinosaurs")
# 指定查询和过滤条件
retriever.invoke("Has Greta Gerwig directed any movies about women")
处理复杂查询
retriever.invoke("what animated or comedy movies have been released in the last 30 years about animated toys?")
常见问题和解决方案
网络限制
由于某些地区的网络限制,开发者可能需要考虑使用API代理服务以确保API的稳定访问。
调整检索结果数量
可以通过设置enable_limit=True
来限制返回文档的数量。
retriever = SelfQueryRetriever.from_llm(
llm,
vectorstore,
document_content_description,
metadata_field_info,
enable_limit=True,
verbose=True,
)
总结和进一步学习资源
使用Elasticsearch与Langchain的SelfQueryRetriever,能够高效地对大量文档进行智能搜索和分析。今后您可以深入研究Elasticsearch的复杂查询功能,或探索Langchain库的其他组件。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—