查找距离最近项

说明

使用所请求的 distance_measure 对给定的 embedding 字段执行最近邻向量搜索

语法

Node.js

const results = await db.pipeline()
  .collection("cities")
  .findNearest({
      field: 'embedding',
      vectorValue: vector([1.5, 2.345]),
      distanceMeasure: 'euclidean',
  })
  .execute();

行为

距离衡量指标

find_nearest 阶段支持下列向量距离选项:

  • euclidean:测量向量之间的 euclidean 距离。如需了解详情,请参阅欧几里得
  • cosine:基于向量之间的角度来比较向量,这样可以测量不依赖于向量大小的相似度。对于单位归一化向量,建议使用 dot_product,而不是余弦距离,虽然两者在数学上是等效的,但前者性能更好。如需了解详情,请参阅余弦相似度
  • dot_product:与 cosine 类似,但受向量大小影响。如需了解详情,请参阅点积

选择距离衡量方式

根据您的所有向量嵌入是否已归一化,您可以确定要使用哪种距离衡量方式来计算距离衡量值。已归一化向量嵌入的大小(长度)正好为 1.0。

此外,如果您知道用于训练模型的距离衡量方式,请使用该距离衡量方式来计算向量嵌入之间的距离。

已归一化数据

如果您的数据集中所有向量嵌入都已归一化,那么这三种距离衡量方式都会提供相同的语义搜索结果。从本质上讲,虽然每种距离衡量方式都会返回不同的值,但这些值的排序方式相同。如果嵌入已归一化,dot_product 通常具有最高的计算效率,但在大多数情况下,差异可以忽略不计。不过,如果您的应用对性能非常敏感,dot_product 可能会有助于进行性能调优。

未归一化数据

如果您的数据集中的向量嵌入未归一化,那么从数学角度来看,使用 dot_product 作为距离衡量方式是不正确的,因为点积无法衡量距离。根据生成嵌入的方式和偏好的搜索类型,cosineeuclidean 距离衡量方式生成的搜索结果在主观上优于其他距离衡量方式。您可能需要对 cosineeuclidean 进行实验,以确定哪个最适合您的应用场景。

不确定数据是已归一化还是未归一化

如果您不确定数据是否已归一化,但又想使用 dot_product,我们建议您改用 cosinecosine 类似于内置了归一化的 dot_product。使用 cosine 衡量的距离范围为 02。结果接近 0 表示向量非常相似。

限制结果数

您可以通过设置 limit 字段来限制查询返回的文档数量。

Node.js

const results = await db.pipeline()
  .collection("cities")
  .findNearest({
      field: 'embedding',
      vectorValue: vector([1.5, 2.345]),
      distanceMeasure: 'euclidean',
      limit: 10,
  })
  .execute();

检索计算出的向量距离

您可以在 find_nearest 阶段上分配一个 distance_field 输出属性名称,以检索计算出的向量距离,如以下示例所示:

例如,对于以下集合:

Node.js

await db.collection('cities').doc('SF').set({name: 'San Francisco', embedding: vector([1.0, -1.0])});
await db.collection('cities').doc('TO').set({name: 'Toronto', embedding: vector([5.0, -10.0])});
await db.collection('cities').doc('AT').set({name: 'Atlantis', embedding: vector([2.0, -4.0])});

执行向量搜索,并请求输出 distance_field

Node.js

const results = await db.pipeline()
  .collection("cities")
  .findNearest({
      field: 'embedding',
      vectorValue: vector([1.3, 2.345]),
      distanceMeasure: 'euclidean',
      distanceField: 'computedDistance',
  })
  .execute();

这会生成以下文档:

{name: 'San Francisco', embedding: vector([1.0, -1.0]), computedDistance: 3.3584259705999178},
{name: 'Atlantis', embedding: vector([2.0, -4.0]), computedDistance: 6.383496299051172},
{name: 'Toronto', embedding: vector([5.0, -10.0]), computedDistance: 12.887553103673328}

限制

在使用向量嵌入时,请注意以下限制:

  • 支持的嵌入维度上限为 2,048。如要存储更大的索引,可使用降维