引言
在现代数据密集型应用中,数据库的选择至关重要。Astra DB是DataStax推出的一款无服务器、支持向量计算的数据库,基于Cassandra构建,并通过易于使用的JSON API提供服务。本篇文章将介绍如何在Astra DB上创建向量存储,并通过自查询检索器(SelfQueryRetriever)实现高效的数据检索。
主要内容
创建Astra DB向量存储
首先,我们需要创建一个向量存储并初始化数据。在这个例子中,我们将使用一些电影的简介作为文档数据。同时,确保安装了必要的Python包lark和astrapy。
%pip install --upgrade --quiet lark astrapy langchain-openai
我们将使用OpenAI的嵌入模型,因此需要获取相应的API密钥:
import os
from getpass import getpass
from langchain_openai.embeddings import OpenAIEmbeddings
os.environ["OPENAI_API_KEY"] = getpass("OpenAI API Key:")
embeddings = OpenAIEmbeddings()
接下来,创建Astra DB向量存储:
ASTRA_DB_API_ENDPOINT = input("ASTRA_DB_API_ENDPOINT = ")
ASTRA_DB_APPLICATION_TOKEN = getpass("ASTRA_DB_APPLICATION_TOKEN = ")
from langchain_community.vectorstores import AstraDB
from langchain_core.documents import Document
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 = AstraDB.from_documents(
docs,
embeddings,
collection_name="astra_self_query_demo",
api_endpoint=ASTRA_DB_API_ENDPOINT, # 使用API代理服务提高访问稳定性
token=ASTRA_DB_APPLICATION_TOKEN,
)
创建自查询检索器
接下来,实例化自查询检索器。我们需要提供有关文档元数据字段的信息。
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"),
AttributeInfo(name="director", description="The name of the movie director", type="string"),
AttributeInfo(name="rating", description="A 1-10 rating for the movie", type="float"),
]
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?")
# 查询评分高于8.5的电影
retriever.invoke("I want to watch a movie rated higher than 8.5")
# 其他查询示例省略
配置返回文档数量
我们可以设置检索器以限制返回的文档数量。例如:
retriever = SelfQueryRetriever.from_llm(
llm, vectorstore, document_content_description, metadata_field_info, verbose=True, enable_limit=True
)
# 查询返回两部有关恐龙的电影
retriever.invoke("What are two movies about dinosaurs?")
清理
如果需要删除Astra DB实例中的集合,可以执行以下操作:
vectorstore.delete_collection()
常见问题和解决方案
- 网络访问问题:由于某些地区的网络限制,使用API代理服务可能是提高访问稳定性的重要措施。
- 安装问题:确保所有必要的包已通过pip安装,并且版本兼容。
总结和进一步学习资源
本文介绍了如何在Astra DB上创建向量存储,并使用自查询检索器实现高效数据检索。希望这能帮助你更好地理解和应用Astra DB。
进一步学习资源
参考资料
- OpenAI API 参考
- Astra DB API 文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---