[深入探索Elasticsearch与SelfQueryRetriever:实现智能搜索与分析]

引言

Elasticsearch是一款分布式、支持RESTful接口的搜索和分析引擎,广泛应用于对大规模数据的快速搜索和分析。在本篇文章中,我们将结合Elasticsearch与Langchain库中的SelfQueryRetriever实现智能搜索,通过代码示例展示如何创建和使用Elasticsearch向量存储。

主要内容

创建Elasticsearch向量存储

首先,我们需要创建一个Elasticsearch向量存储并导入一些数据,如电影摘要。请注意,self-query retriever功能需要安装larkelasticsearch包。

%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—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值