探索Astra DB:使用SelfQueryRetriever进行智能影视检索

68 阅读2分钟

引言

在大数据和人工智能时代,选择一个合适的数据库来有效处理海量数据至关重要。DataStax Astra DB是一款基于Cassandra构建的无服务器向量数据库,提供了易于使用的JSON API。这篇文章将带你了解如何使用Astra DB的SelfQueryRetriever功能进行智能影视检索。

主要内容

创建Astra DB向量存储

首先,我们需要创建一个Astra DB向量存储并为其添加数据。以下是一些电影摘要的示例文档。

要实现自查询检索器,需要安装larkastrapy包:

%pip install --upgrade --quiet lark astrapy langchain-openai

我们将使用OpenAIEmbeddings,因此需要获取OpenAI API Key:

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向量存储

请注意,API端点和令牌如下所示:

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"}),
    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}),
    # 其他文档...
]

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"),
    # 其他字段...
]

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("I want to watch a movie rated higher than 8.5")
retriever.invoke("Has Greta Gerwig directed any movies about women")

过滤k

可以指定要获取的文档数量k:

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访问限制:在某些地区,可能需要使用API代理服务来提高访问稳定性。
  • 数据冗余和性能问题:始终确保数据索引优化以提高检索速度。

总结和进一步学习资源

本文介绍了如何在Astra DB中使用SelfQueryRetriever进行向量存储和智能检索。希望你能从中获得实践经验。

进一步学习资源

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---