探索DingoDB:分布式多模向量数据库的强大能力

122 阅读3分钟

引言

在当今的数据驱动世界中,能够快速存储、分析和检索多种类型的数据是技术产品取得成功的关键。DingoDB作为一种分布式多模向量数据库,将数据湖的特点与向量数据库相结合,允许开发者以实时低延迟方式处理各种类型和规模的数据。本篇文章将深入探讨如何在DingoDB中创建一个向量存储,并演示如何使用SelfQueryRetriever进行自查询检索。

主要内容

DingoDB: 简介与特性

DingoDB不仅支持常见的Key-Value存储,还能处理PDF、音频、视频等多种数据类型。其实时低延迟的处理能力使得快速响应和分析成为可能,特别适合需要处理多模态数据的应用场景。

设置DingoDB向量存储

要使用DingoDB,您需要先运行一个DingoDB实例。安装lark包是使用self-query retriever的先决条件。

%pip install --upgrade --quiet dingodb
# 或安装最新版本
%pip install --upgrade --quiet git+https://git@github.com/dingodb/pydingo.git

接下来,需要获取OpenAI的API密钥以使用OpenAIEmbeddings。

import os

OPENAI_API_KEY = ""  # 在此处填写您的API密钥
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY

from langchain_community.vectorstores import Dingo
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()

创建DingoDB索引

我们将使用DingoDB创建一个向量存储,并向其中添加一些电影的简介。

from dingodb import DingoDB

index_name = "langchain_demo"
dingo_client = DingoDB(user="", password="", host=["172.30.14.221:13000"])  # 使用API代理服务提高访问稳定性

# 检查索引是否已存在,如果不存在则创建
if (
    index_name not in dingo_client.get_index()
    and index_name.upper() not in dingo_client.get_index()
):
    dingo_client.create_index(
        index_name=index_name, dimension=1536, metric_type="cosine", auto_id=False
    )

docs = [
    Document(
        page_content="A bunch of scientists bring back dinosaurs and mayhem breaks loose",
        metadata={"year": 1993, "rating": 7.7, "genre": '"action", "science fiction"'},
    ),
    # ...其他文档
]

vectorstore = Dingo.from_documents(docs, embeddings, index_name=index_name, client=dingo_client)

代码示例

自查询检索的实现

通过实例化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
)

# 进行检索
results = retriever.invoke("What are some movies about dinosaurs")
print(results)

常见问题和解决方案

网络访问限制

由于地域限制,某些地区开发者可能遇到访问API的困难。考虑使用API代理服务以确保访问的稳定性。

数据存储与检索效率问题

对于大规模数据集,检索效率可能下降。优化索引结构和选择合适的向量维度可以改善性能。

总结和进一步学习资源

DingoDB提供了一种强大而灵活的方式来处理多种类型的数据。通过本文的示例和指南,希望您对DingoDB和self-query retriever的使用有了更深入的了解。

进一步学习资源:

参考资料

  1. DingoDB GitHub
  2. OpenAI API

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