147、RAG 检索增强生成(一):Embedding、向量检索、语义相似度的底层原理
147、RAG 检索增强生成(一):Embedding、向量检索、语义相似度的底层原理一个让我失眠的Bug去年做某个企业知识库问答系统,用户问“我们公司去年Q3的报销流程是什么”,系统返回了“2021年员工生日会通知”。当时我盯着屏幕,咖啡杯差点摔地上——明明两个句子毫无关系,为什么向量检索会匹配上?后来排查发现,问题出在Embedding模型对“流程”和“通知”这类高频词的过度敏感,加上向量检索时距离度量选错了。这个坑让我花了整整两天重读论文和源码,也让我意识到:RAG不是简单的“把文本转成向量然后搜一下”,底层原理不搞透,线上迟早要翻车。Embedding:把文字变成数学能懂的东西先别急着调库。Embedding的本质,是把离散的、人类能理解的文字符号,映射到连续的、机器能计算的向量空间。这个过程不是随机的,而是通过大量语料训练,让语义相近的词在向量空间中距离更近。词嵌入 vs 句子嵌入很多人一开始会混淆这两个概念。词嵌入(如Word2Vec、GloVe)给每个词一个固定向量,但“苹果”这个词在“吃苹果”和“苹果公司”里语义完全不同,词嵌入无法区分。句子嵌入(如BERT、Sentence-BERT)则考虑上下文,输出整个句子的向量。这里踩过坑:早期我用Word2Vec做RAG,用户搜“苹果手机”,结果返回了“苹果很好吃”。因为两个“苹果”向量一样,模型根本不知道语境。后来换成Sentenc