Embeddings 向量怎么做相似度检索?从索引配对到结果验收
先把向量与原文正确配对,再确认可比较的向量空间,最后计算相似度并用真实问题验收。接口返回一串数字,只证明拿到了数据;排出了前几个结果,也不证明其中存在答案。下面把“收到 embedding”到“交出可用候选”的检查拆开,避免直接把最高分材料送进回答流程。
本文由云岚API整理,官方资料核对日期为 2026 年 10 月 24 日。附带工具只运行人工向量的本地演练,没有调用真实模型,也不代表任何中转接口的兼容测试。
第一步:保留输入清单,核对每条向量对应谁
以 OpenAI Embeddings 响应为例,data 项包含 index 和 embedding,响应还提供 model。输出可为浮点数组或 base64 编码;先确认实际格式,再处理数值。接口字段说明
发起批量请求前,保存该批输入的顺序与唯一文档 ID。收到响应后按接口的索引约定配对,检查数量是否完整、索引是否重复或越界。自己的并发合并、排序和存储同样可能打乱位置,不能把“数组第一项”永远当作“文档第一篇”。
| 需要保留的内容 | 用于核对什么 |
|---|---|
| 批次 ID、输入位置、文档 ID | 返回向量与原文一一对应 |
| 原文版本、切分及清理规则 | 找到的是哪一版、哪一段材料 |
| 模型及版本、实际维度、编码配置 | 查询与文档能否直接比较 |
| 请求时间与必要的响应记录 | 失败后定位,不靠猜测补数据 |
不同批次的 index 可能都从 0 开始,不能当作全库唯一 ID。若接口采用别的配对方式,应遵循其协议;缺失对应关系时停止入库,不补零向量占位。路径或协议尚未确认,可先看接口地址与协议检查。
例如第二批的第一个输入,对应的是“第二批清单中的文档”,而非第一批的首篇。原文更新后,即使文档 ID 没变,旧向量也可能已过时;保留内容版本,才能区分检索算法问题与索引没有更新。
第二步:同维度还不够,要属于同一向量空间
查询和文档需要按同一套兼容的模型与编码流程得到向量。同为 1024 个数字,并不能说明来自不同模型的两组坐标可比较;修改输出维度也应建立对应的新索引并重新验收。OpenAI 向量指南
这里的“一套流程”不要求两端文字处理完全相同。有的模型区分短查询与长文档,需要配套的 query/document 提示或编码方法。Sentence Transformers 对这类非对称检索推荐使用相应的 encode_query 与 encode_document;应按模型规定配对使用。语义检索说明
入库和查询都检查三件事:每条长度符合声明维度;分量是有限数字,不是字符串、布尔值或 NaN/Infinity;向量不是全零。本文工具把零向量视作需排查的数据,直接拒绝计算余弦。不要用截断、补零或把异常值改成 0 来掩盖问题。
第三步:计算余弦,先验证排序代码
余弦相似度是点积除以两条向量长度的乘积:cos(a,b) = dot(a,b) / (norm(a) × norm(b))。对非零向量,它衡量方向接近程度;分数不是答案正确概率。只有满足单位长度归一化等条件,才能把点积直接当余弦使用。计算定义
下载向量检查与相似度演练包,解压后在目录里运行:
python3 embedding_check.py example-synthetic.json --top-k 3
包内只有 Python 标准库代码、人工向量、说明和空白验收表,无需 API Key。人工查询 [1,0,0] 对应三个文档向量,预期顺序是 doc-a: 1、doc-b: 0、doc-c: -1。输入故意打乱 data 顺序,检查程序能否仍把分数归到正确文档 ID。
工具采用自定义清单,并非直接接收所有服务商响应。它检查完整索引、数值、维度和 space_id,再计算前 K 项;标记相同只证明你填写一致,不能验证真实模型身份。详细字段和限制见包内 README,base64 需先正确解码,跨批数据需先恢复明确映射。
第四步:用真实查询验收候选,不只看最高分
数值演练通过后,才开始对自己的语料评估。先准备真实问题及其相关文档 ID,包含同义表达、容易混淆的内容和库中没有答案的问题,再固定语料版本、编码配置与 K 比较。检索评价需要查询、语料和相关性标注;不是用模型自己给出的相似度代替标签。检索评价所需数据
| 查询类型 | 重点记录 |
|---|---|
| 同义表达 | 相关材料是否进入前 K,排在何处 |
| 名字相近但条件不同 | 是否把过期规则或不同产品混进来 |
| 库中没有答案 | 是否正确保留“无合格候选”这一结果 |
包内 retrieval-acceptance.csv 可填写预期文档、实际候选、分数、相关条数及接纳理由。先人工标注再对照结果;调整阈值时使用一组样本,另留未参与调整的问题检查,避免只把已知示例调好。
比较两次结果时,一次只改一个主要因素,例如模型或切分方式,并保留各自配置。若相关材料没有进入候选,先检查配对、语料版本和编码;若进入候选却不能回答问题,则回到原文确认是否缺少必要条件。增加 K 会多取材料,也可能增加干扰,不能只记录“返回条数更多”。
交给后续流程的记录至少带查询 ID、文档 ID、原文定位、版本、分数及接纳理由。这样即使生成答案有误,也能回查是没有检索到材料,还是后续误读了材料,而不是把整条链路统一归为“模型不好”。
前 K 排序会从现有向量中选出最近的项,不能据此认定它们合格。阈值要结合模型、语料和错误代价验证,不设通用的“0.8 即通过”。送入重排或回答流程前,再核对原文、版本、访问权限;最终输出仍可按JSON 与事实验收检查。重复生成向量的用量则单独按账单核对方法记录,不从相似度推断费用。
常见问题
维度相同就能混用不同模型的向量吗?
不能。长度相同不代表坐标含义相同。查询与文档应使用兼容的同一空间;更换模型后分别重建、比较,不直接混排旧向量。
余弦 0.8 是 80% 准确吗?
不是。它是向量方向的相似度数值。是否相关需要业务标签验证,不同模型和语料不能照搬同一阈值。
已返回前 K 条,为什么仍可能没有答案?
排序只回答“谁更近”,语料可能根本没有相关内容。保留无答案测试和拒绝候选的规则,不强制把第一条当依据。
这个演练能证明 API 或模型效果正常吗?
不能。它只验证本地数值检查、索引配对与余弦排序。真实语义效果需用实际生成的向量和标注查询另行评估。
已有候选片段,怎样再做重排序?
向量检索取得候选后,可按任务考虑重排序。参见Rerank 结果配对与检索验收:保持候选 ID、核对返回索引、比较同一组查询的结果。重排序不能补回未进入候选集的证据,相关性分数也不等于答案准确率。
