引言
在当今信息爆炸的时代,数据的多样性和复杂性不断增加。DingoDB作为一种分布式多模态向量数据库,将数据湖与向量数据库的特点结合起来,能够存储任意类型和大小的数据,包括Key-Value、PDF、音频、视频等。本文将介绍如何在DingoDB上创建索引并使用SelfQueryRetriever进行自查询。
主要内容
创建DingoDB索引
为了使用DingoDB,我们首先需要启动一个DingoDB实例,并准备一些数据。本文的示例包含了一些电影总结的文档。
安装DingoDB
确保你的环境中安装了dingodb库:
%pip install --upgrade --quiet dingodb
# 或者安装最新版本
%pip install --upgrade --quiet git+https://git@github.com/dingodb/pydingo.git
初始化向量存储
我们使用OpenAIEmbeddings,需要获得OpenAI API 密钥:
import os
from langchain_community.vectorstores import Dingo
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings
from dingodb import DingoDB
OPENAI_API_KEY = ""
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY
embeddings = OpenAIEmbeddings()
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="科学家带回恐龙,混乱随之而来", metadata={"year": 1993, "rating": 7.7, "genre": '"action", "science fiction"'}),
# 更多文档
]
vectorstore = Dingo.from_documents(docs, embeddings, index_name=index_name, client=dingo_client)
创建自查询检索器
设置检索器需要提供有关文档的元数据字段信息和简短的内容描述:
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="电影的类型", type="string or list[string]"),
# 更多字段
]
document_content_description = "电影的简要总结"
llm = OpenAI(temperature=0)
retriever = SelfQueryRetriever.from_llm(
llm, vectorstore, document_content_description, metadata_field_info, verbose=True
)
测试检索器
可以使用以下代码进行测试:
retriever.invoke("有哪些关于恐龙的电影")
代码示例
完整示例
retriever = SelfQueryRetriever.from_llm(
llm,
vectorstore,
document_content_description,
metadata_field_info,
enable_limit=True,
verbose=True,
)
# 查询示例
result = retriever.invoke("找两部关于恐龙的电影")
print(result)
常见问题和解决方案
- 网络限制:在某些地区,访问OpenAI API可能会受到限制。建议使用API代理服务。
- 数据格式:确保数据格式与DingoDB所需格式一致。
总结和进一步学习资源
DingoDB作为一个强大的多模态数据库,为多种类型的数据分析和处理提供了高效的解决方案。读者可以进一步学习以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---