Embedding 到底把什么变成了向量?别把语义相似当成答案
Embedding 负责把文本放进可比较的语义空间,但它不理解权限、时间和业务优先级。RAG 的第一步,是知道它能做什么,也知道它做不到什么。
面试官问:“Embedding 是怎么工作的?”
很多回答会从“把文本转成向量”开始,然后一路讲到维度、余弦相似度,最后停在这里。听起来没错,但工程上最危险的误会也从这里开始:相似,不等于正确;靠近,不等于有权限。
先给一个能复述的答案
Embedding 模型把文本映射到一个向量空间,使语义相近的内容在这个空间里距离更近。检索时,把问题和文档块编码后用相似度找候选。但向量只表达训练数据学到的语义关系,不能自动判断版本、权限、时间有效性和事实真伪,所以生产 RAG 必须把元数据过滤、关键词检索、重排和评测放在向量召回之外。
一、向量表达的不是“知识点”,而是关系
同一句话换一种说法,向量通常仍然会靠近;一个错误的答案,如果用词和问题很像,也可能被排到前面。Embedding 适合回答“哪些片段可能相关”,不适合单独承担“哪一条一定正确”。
常见的相似度包括余弦相似度、点积和欧氏距离。选哪一个要看模型训练方式和索引配置,不能把三个名字当成可互换的装饰品。更重要的是,线上要记录相似度分布,而不是只记录 top-k 的文本。
二、文本为什么通常不是一个向量
检索文本时至少要区分三种信息:
| 信息 | 作用 | 典型问题 |
|---|---|---|
| 词元级表示 | 保留局部词义和句法关系 | 长文本中细节容易被平均 |
| 句子/段落级表示 | 做语义匹配和召回 | 专有名词可能被稀释 |
| 文档级表示 | 体现主题和整体语境 | 粒度太粗,难以直接回答 |
工程上经常把文档切块后再编码,就是在用段落级向量换取可定位性。块越长,语境越完整;块越短,定位越精确。这个取舍要回到真实问题集验证。
三、为什么“换个更大的 Embedding 模型”不是万能药
如果问题来自版本号、错误码或产品缩写,关键词检索可能比语义向量更可靠;如果问题跨越多个段落,单个 chunk 再强也补不回缺失上下文;如果文档过期,向量只会很认真地召回旧答案。
上线前我会做四组对照:原模型、候选模型、关键词、混合检索。固定同一批问题,比较 Recall@k、MRR、延迟、重复率和最终引用正确率。只看一两个“答对了”的 Demo,等于拿天气预报验证气候模型。
四、Embedding 失败怎么定位
- 查询向量异常:检查语言、截断、空文本和归一化。
- 分数整体偏低:检查模型与索引距离度量是否匹配。
- 召回内容相关但不完整:回到分块和父子块策略。
- 专有名词命中差:加入 BM25、别名词典或查询改写。
- 结果正确但不可用:检查权限、版本和更新时间过滤。
60 秒面试回答
“Embedding 是把文本映射到语义向量空间,便于按相似度找候选证据。它解决的是语义匹配,不负责事实判断、权限校验和版本选择。我们会用分块后的段落做向量召回,再结合关键词、元数据过滤和重排,并用 Recall、MRR、引用准确率和最终回答质量共同评估,而不是只看相似度分数。”
继续追问
- 多语言 Embedding 的向量空间一定对齐吗?
- 为什么同一模型换索引后分数分布会变化?
- 什么时候该用 reranker,而不是继续换 Embedding?