首页/AI/RAG 与向量库速查/内积(Dot Product)与检索
Embedding 与检索50 条

内积(Dot Product)与检索

内积等于余弦乘以两向量模长:方向相似且模长更大者得分更高;向量归一化后内积与余弦等价,FAISS 的 IndexFlatIP 即按内积检索。

RAG 与向量库速查AI更新于 2026-10-13

内积检索是什么

内积(点积)等于两向量模长之积再乘上夹角余弦:方向越一致、模长越大,得分越高。这让内积同时受方向和长度影响,所以直接用它排序时,长文档向量常常只是因为模长大就排到前面。工程上的通行做法是先把向量归一化到单位长度,此时内积与余弦完全等价,分数落在 -1 到 1;或者使用本身就会归一化的度量配置。各库对内积的表达方式不同,有的返回相似度(越大越相似),有的返回负内积当距离(越小越相似)。

基本信息

定义a·b = ‖a‖‖b‖cosθ
取值范围未归一化时无上界,归一化后为 -1~1
FAISSIndexFlatIP 按内积检索,需自行归一化
Qdrantdistance=Dot,返回相似度,越大越相似
pgvector运算符 <#> 返回负内积,ORDER BY 取最小值

典型使用场景

  • 自建轻量检索:FAISS IndexFlatIP 配归一化向量,等价余弦且计算更省
  • 已归一化的向量库选型:直接用内积度量避免重复计算范数
  • 排查排序异常:计算同一对的余弦与内积,若排序不一致说明存在未归一化向量
  • 跨库迁移:从 Qdrant 的 Dot 迁到 pgvector 时,注意符号与排序方向相反
  • 权重化召回:需要按文档重要度加权时,刻意保留模长差异作为权重来源

内积与模长

内积与模长
import numpy as np

a = np.array([0.3, 0.4, 0.5], dtype='float32')
b = np.array([0.1, 0.9, 0.2], dtype='float32')
ip = float(a @ b)                                     # 内积
cos = ip / (np.linalg.norm(a) * np.linalg.norm(b))    # 余弦 = 内积 / 模长积
print(ip, cos)
print(float((a / np.linalg.norm(a)) @ (b / np.linalg.norm(b))))   # 归一化后两者相等

各库内积语义对照

库表达方式排序方向
FAISSIndexFlatIP得分越大越相似
Qdrantdistance=Dot相似度越大越相似
pgvector<#> 负内积值越小越相似,注意负号
Elasticsearchdot_product 相似度得分越大越相似
把内积分数直接展示给用户时先确认符号与量纲:pgvector 的 <#> 输出是负值,未归一化的内积则没有固定上界,两种都不适合当作“相似度百分比”。

易错点

  • 查询向量未归一化而文档侧已归一化,排序被模长带偏,长文档无理由地排前
  • 把 pgvector 的 <#> 结果当相似度展示,界面上出现负数
  • 归一化只做了一半:新增数据进了新流程而存量数据还在旧流程,两批数据不可比
  • 用内积配上未训练过的数据分布,相近主题的向量模长差异远大于方向差异
  • 跨库迁移时忽略排序方向差异,照着旧代码写 ORDER BY DESC 得到完全相反的候选

数据来源与参考

  • FAISS wiki(MetricType 与 IndexFlatIP)
  • Qdrant 官方文档(Dot 距离)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌