引言
在现代应用中,处理和管理多模态数据已经成为一种常态。无论是在图像识别、自然语言处理还是在推荐系统中,我们都需要一种灵活而高效的方式来存储和搜索混合类型的数据。DocArray正是这样一种工具,它不仅提供了多种文档索引后端,还支持构建DocArrayRetriever来开发强大的Langchain应用。本篇文章旨在深入探索DocArray的功能,并提供具体的代码示例。
主要内容
1. 文档索引后端概述
DocArray支持五种文档索引后端,每一种都有其独特的特点和适用场景:
- InMemoryExactNNIndex:适用于小型数据集,所有文档存储在内存中。
- HnswDocumentIndex:为小到中型数据集设计的轻量级索引,结合hnswlib的向量存储和SQLite的数据存储。
- WeaviateDocumentIndex:基于Weaviate向量数据库的索引。
- ElasticDocIndex:基于ElasticSearch的索引。
- QdrantDocumentIndex:基于Qdrant向量数据库的索引。
2. 定义文档架构
在创建索引之前,必须定义文档的架构。以下是一个随机的文档架构示例:
from docarray import BaseDoc
from docarray.typing import NdArray
class MyDoc(BaseDoc):
title: str
title_embedding: NdArray[32]
year: int
color: str
3. 初始化和索引数据
以下是使用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)
]
)
# 使用API代理服务提高访问稳定性
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)
4. 常见问题和解决方案
问题1:API访问限制 由于某些地区的网络限制,访问特定API可能会受到影响。解决方案是考虑使用API代理服务,以提高访问的稳定性。
问题2:内存占用 对于大型数据集,InMemoryExactNNIndex可能导致内存占用过高。建议使用其他支持磁盘存储的索引后端,例如HnswDocumentIndex。
总结和进一步学习资源
DocArray提供了一种强大而灵活的方式来管理多模态数据。通过结合不同的索引后端和DocArrayRetriever,您可以构建高效的文档检索系统。对于希望深入学习的读者,可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---