在大数据时代,搜索和分析能力至关重要。开源软件套件OpenSearch提供了一个高效、可扩展的解决方案,用于搜索、分析和观察应用程序。OpenSearch基于Apache Lucene构建,是分布式的搜索引擎。在本篇文章中,我们将演示如何使用OpenSearch和向量存储实现自查询检索器(SelfQueryRetriever)。
技术背景介绍
OpenSearch是一款强大的分布式搜索和分析引擎,适用于各种规模的搜索应用。它允许开发者构建高性能的搜索和分析解决方案。通过结合OpenAI的嵌入技术,我们可以实现更智能的自查询检索器,帮助用户根据自然语言查询从向量存储中检索信息。
核心原理解析
通过使用OpenAI的嵌入技术,我们可以将文档内容转化为向量,并存储在OpenSearch中。然后利用自查询检索器结合语言模型(LLM)来解释用户的查询,并从存储中返回匹配的文档。这个过程涉及到向量化文档、构建检索器、以及处理复杂查询的步骤。
代码实现演示
首先,我们需要创建OpenSearch的向量存储,并进行数据填充。请确保安装了lark
和opensearch-py
库。
%pip install --upgrade --quiet lark opensearch-py
数据准备和存储
在代码中,我们将电影简介文档转为向量,并存储到OpenSearch的索引中。
import os
import getpass
from langchain_community.vectorstores import OpenSearchVectorSearch
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings
# 输入自己OpenAI的API密钥
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
# 使用OpenAI的嵌入服务
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 = OpenSearchVectorSearch.from_documents(
docs,
embeddings,
index_name="opensearch-self-query-demo",
opensearch_url="http://localhost:9200",
)
构建自查询检索器
接着,我们构建一个自查询检索器,利用语言模型来处理用户的自然语言查询。
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"),
# 其他字段信息略
]
# 初始化语言模型和检索器
llm = OpenAI(temperature=0)
retriever = SelfQueryRetriever.from_llm(
llm, vectorstore, "Brief summary of a movie", metadata_field_info, verbose=True
)
查询示例
我们可以使用检索器进行一些示例查询:
# 查询有关恐龙的电影
retriever.invoke("What are some movies about dinosaurs")
# 查询评分高于8.5的电影
retriever.invoke("I want to watch a movie rated higher than 8.5")
# 查询由Greta Gerwig导演的关于女性的电影
retriever.invoke("Has Greta Gerwig directed any movies about women")
# 查询高评分的科幻电影
retriever.invoke("What's a highly rated (above 8.5) science fiction film?")
应用场景分析
此方法可以用于各种需要智能搜索和推荐的应用场景,比如视频平台的内容推荐系统、图书的智能检索等,通过自然语言处理和向量表示提供更精准的搜索服务。
实践建议
- 在使用OpenSearch时,确保集群配置合理,以保证查询的速度和准确性。
- 利用向量存储和嵌入技术,进一步提高文档检索的智能化水平。
- 定期更新和维护文档索引,以确保检索结果的时效性。
如果遇到问题欢迎在评论区交流。
—END—