Embedding 是什么?为什么语义相近的两句话向量距离就近?

Q1-06Embedding高频Embedding向量余弦相似度对比学习语义空间

谁在问:一面必问;RAG 方向岗位必问且会往深处追

口语化问法

  • 你解释一下 embedding 是什么?为什么意思像的两句话,算出来的向量就靠得近?
  • 『能报销』和『不能报销』这两句话,向量距离远不远?
  • 你们的检索效果不好,为什么不直接换个排行榜上更靠前的 embedding 模型?

考察意图

前半句是送分,后半句才是题眼。面试官在看:

  1. 你解释「为什么就近」时,是说「模型理解了语义」(含糊),还是说得出训练目标(准确);
  2. 你知不知道这套机制的已知失真——否定、精确值、一段多义;
  3. 你清不清楚换 embedding 模型的真实代价,从而知道它该排在优化序列的哪个位置。

参考答案

图 2 · 60 分与 90 分差在哪:代价、演进、怎么验证

60

60 分答案(及格线)

Embedding 是把一段文本编码成一个定长的实数向量,比如 1024 维。语义相近的文本在这个向量空间里方向接近,所以可以用余弦相似度来衡量它们像不像。检索时把文档提前编码存进向量库,查询时编码 query,再找最近的若干条。

90

90 分答案(有生产经验的回答)

补三层:

第一,「近」不是天然的,是训练出来的。 主流 embedding 模型用对比学习训练:给大量(查询,相关文档)配对当正样本、不相关的当负样本,用损失函数把正样本拉近、负样本推远。所以**「近」的定义 = 训练数据里被判为相关的那种关系**。说「模型理解了语义所以就近」是把结果当成了原因。

第二,理解了这一点,就能直接推出它的失真在哪。 训练数据里几乎没有「一句话和它的否定形式应该被推远」这类样本,所以「能报销」和「不能报销」余弦相似度极高;年份、型号、错误码这类精确 token 在稠密向量里没有专属维度,会被稀释;一个 chunk 同时讲三件事,它的向量落在三件事的平均位置,对哪件都不够像。这三条正是混合检索、分块策略、rerank 存在的理由,而不只是「工程上稳一点」。

第三,换模型是最贵的一步。 不同模型的向量空间毫无可比性,不能混用,换模型意味着全库重新编码 + 重建索引 + 重跑评测。所以我们的优化顺序是:先查前缀/指令用法是否正确 → 再查覆盖率和分块 → 再上 rerank 和 query 改写 → 最后才考虑换 embedding。

追问链

图 1 · 五层追问树:面试官会往哪儿挖
五层全在拆同一句话:「近」不是天然的,是训练出来的

  1. 为什么向量近就代表语义相近?模型是怎么学会的?

    期望对比学习:正样本拉近、负样本推远 —— 「相关」的定义来自训练数据,不是模型天生就懂;负样本质量(尤其难负样本)直接决定效果
    信号说得出训练目标 → 进 90 分区;只会说「模型理解了语义」 → 停在 60 分,这句话解释不了任何一个实际故障
  2. 「哪些费用能报销」和「不能报销」向量近吗?这为什么是个问题?

    期望非常近 —— 话题一致,否定只是个低权重信号,方向几乎不变。后果是语义相反的文档排在前面,生成侧拿到「看起来高度相关」的错误证据,比完全没召回更危险;解法走 BM25 字面命中、query 改写把否定显式化、元数据结构化过滤
    信号能指出「比没召回更危险」 → 真见过这个坑造成的线上问题
  3. 为什么很多 embedding 模型要求 query 和文档用不同前缀?

    期望检索是非对称的:一侧短问句、一侧长段落,「像不像」和「答不答得上」是两个目标;指令感知模型训练时就分了两侧,用错前缀或只给一侧,效果明显下降 —— 最坑的是这种下降不报错,很多「模型不行」的判断其实错在这里
    信号知道这个坑还强调「不会报错」 → 一定亲手排查过检索效果
  4. 维度是不是越大越好?换模型要付什么代价?

    期望维度大了存储、内存、检索耗时都涨且收益递减,部分模型支持维度截断按需取一档;换模型的代价是全库重编码 + 索引重建 + 评测重跑,还要保证距离度量与归一化和训练一致、在线离线两侧一致
    信号说得出「度量方式要和训练时一致」 → 真配过向量库;只谈维度不谈度量 → 通常只调过 API
  5. 用户抱怨「答非所问」,你怀疑是 embedding 的锅 —— 动手换模型前怎么证伪?

    期望① 手工塞正确文档,切开检索/生成侧 → ② 检索侧切三刀:根本没有(覆盖率)/没召回(embedding 或分块)/排在 20 名外(rerank)→ ③ 标几十条 query:recall@50 高而 recall@5 低 → 排序问题,换模型不解决 → ④ 先查最便宜的:前缀、度量一致、一段多义 → ⑤ 换 embedding 排最后,唯一要全库重建
    信号第一刀就说「手工塞正确文档」、并用 recall@5recall@50 的差距分开召回与排序 → 排过障;上来比模型榜单分数 → 没归因习惯
只会说「模型理解了语义」的,第 1 层就露底。真正的分水岭在第 3 层和第 5 层:前者考「用错前缀不报错」这种静默坑,后者考换模型之前的归因顺序。

评分要点

  1. 说清 embedding 是定长向量表示,检索用余弦相似度
  2. 用对比学习解释「为什么就近」,而非「模型理解了语义」
  3. 能说出至少两条已知失真(否定 / 精确值 / 一段多义)
  4. 知道 query 与文档侧需要不同前缀,且用错不报错
  5. 知道向量不可跨模型混用,换模型要全库重建
  6. 知道距离度量与归一化必须和训练一致、离线在线一致
  7. 排障时先切检索侧/生成侧,再用 recall 曲线区分召回与排序

常见错误

只说「把文字变成向量,模型理解了语义所以就近」,再问就没了。
认为 embedding 能处理否定和精确数值。
认为维度越大效果越好。
不知道 query 和文档要用不同前缀,或以为那只是可选的优化。
遇到检索效果差,第一反应是照着榜单换模型。
含糊标志词:「向量数据库会自动处理」「用最新的模型就行」「相似度高就是相关」。

关联学习