跳至主要内容
前往文档
⌘U
Weaviate 数据库

使用 Weaviate 的 APIs 和工具开发 AI 应用

部署

部署、配置和维护 Weaviate 数据库

Weaviate Agents

使用 Weaviate 构建和部署智能代理

Weaviate Cloud

在云端管理和扩展 Weaviate

更多资源

集成
贡献者指南
活动 & 工作坊
Weaviate Academy

需要帮助?

Weaviate Logo询问 AI 助手⌘K
社区论坛

数据结构

数据对象概念

Weaviate 中的每个数据对象都属于一个 collection,并且具有一个或多个 properties

Weaviate 将 data objects 存储在基于类的集合中。数据对象表示为 JSON 文档。对象通常包含一个从机器学习模型派生的 vector。该向量也称为 embeddingvector embedding

每个集合包含相同 class 的对象。这些对象由共同的 schema 定义。

大小写

Weaviate 遵循 GraphQL 命名约定。

  • 集合名称以大写字母开头。
  • 属性名称以小写字母开头。

如果使用大写字母开头来定义属性名称,Weaviate 会在内部将其更改为小写字母。

JSON 文档作为对象

假设我们需要存储有关作者爱丽丝·门罗的信息。JSON 格式的数据如下所示

{
"name": "Alice Munro",
"age": 91,
"born": "1931-07-10T00:00:00.0Z",
"wonNobelPrize": true,
"description": "Alice Ann Munro is a Canadian short story writer who won the Nobel Prize in Literature in 2013. Munro's work has been described as revolutionizing the architecture of short stories, especially in its tendency to move forward and backward in time."
}

向量

您还可以将 vector 表示形式附加到您的数据对象。向量是存储在 "vector" 属性下的数字数组。

在此示例中,Alice Munro 数据对象具有一个小的向量。该向量是关于爱丽丝的一些信息,也许是一个故事或一张图片,机器学习模型将其转换为数字值的数组。

{
"id": "779c8970-0594-301c-bff5-d12907414002",
"class": "Author",
"properties": {
"name": "Alice Munro",
(...)
},
"vector": [
-0.16147631,
-0.065765485,
-0.06546908
]
}

要为您的数据生成向量,请使用 Weaviate 的向量化模块之一 modules。您也可以使用自己的向量化器。

集合

集合是共享模式定义的对象的组。

在此示例中,Author 集合保存表示不同作者的对象。

集合如下所示

[{
"id": "dedd462a-23c8-32d0-9412-6fcf9c1e8149",
"class": "Author",
"properties": {
"name": "Alice Munro",
"age": 91,
"born": "1931-07-10T00:00:00.0Z",
"wonNobelPrize": true,
"description": "Alice Ann Munro is a Canadian short story writer who won the Nobel Prize in Literature in 2013. Munro's work has been described as revolutionizing the architecture of short stories, especially in its tendency to move forward and backward in time."
},
"vector": [
-0.16147631,
-0.065765485,
-0.06546908
]
}, {
"id": "779c8970-0594-301c-bff5-d12907414002",
"class": "Author",
"properties": {
"name": "Paul Krugman",
"age": 69,
"born": "1953-02-28T00:00:00.0Z",
"wonNobelPrize": true,
"description": "Paul Robin Krugman is an American economist and public intellectual, who is Distinguished Professor of Economics at the Graduate Center of the City University of New York, and a columnist for The New York Times. In 2008, Krugman was the winner of the Nobel Memorial Prize in Economic Sciences for his contributions to New Trade Theory and New Economic Geography."
},
"vector": [
-0.93070928,
-0.03782172,
-0.56288009
]
}]

每个集合都有自己的向量空间。这意味着不同的集合可以对同一个对象具有不同的嵌入。

UUID

存储在 Weaviate 中的每个对象都有一个 UUID。UUID 保证在所有集合中的唯一性。

您可以使用 确定性 UUID 来确保相同的对象始终具有相同的 UUID。当您想在不更改 UUID 的情况下更新对象时,这很有用。

如果您没有指定 ID,Weaviate 会为您生成一个随机 UUID。

在没有指定任何其他排序的请求中,Weaviate 会按升序 UUID 顺序处理它们。这意味着用于 列出对象、使用 游标 API 或请求 按 ID 删除对象 的请求(如果没有指定任何其他排序),将按升序 UUID 顺序处理。

交叉引用

交叉引用和查询性能

涉及交叉引用的查询可能比不涉及交叉引用的查询慢,尤其是在大规模情况下,例如对于多个对象或复杂查询。

首先,我们强烈建议您考虑是否可以避免在数据模式中使用交叉引用。作为可扩展的 AI 数据库,Weaviate 擅长使用向量、关键词和混合搜索进行复杂查询,包括过滤器。您可以通过重新思考数据模式来避免交叉引用,从而受益匪浅。

例如,与其创建带有交叉引用的单独的“作者”和“书籍”集合,不如考虑将作者信息直接嵌入到书籍对象中,并使用搜索和过滤器按作者特征查找书籍。

如果数据对象相关,您可以使用 交叉引用 来表示关系。Weaviate 中的交叉引用就像帮助您检索相关信息的链接。交叉引用捕获关系,但它们不会更改底层对象的向量。

要创建引用,请使用一个集合中的属性来指定另一个集合中相关属性的值。

交叉引用示例

例如,“保罗·克鲁格曼为《纽约时报》撰稿” 描述了保罗·克鲁格曼和《纽约时报》之间的关系。要捕获该关系,请在表示《纽约时报》的 Publication 对象和表示保罗·克鲁格曼的 Author 对象之间创建交叉引用。

《纽约时报》Publication 对象如下所示。请注意 "id" 字段中的 UUID

{
"id": "32d5a368-ace8-3bb7-ade7-9f7ff03eddb6",
"class": "Publication",
"properties": {
"name": "The New York Times"
},
"vector": [...]
}

保罗·克鲁格曼的 Author 对象添加了一个新的属性 writesFor,以捕获关系。

{
"id": "779c8970-0594-301c-bff5-d12907414002",
"class": "Author",
"properties": {
"name": "Paul Krugman",
...
"writesFor": [
{
"beacon": "weaviate:///32d5a368-ace8-3bb7-ade7-9f7ff03eddb6",
"href": "/v1/objects/32d5a368-ace8-3bb7-ade7-9f7ff03eddb6"
}
],
},
"vector": [...]
}

beacon 子属性的值是《纽约时报》Publication 对象的 id 值。

交叉引用关系是定向的。要使链接双向,请更新 Publication 集合以添加一个 hasAuthors 属性,该属性指向 Author 集合。

多个向量嵌入(命名向量)

于 v1.24.0 中添加

Weaviate 集合支持多个命名向量。

集合可以有多个 命名向量

集合中的向量可以有自己的配置。每个向量空间可以设置自己的索引、自己的压缩算法和自己的向量化器。这意味着您可以对同一个对象使用不同的向量化模型,并应用不同的距离度量。

要使用命名向量,请调整您的查询以指定 向量搜索混合搜索 查询的目标向量。

在集合创建后添加命名向量

v1.31 中添加

可以向现有集合定义添加命名向量,在集合创建后。这允许您添加新的向量表示形式,而无需删除和重新创建集合。

当您向现有的集合定义添加新的命名向量时,重要的是要理解,现有对象的新的命名向量将保持未填充状态。只有在命名向量添加之后创建的对象才会收到这些新的向量嵌入。

这可以防止任何意外的副作用,例如为集合中的所有现有对象产生大量的向量化时间和成本。

如果您想为现有对象填充新的命名向量,请手动删除并重新插入对象。这将触发新命名向量的向量化过程。

不适用于传统(未命名)向量化器

在集合创建后添加命名向量的能力仅适用于配置了命名向量的集合。

生存时间 (TTL)

v1.35.0 中作为技术预览添加

生存时间 (TTL) 在 Weaviate v1.35.0 中作为技术预览功能引入,适用于本地/自托管的 Weaviate 实例。目前在 Weaviate Cloud 实例中不可用。

可以使用生存时间 (TTL) 功能,在预定的时间之后,可选地将对象设置为过期。

可以在集合级别设置 TTL。过期时间可以相对于以下内容定义

  • 对象创建时间
  • 上次对象更新时间
  • Weaviate DATE 属性值(日期和时间属性)

TTL 值以秒为单位指定。TTL 必须为正数,除了相对于 DATE 属性而言,也可以为负数,以允许在指定日期之前过期。

Weaviate 会在预定的间隔自动删除过期的对象。默认值可以使用 OBJECTS_TTL_DELETE_SCHEDULE 环境变量或 helm 图表中的 objects_ttl_delete_schedule 配置覆盖。过期的但尚未删除的对象可以可选地从查询结果中排除,以防止在删除过程运行之前检索到错误的数据。

请注意,对于多租户集合,删除只能发生在活动租户中。对于非活动或卸载的租户,将跳过删除操作;并且仅当租户再次变为活动状态时才会发生删除。

数据模式

Weaviate 在您添加数据之前需要一个数据模式。但是,您不必手动创建数据模式。如果您不提供模式,Weaviate 会根据传入的数据生成模式。

Weaviate 的模式以正式语言定义其数据结构。换句话说,它是组织和存储数据的蓝图。

模式定义数据类(即对象的集合)、每个类中的属性(名称、类型、描述、设置)、数据对象之间的可能图形链接(交叉引用)以及要用于该类的向量化模块,以及向量化模块、索引配置等设置。

模式与分类法

Weaviate 数据模式与分类法略有不同。分类法具有层次结构。有关分类法、本体和模式如何关联的更多信息,请阅读此 Weaviate 博客文章

模式履行多种角色

  1. 模式定义集合和属性。
  2. 模式定义将集合链接起来的交叉引用,甚至使用不同嵌入的集合。
  3. 模式允许您配置模块行为、ANN 索引设置、反向索引和其他功能在集合级别。

有关配置模式的详细信息,请参阅 模式教程操作指南:管理集合

多租户

多租户可用性
  • 多租户在 v1.20 中添加

要分隔集群中的数据,请使用多租户。Weaviate 将集群划分为分片。每个分片保存单个租户的数据。

分片具有几个优点

  • 数据隔离
  • 快速高效的查询
  • 简单且强大的设置和清理

租户分片更轻量级。您可以轻松地拥有每个节点 50,000 个或更多活动分片。这意味着您只需使用 20 个左右的节点就可以支持 1M 个并发活动租户。

多租户特别适用于您想要为多个客户存储数据,或者您想要为多个项目存储数据的情况。

租户删除 == 租户数据删除

删除租户会删除关联的分片。因此,删除租户也会删除其所有对象。

租户状态

多租户可用性
  • 租户活动状态设置于 v1.21 中添加
  • OFFLOADED 状态于 v1.26 中添加

租户具有活动状态(也称为租户状态),反映了它们的可用性和存储位置。租户可以是 ACTIVEINACTIVEOFFLOADEDOFFLOADINGONLOADING

  • ACTIVE 租户已加载并可用于读写操作。
  • 在所有其他状态下,租户不可用于读写访问。访问尝试将返回错误消息。
    • INACTIVE 租户存储在本地磁盘存储上,以便快速激活。
    • OFFLOADED 租户存储在云存储上。此状态对于不经常访问的租户的长期存储很有用。
    • OFFLOADING 租户正在移动到云存储。这是一个临时状态,因此用户无法指定。
    • ONLOADING 租户正在从云存储加载。这是一个临时状态,因此用户无法指定。一个 ONLOADING 租户可能正在预热到 ACTIVE 状态或 INACTIVE 状态。

有关管理租户的更多详细信息,请参阅 多租户操作

状态可用描述用户可指定
ACTIVE已加载并可用于读/写操作。
INACTIVE存储在本地磁盘存储上,无读/写访问权限。访问尝试将返回错误消息。
OFFLOADED存储在云存储上,无读/写访问权限。访问尝试将返回错误消息。
OFFLOADING正在移动到云存储,无读/写访问权限。访问尝试将返回错误消息。
ONLOADING正在从云存储加载,无读/写访问权限。访问尝试将返回错误消息。
租户状态重命名于 v1.26

v1.26 中,HOT 状态已重命名为 ACTIVECOLD 状态已重命名为 INACTIVE

租户状态传播

租户状态更改可能需要一些时间才能在整个集群中传播,尤其是在多节点集群中。


例如,在重新激活卸载的租户后,数据可能不会立即可用。同样,在卸载租户后,数据可能不会立即不可用。这是因为 租户状态最终一致,并且更改必须传播到集群中的所有节点。

卸载的租户

v1.26.0 中添加
卸载:仅限 AWS S3

截至 Weaviate v1.26.0,租户只能卸载到 AWS S3 中的冷存储。未来版本可能会添加其他存储选项。

要卸载租户,请使用 offload-s3 模块。

卸载租户需要相关的 offload-<storage> 模块在 Weaviate 集群中 启用

当租户被卸载时,整个租户分片将被移动到云存储。这对于不经常访问的租户的长期存储很有用。卸载的租户在重新加载到集群之前不可用于读写操作。

备份

备份不包括非活动或卸载的租户

多租户集合的备份仅包括 active 租户,不包括 inactiveoffloaded 租户。在创建备份之前 激活租户,以确保包含所有数据。

租户和 ID

每个租户就像一个命名空间,因此不同的租户理论上可以具有相同的 ID 的对象。为了避免命名问题,多租户集群中的对象 ID 将租户 ID 和对象 ID 组合起来,以创建在租户之间唯一的 ID。

租户和交叉引用

多租户支持一些交叉引用。

支持以下类型的交叉引用

  • 从多租户对象到非多租户对象。
  • 从多租户对象到另一个多租户对象,只要它们属于同一个租户。

不支持以下类型的交叉引用

  • 从非多租户对象到多租户对象。
  • 从多租户对象到另一个多租户对象,如果它们属于不同的租户。

主要功能

  • 每个租户都有一个专用的高性能向量索引。专用的索引意味着更快的查询速度。与其搜索共享索引空间,不如每个租户响应,就好像它是集群上唯一的用户一样。
  • 每个租户的数据隔离在一个专用的分片上。这意味着删除速度很快,并且不会影响其他租户。
  • 要扩展,请向集群添加一个新节点。Weaviate 不会重新分配现有的租户,但是 Weaviate 会将新租户添加到资源使用量最少的节点上。

监控指标

要将租户分组在一起进行监控,请在系统配置文件中设置 PROMETHEUS_MONITORING_GROUP = true

每个节点的租户数量

每个节点的租户数量受操作系统约束限制。租户数量不能超过每个进程的 Linux 打开文件限制。

例如,基于 n1-standard-8 机器构建的 9 节点测试集群容纳约 17 万个活动租户。每个节点有 18,000 到 19,000 个租户。

请注意,这些数字仅与活动租户相关。如果您 将未使用的租户设置为 inactive,则每个进程打开文件的限制不适用。

有关更多信息,请参阅以下内容

总结

  • 模式定义集合和属性。
  • 集合包含用 JSON 文档描述的数据对象。
  • 数据对象可以包含向量和属性。
  • 向量来自机器学习模型。
  • 不同的集合代表不同的向量空间。
  • 交叉引用链接模式之间的对象。
  • 多租户隔离每个租户的数据。

问题和反馈

如果您有任何问题或反馈,请在 用户论坛 中告诉我们。