Embedding 是什么?为什么语义相近的两句话向量距离就近?
谁在问:一面必问;RAG 方向岗位必问且会往深处追
口语化问法
- 你解释一下 embedding 是什么?为什么意思像的两句话,算出来的向量就靠得近?
- 『能报销』和『不能报销』这两句话,向量距离远不远?
- 你们的检索效果不好,为什么不直接换个排行榜上更靠前的 embedding 模型?
考察意图
前半句是送分,后半句才是题眼。面试官在看:
- 你解释「为什么就近」时,是说「模型理解了语义」(含糊),还是说得出训练目标(准确);
- 你知不知道这套机制的已知失真——否定、精确值、一段多义;
- 你清不清楚换 embedding 模型的真实代价,从而知道它该排在优化序列的哪个位置。
参考答案
60 分答案(及格线)
Embedding 是把一段文本编码成一个定长的实数向量,比如 1024 维。语义相近的文本在这个向量空间里方向接近,所以可以用余弦相似度来衡量它们像不像。检索时把文档提前编码存进向量库,查询时编码 query,再找最近的若干条。
90 分答案(有生产经验的回答)
补三层:
第一,「近」不是天然的,是训练出来的。 主流 embedding 模型用对比学习训练:给大量(查询,相关文档)配对当正样本、不相关的当负样本,用损失函数把正样本拉近、负样本推远。所以**「近」的定义 = 训练数据里被判为相关的那种关系**。说「模型理解了语义所以就近」是把结果当成了原因。
第二,理解了这一点,就能直接推出它的失真在哪。 训练数据里几乎没有「一句话和它的否定形式应该被推远」这类样本,所以「能报销」和「不能报销」余弦相似度极高;年份、型号、错误码这类精确 token 在稠密向量里没有专属维度,会被稀释;一个 chunk 同时讲三件事,它的向量落在三件事的平均位置,对哪件都不够像。这三条正是混合检索、分块策略、rerank 存在的理由,而不只是「工程上稳一点」。
第三,换模型是最贵的一步。 不同模型的向量空间毫无可比性,不能混用,换模型意味着全库重新编码 + 重建索引 + 重跑评测。所以我们的优化顺序是:先查前缀/指令用法是否正确 → 再查覆盖率和分块 → 再上 rerank 和 query 改写 → 最后才考虑换 embedding。
追问链
为什么向量近就代表语义相近?模型是怎么学会的?
期望对比学习:正样本拉近、负样本推远 —— 「相关」的定义来自训练数据,不是模型天生就懂;负样本质量(尤其难负样本)直接决定效果信号说得出训练目标 → 进 90 分区;只会说「模型理解了语义」 → 停在 60 分,这句话解释不了任何一个实际故障「哪些费用能报销」和「不能报销」向量近吗?这为什么是个问题?
期望非常近 —— 话题一致,否定只是个低权重信号,方向几乎不变。后果是语义相反的文档排在前面,生成侧拿到「看起来高度相关」的错误证据,比完全没召回更危险;解法走 BM25 字面命中、query 改写把否定显式化、元数据结构化过滤信号能指出「比没召回更危险」 → 真见过这个坑造成的线上问题为什么很多 embedding 模型要求 query 和文档用不同前缀?
期望检索是非对称的:一侧短问句、一侧长段落,「像不像」和「答不答得上」是两个目标;指令感知模型训练时就分了两侧,用错前缀或只给一侧,效果明显下降 —— 最坑的是这种下降不报错,很多「模型不行」的判断其实错在这里信号知道这个坑还强调「不会报错」 → 一定亲手排查过检索效果维度是不是越大越好?换模型要付什么代价?
期望维度大了存储、内存、检索耗时都涨且收益递减,部分模型支持维度截断按需取一档;换模型的代价是全库重编码 + 索引重建 + 评测重跑,还要保证距离度量与归一化和训练一致、在线离线两侧一致信号说得出「度量方式要和训练时一致」 → 真配过向量库;只谈维度不谈度量 → 通常只调过 API用户抱怨「答非所问」,你怀疑是 embedding 的锅 —— 动手换模型前怎么证伪?
期望① 手工塞正确文档,切开检索/生成侧 → ② 检索侧切三刀:根本没有(覆盖率)/没召回(embedding 或分块)/排在 20 名外(rerank)→ ③ 标几十条 query:recall@50高而recall@5低 → 排序问题,换模型不解决 → ④ 先查最便宜的:前缀、度量一致、一段多义 → ⑤ 换 embedding 排最后,唯一要全库重建信号第一刀就说「手工塞正确文档」、并用recall@5与recall@50的差距分开召回与排序 → 排过障;上来比模型榜单分数 → 没归因习惯
评分要点
- 说清 embedding 是定长向量表示,检索用余弦相似度
- 用对比学习解释「为什么就近」,而非「模型理解了语义」
- 能说出至少两条已知失真(否定 / 精确值 / 一段多义)
- 知道 query 与文档侧需要不同前缀,且用错不报错
- 知道向量不可跨模型混用,换模型要全库重建
- 知道距离度量与归一化必须和训练一致、离线在线一致
- 排障时先切检索侧/生成侧,再用 recall 曲线区分召回与排序