SonnetDB 标量向量函数:距离、内积与范数
向量检索是 SonnetDB 的核心功能之一,而向量距离度量是向量检索的基础。SonnetDB 提供了四种标量向量函数,让你可以在普通的 SELECT 查询中直接计算向量之间的距离和范数,无需借助外部计算工具。
四种向量距离函数
SonnetDB 支持以下四种向量距离/度量函数:
cosine_distance(vector1, vector2):余弦距离。衡量两个向量在方向上的差异,对非零有限向量,数学上的取值范围为[0, 2];实际计算仍存在浮点误差。值越小表示方向越一致,常用于文本和语义搜索。
l2_distance(vector1, vector2):欧几里得距离(L2 范数距离)。衡量两个向量在欧几里得空间中的直线距离。值越小表示在空间上越接近。
inner_product(vector1, vector2):内积(点积)。sum(v1_i * v2_i),在采用内积评分的检索任务中用于排序。此时内积越大排名越靠前(注意与余弦距离的方向相反)。
vector_norm(vector):向量范数(L2 范数)。sqrt(sum(v_i^2)),计算向量自身的长度。
在查询中使用
假设已有名为documents的 measurement,包含title、source和embedding字段;其中embedding是 4 维 VECTOR 字段:
SELECTtitle,cosine_distance(embedding,[0.10,0.20,0.30,0.40])AScos_dist,l2_distance(embedding,[0.10,0.20,0.30,0.40])ASl2_dist,inner_product(embedding,[0.10,0.20,0.30,0.40])ASdot_prod,vector_norm(embedding)ASnormFROMdocumentsWHEREsource='wiki';这条查询会返回每个文档标题与目标向量之间的三种距离/相似度指标,以及每个嵌入向量自身的 L2 范数。
函数与度量的关系
理解这些函数之间的关系,有助于正确选择和解读结果:
cosine_distance(a, b) = 1 - cosine_similarity(a, b)l2_distance(a, b) = sqrt(sum((a_i - b_i)^2))inner_product(a, b) = sum(a_i * b_i)vector_norm(a) = sqrt(inner_product(a, a))
余弦距离与内积之间存在关联:如果两个向量都已归一化(vector_norm = 1),则cosine_distance = 1 - inner_product。
选择合适的距离度量
在实际应用中,选择合适的距离度量取决于数据的特性和业务需求:
- 余弦距离常用于文本搜索和语义相似度场景,因为它只关注方向而不受向量长度的影响
- L2 距离适合向量长度本身有意义的场景,例如物理测量数据或已经归一化的嵌入
- 内积适合需要考虑向量长度和方向的场景,如推荐系统中的矩阵分解
与 KNN 表值函数的关系
标量函数用于逐行表达式计算,knn()用于召回并按距离升序返回候选。两条路径不能视为完全相同的实现:标量inner_product(a,b)返回正点积,而 KNN 的inner_product距离采用负点积,以保持数值越小越靠前。KNN 可以指定度量类型:
-- 余弦距离 KNN(默认)SELECT*FROMknn(documents,embedding,[0.10,0.20,0.30,0.40],3);-- L2 距离 KNNSELECT*FROMknn(documents,embedding,[0.10,0.20,0.30,0.40],3,'l2');-- 内积距离 KNNSELECT*FROMknn(documents,embedding,[0.10,0.20,0.30,0.40],3,'inner_product');使用标量向量函数则更加灵活,可以在投影中同时计算多个距离指标,或与其他标量函数组合使用,构建更复杂的分析逻辑。
输入和查询边界
双向量函数要求维度一致;标量cosine_distance对任一零向量抛出异常,不将其默认为余弦距离 1。当前 KNN 向量距离 facade 的余弦路径对零向量返回 1,两者必须分别处理。单向量的vector_norm返回长度,零向量的范数为 0。
把标量函数写进 SELECT 或 ORDER BY,不代表查询自动使用向量索引。knn()的索引匹配、候选和回退规则属于另一条检索执行路径,需结合实际 schema 与索引配置判断。距离值也不是语义质量验收;模型、归一化和业务数据决定评分是否有用。
本篇按当前标量函数和向量距离源码复核,SQL 为已有对应 schema 下的示意,未运行这些示例,也未作真实模型、召回质量或性能验收。