查看原文
其他

DocArray 0.17.0版本发布:新增Redis后端存储支持,更加云友好的DocumentArray新特性

DocArray 工程师 Jina AI 2023-03-21

DocArray 是处理任何数据类型的一站式解决方案,它将非结构化数据封装成同一种数据结构,使得开发者能够高效地处理、嵌入、推荐、存储和传输数据,为多模态项目的开发工作奠定了坚实的基础。基于强大的数据建模能力,DocArray 可以轻松表示非常复杂的数据结构,并且能直观地表示多模态数据。目前 DocArray 已经支持 Redis,Elasticsearch,Qdrant 等多种存储后台。


在《DocArray:为机器学习而生的数据结构》一文中,Jina AI 高级工程师王峰博士对 DocArray 进行了详细介绍。

💡DocArray 0.17.0  现已正式发布!
本次更新包含 8 个新增功能、2 个性能改进、7 个错误修复以及 2 个文档改进。

点击访问完整版本发布说明[1]

🆕 新增功能

load_uri_to_*方法现支持透传参数(#540)

load_uri_to_*方法(如load_uri_to_blobload_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_listcloud_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-sdk0.13.1
annlite0.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.findDocumentArray.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 = [TrueFalse]
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


更多精彩内容(点击图片阅读)

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存