探索Astra DB:利用Cassandra构建高效的向量存储

81 阅读3分钟

引言

在现代数据密集型应用中,数据库的选择至关重要。Astra DB是DataStax推出的一款无服务器、支持向量计算的数据库,基于Cassandra构建,并通过易于使用的JSON API提供服务。本篇文章将介绍如何在Astra DB上创建向量存储,并通过自查询检索器(SelfQueryRetriever)实现高效的数据检索。

主要内容

创建Astra DB向量存储

首先,我们需要创建一个向量存储并初始化数据。在这个例子中,我们将使用一些电影的简介作为文档数据。同时,确保安装了必要的Python包larkastrapy

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