向量检索

向量检索根据查询向量与资料向量的距离或相似度找出候选。它擅长发现表达相近的内容,但结果还需要结合条件和原文判断。

返回概念图谱 →

理解与应用

向量检索是在向量集合中寻找与查询最接近的对象。文本经过嵌入模型编码后,每个文档块都有向量;用户问题也被编码,检索器据此计算相似度并排序。返回前 k 个结果通常称为 Top-k,它说明排序位置,并不表示这 k 个结果都足以回答问题。

在住宿制度库里,“酒店钱能报多少”可以用于寻找“住宿费用标准”。但库中可能同时存在旧制度、其他地区条款和另一个公司的私有文档。因此,允许访问的资料范围、目的地和有效日期需要作为条件处理。与问题非常相似的文档,如果不属于当前账户的访问范围,就不应成为送入模型的候选。

资料量小时,可以逐项计算相似度,得到精确近邻结果;规模变大后,近似近邻索引会用特定的数据结构减少比较次数,换取更低的延迟,但可能漏掉部分真正的近邻。可以用精确结果作对照,测量近似检索的召回和耗时。这里的“近邻召回”衡量搜索方法是否找对向量,仍不等于业务问题已经答对。

订单号、错误码等精确标识,有时更适合关键词或结构化查询。实际系统可以合并两类候选,再用重排模型或规则细查内容。相似度也不是置信概率:0.9 不能直接解释为答案有 90% 的正确率。无论分数多高,生成回答前仍需确认片段是否支持具体结论。

关系速览
检索增强生成(RAG)包含 →向量检索

向量检索是 RAG 可选的召回方式,关键词或结构化查询也可以用于 RAG。

嵌入(Embedding)建议先学 →向量检索

学习建议:先理解向量表示与相似度,再分析向量检索的召回误差。

查询扩展应用于 →向量检索

查询扩展可以增加候选覆盖,但会带入偏离原意的检索结果。

动手试一试:先限定可用文档,再比较相似度

向量和文档状态都是教学设定。两个最相近但不适用的文档被先排除;剩余候选不足时,Top-2 仍会带回无关内容。示例采用精确遍历,没有近似索引,也不把分数解释为事实可信度。

将代码保存为 example.py,使用 Python 3.10+ 运行 python3 example.py。仅使用标准库,无需密钥,不会调用外部模型。

Python 代码

from math import sqrt

query = (1.0, 0.0)
documents = [
    {"id": "其他公司的制度", "allowed": False, "current": True, "v": (1, 0)},
    {"id": "本公司的旧制度", "allowed": True, "current": False, "v": (1, 0)},
    {"id": "现行住宿制度", "allowed": True, "current": True, "v": (4, 1)},
    {"id": "办公用品说明", "allowed": True, "current": True, "v": (0, 1)},
]

def cosine(a, b):
    dot = sum(x * y for x, y in zip(a, b))
    return dot / (sqrt(sum(x*x for x in a)) * sqrt(sum(y*y for y in b)))

ranked = [(cosine(query, doc["v"]), doc["id"])
          for doc in documents if doc["allowed"] and doc["current"]]
for score, title in sorted(ranked, reverse=True)[:2]:
    print(f"{title}: {score:.3f}")

运行结果

现行住宿制度: 0.970
办公用品说明: 0.000

常见误区

  • 认为 Top-1 必然包含答案,即使资料库根本没有收录对应信息。
  • 把向量相似度当成可跨模型、跨任务通用的可信度分数,未经测试就设定统一阈值。

前置与延伸

建议先读

相关概念

参考与版本

Apollo 原创讲解与教学示例。参考资料用于核对技术定义;核验日不代表资料的发布日期。