向量检索
向量检索根据查询向量与资料向量的距离或相似度找出候选。它擅长发现表达相近的内容,但结果还需要结合条件和原文判断。
理解与应用
向量检索是在向量集合中寻找与查询最接近的对象。文本经过嵌入模型编码后,每个文档块都有向量;用户问题也被编码,检索器据此计算相似度并排序。返回前 k 个结果通常称为 Top-k,它说明排序位置,并不表示这 k 个结果都足以回答问题。
在住宿制度库里,“酒店钱能报多少”可以用于寻找“住宿费用标准”。但库中可能同时存在旧制度、其他地区条款和另一个公司的私有文档。因此,允许访问的资料范围、目的地和有效日期需要作为条件处理。与问题非常相似的文档,如果不属于当前账户的访问范围,就不应成为送入模型的候选。
资料量小时,可以逐项计算相似度,得到精确近邻结果;规模变大后,近似近邻索引会用特定的数据结构减少比较次数,换取更低的延迟,但可能漏掉部分真正的近邻。可以用精确结果作对照,测量近似检索的召回和耗时。这里的“近邻召回”衡量搜索方法是否找对向量,仍不等于业务问题已经答对。
订单号、错误码等精确标识,有时更适合关键词或结构化查询。实际系统可以合并两类候选,再用重排模型或规则细查内容。相似度也不是置信概率:0.9 不能直接解释为答案有 90% 的正确率。无论分数多高,生成回答前仍需确认片段是否支持具体结论。
动手试一试:先限定可用文档,再比较相似度
向量和文档状态都是教学设定。两个最相近但不适用的文档被先排除;剩余候选不足时,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 原创讲解与教学示例。参考资料用于核对技术定义;核验日不代表资料的发布日期。
- Sentence Transformers:Semantic Search ↗
已核对官方语义检索文档;区分查询与文档编码场景,不承诺向量检索可替代精确匹配。 · 核验:2026-10-10