说明
使用所请求的 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 作为距离衡量方式是不正确的,因为点积无法衡量距离。根据生成嵌入的方式和偏好的搜索类型,cosine 或 euclidean 距离衡量方式生成的搜索结果在主观上优于其他距离衡量方式。您可能需要对 cosine 或 euclidean 进行实验,以确定哪个最适合您的应用场景。
不确定数据是已归一化还是未归一化
如果您不确定数据是否已归一化,但又想使用 dot_product,我们建议您改用 cosine。cosine 类似于内置了归一化的 dot_product。使用 cosine 衡量的距离范围为 0 到 2。结果接近 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。如要存储更大的索引,可使用降维。