DocArray 0.17.0版本发布:新增Redis后端存储支持,更加云友好的DocumentArray新特性
DocArray 是处理任何数据类型的一站式解决方案,它将非结构化数据封装成同一种数据结构,使得开发者能够高效地处理、嵌入、推荐、存储和传输数据,为多模态项目的开发工作奠定了坚实的基础。基于强大的数据建模能力,DocArray 可以轻松表示非常复杂的数据结构,并且能直观地表示多模态数据。目前 DocArray 已经支持 Redis,Elasticsearch,Qdrant 等多种存储后台。
在《DocArray:为机器学习而生的数据结构》一文中,Jina AI 高级工程师王峰博士对 DocArray 进行了详细介绍。
本次更新包含 8 个新增功能、2 个性能改进、7 个错误修复以及 2 个文档改进。
点击访问完整版本发布说明[1]
🆕 新增功能
load_uri_to_*
方法现支持透传参数(#540)
load_uri_to_*
方法(如load_uri_to_blob
、load_uri_to_text
等)现在支持透传kwargs
参数,您可以将timeout
参数传递给底层请求方法。
例如:
doc = Document(uri='uri_path')
doc.load_uri_to_blob(timeout=2)
新增在单个 Redis 实例存储多个 DocumentArrays (#540)
现在您可以在单个 Redis 实例中存储多个 DocumentArray,只需要将每个 DocumentArray 设置不同的index_name
,以做区分。
da1 = DocumentArray(storage='redis', config={'host': 'localhost', 'port': 6379, 'n_dim': 128, 'index_name': 'da1'})
da2 = DocumentArray(storage='redis', config={'host': 'localhost', 'port': 6379, 'n_dim': 256, 'index_name': 'da2'})
da3 = DocumentArray(storage='redis', config={'host': 'localhost', 'port': 6379, 'n_dim': 512, 'index_name': 'da3'})
DocumentArray Push 和 Pull 现需要登录 Jina (#541)
现在您需要先登录 Jina Cloud,才能将 DocumentArrays Push 到 Jina Cloud 或从 Jina Cloud 中 Pull。您可以通过在hub.jina.ai
创建令牌,并将其设置为环境变量 ( JINA_AUTH_TOKEN=my_token
) 或使用 CLI 命令jina auth login
登录。
将元数据与 DocumentArray 一起推送,并添加 cloud_list
和cloud_delete
方法 (#490)
DocumentArray.push
将提取有关 DocumentArray 的元数据并将其发送到 Jina Cloud。虽然这对用户来说是透明的,但它有助于在 Jina Cloud 中可视化 DocumentArrays。
也可以使用以下方法在 Jina Cloud 中列出和删除 DocumentArrays:
•
DocumentArray.cloud_list()
:列出认证用户拥有的所有 DocumentArray 对象•
DocumentArray.cloud_delete(da_name)
:如果 DocumentArray 为认证用户所拥有,则会按名称删除它
新增 Redis 后端的全文搜索功能 (#535)
只要您启用索引文本或指定要索引的标签字段,就可以在Document.text
字段或Document.tags
上进行全文搜索。例如:
from docarray import Document, DocumentArray
da = DocumentArray(
storage='redis', config={'n_dim': 2, 'index_text': True}
)
da.extend([
Document(text='Redis allows you to search by text query,'),
Document(text='by vector similarity'),
Document(text='Or by filter conditions'),
]) # add documents with text field
da.find('my text query').texts
输出结果:
['Redis allows you to search by text query,']
在 Redis 中添加逻辑运算符$and
和$or
(#509)
Redis 后端现在支持$and
和$or
逻辑运算符。例如:
from docarray import DocumentArray
da = DocumentArray(storage='redis', config={'n_dim': 128, 'columns': {'col1': 'str', 'col2': 'int'}})
redis_filter = {
"$or": {
"col1": {"$eq": "value"},
"col2": {"$lt": 100}
}
}
# retrieve documents using filter
da.find(redis_filter)
后端配置参数中的columns
的数据类型更改为字典 (#526)
存储后端的配置参数columns
已从 tuple 更改为以下格式的字典:{'column_name': 'column_type'}
. 这有助于 YAML 兼容性。例如:
from docarray import DocumentArray
da = DocumentArray(storage='annlite', config={'n_dim': 128, 'columns': {'col1': 'str', 'col2': 'float'}})
使用向量或 URI 显示图像文档 (#518)
现在可以在显示图像文档时,选择使用哪个字段:
from docarray import Document
d = Document(uri=os.path.join(cur_dir, 'toydata/test.png'))
d.display()
d.display(from_='uri')
或者
d.load_uri_to_image_tensor()
d.display(from_='tensor')
向后不兼容的 API 更改
增加了依赖项的最低版本:
Package | 最低版本 |
jina-hubble-sdk | 0.13.1 |
annlite | 0.3.12 |
其他 API 更改:
• 存储后端的
columns
配置参数已从元组列表更改为字典,格式为{'column_name': 'column_type'}
.
🚀 性能优化
优化使用exists
条件的查找(#519)
在使用exists
过滤器计算DocumentArray.find
时,我们摆脱了不必要且昂贵的计算。运行以下代码时:
from docarray import DocumentArray, Document
da = DocumentArray(Document(text='text') for _ in range(num)) + \
DocumentArray(Document(blob=b'blob') for _ in range(num))
da.find(query={'text': {'$exists': True}})
您应该期望在find
的延迟方面有200-300%的速度提升
此优化仅影响执行DocumentArray.find
或DocumentArray.match
使用exists
条件并使用in-memory
文档存储时。
在 SQLite 后端将默认日志模式更改为 WAL (#506):
根据 SQLite 文档[2],WAL(Write-Ahead Logging,预写式日志) 速度更快,更健壮,并提供更多并发性,所以我们将 SQLite 后端的默认日志模式更改为是 WAL,用于提高在 DocArray 中使用 SQLite 后端时的性能。
🐞 错误修复
保留在 Redis 后端向量相似性参数的默认值 (#559)
我们更改了之前的实现,避免了 DocArray 在 Redis 后端为向量相似性配置引入新的默认值,而是使用 None 并将其留给数据库来决定默认值,现在这个默认值取决于用户使用的 Redis 数据库的版本。
适应 AnnLite 的变化 (#543)
AnnLite 在0.3.12
中引入了一个突破性不向下兼容的变化。因此,我们已经根据最新的 AnnLite 版本调整了我们的实现,并将最低要求的版本提高到了0.3.12
。
修正 delete by mask 的 bug(#534)
da = DocumentArray.empty(3)
mask = [True, False]
del da[mask]
print(len(da)) # prints 1
我们已修复以上代码示例中 DocumentArray 的 delete by mask 操作的 bug ,DocumentArray 现在将正确保留 mask 中不存在的文档。
修复文档里错误的指向链接 (#532)
修复 AnnLite 类型映射 (#533)
DocArray 类型映射在 AnnLite 中使用了错误的类型,我们现在已经用正确的类型替换了原文档存储实现中指定的类型。
使用 kwargs 创建 Strawberry
类型 (#527)
Strawberry[3]在0.128.0
中有了一项重大更改,使得必须将参数作为关键参数传递。我们已经根据这一变化进行了调整。
使 device 更通用 (#515)
之前,内存中距离计算的部分限制了将向量 device 参数转换为cuda
,现在我们已经改变了实现方式,使设备转换更加通用。
📗 文档改进
在功能摘要页面引入 Benchmark (#510)
我们在“功能摘要”页面中添加了“One Million Benchmark”部分。
更新了 Push/Pull 使用说明 (#516)
我们更新了使用 DocumentArray Push/Pull 时所需的 pip 指令
pip install "docarray[common]"
🤟 贡献者
我们要感谢此版本的所有贡献者:
Joan Fontanals(@github_user) Leon Leon Wolf(@fogx) samsja(@samsja) AlaeddineAbdessalem(@alaeddine-13) Halo Master(@linkerlin) Han Xiao(@hanxiao) Wang Bo(@bwanglzu) Anne Yang(@AnneYang720) Joan Fontanals(@JoanFM)
点击 阅读原文 前往 GitHub 查看更详细的新功能说明以及代码示例!
快来体验!一键安装新版 DocArray,并运行 DocArray
pip install docarray
引用链接
[1]
Release Notes: https://github.com/jina-ai/docarray/releases/tag/v0.17.0[2]
SQLite 文档: https://sqlite.org/wal.html[3]
Strawberry: https://github.com/strawberry-graphql/strawberry