吃透RAG核心-----语义检索与关键字检索底层原理

一、「Embedding」到底是什么?

Embedding "就是把文本映射到向量空间",打个比方:就是给每一段文本(词 / 句子 / 文档)发一个「语义 GPS 坐标」

  • 语义越接近的文本,坐标在向量空间里就离得越近;
  • 语义越不相关的,坐标就离得越远。

举个例子: "银行、金钱、苹果" 的例子:

  • "银行" 和 "金钱" 语义强相关,所以它们的 GPS 坐标离得近,余弦相似度 0.5;
  • "银行" 和 "苹果" 语义几乎无关,坐标离得远,相似度只有 0.25;
  • 而 "银行" 和它自己的坐标完全重合,相似度是 1。

One-hot 为什么不行?

因为它给每个词的坐标都是 "完全正交" 的

最早的 One-Hot 编码是非黑即白 的逻辑,只有 0 和 1 两种状态。每个词语都是独立孤立的向量,彼此完全没有关联。有个很大的硬伤:很多词语字面毫无交集,但语义高度相关,比如银行和金钱。One-Hot 完全识别不出这种深层关联,只会判定两者毫无关系,根本没法做语义匹配。

后面引入余弦相似度就解决了这个问题:通过计算向量空间里两个向量的夹角,量化语义相似度。数值为 1 代表完全相同,0 代表毫无关联,-1 代表语义完全相反。靠这种方式,就能精准识别出字面不同、但意思相近的文本,完美弥补了 One-Hot 的缺陷。


二、「Word2Vec/GloVe」:怎么捕捉 "国王 - 男人 + 女人 = 女王"?

Word2Vec 的 CBOW 和 Skip-Gram:

  • CBOW:用上下文预测中心词(比如用 "我 ___ 苹果" 预测 "吃");
  • Skip-Gram:用中心词预测上下文(比如用 "吃" 预测 "我、苹果")。这两种方法本质上都是让模型在 "词和词的共现关系" 里,学到语义相关性------ 比如 "银行" 经常和 "金钱、存钱、取钱" 一起出现,模型就会给它们分配相近的向量。

而 GloVe 为什么能捕捉更复杂的关系?

因为它不只是看 "局部上下文"(Word2Vec 只看窗口内的词),还会看全局词共现矩阵------ 统计整个语料库中,每两个词一起出现的次数。举个例子:语料库中,"国王" 和 "男人" 一起出现的次数、"女王" 和 "女人" 一起出现的次数、"国王" 和 "女王" 一起出现的次数,会形成一个稳定的比例。GloVe 会把这个比例编码到向量的不同维度里:

向量的某几个维度专门编码 "性别" 属性:男人和女人的向量在这几个维度上差异很大; 某几个维度专门编码 "王权" 属性:国王和女王的向量在这几个维度上很接近。所以当你做 "国王(王权 + 男性) - 男人(男性) + 女人(女性)" 时,相当于把 "男性属性" 去掉,加上 "女性属性",剩下的就是 "王权 + 女性" 的向量,正好对应 "女王"。这就是你说的 "词对之间的向量差异反映共现概率"------ 本质是把词的语义属性拆成了向量的不同维度,做加减就能组合出不同的词。


三、数据检索:「倒排索引」和向量库有啥区别?

传统的关键词检索方法:倒排索引、B 树、哈希索引"。

举个例子,假设我们有 3 个文档:

  • 文档 1:银行 存钱 安全
  • 文档 2:苹果 水果 好吃
  • 文档 3:银行 取钱 柜台

1. 什么是 "正排索引"?

就是我们平时想的 "文档→内容":

文档 1 → 包含词:银行、存钱、安全

文档 2 → 包含词:苹果、水果、好吃

文档 3 → 包含词:银行、取钱、柜台

搜 "银行" 的时候,你得遍历所有文档,一个个看里面有没有 "银行",文档多了(比如百万级)就很慢。

2. 什么是 "倒排索引"?

把顺序反过来,变成 "词→出现在哪些文档里":

  • 银行 → 文档 1 (词频 1)、文档 3 (词频 1)
  • 存钱 → 文档 1 (词频 1)
  • 安全 → 文档 1 (词频 1)
  • 苹果 → 文档 2 (词频 1)
  • ...(其他词同理)搜 "银行" 的时候,直接去索引里找 "银行" 这个词,就能直接拿到对应的文档 1 和文档 3,不用遍历所有文档,速度快很多。

3. 它和向量库(比如 FAISS)的本质区别?

维度 倒排索引(比如 Elasticsearch) 向量库(比如 FAISS)
匹配逻辑 关键词精确匹配(词必须完全一样) 语义模糊匹配(同义词、相关词都能匹配)
核心优势 速度极快,适合大规模关键词检索 能捕捉语义,解决 "词不达意" 的问题
缺陷 同义词、近义词搜不到(比如搜 "取款",找不到 "取钱" 的文档) 召回的结果可能语义相关但关键词不匹配,需要过滤

B 树、哈希索引,也是传统数据库的索引结构,和倒排索引一样,都是基于关键词的检索,而向量库是基于 Embedding 的相似度检索,这是 RAG 里 "混合检索" 的基础 ------ 很多企业级 RAG 会同时用倒排 + 向量检索,兼顾关键词精确匹配和语义模糊匹配,后面会讲。

  • 倒排索引 核心是关键词精准匹配 ,结构逻辑特别简单:以词语为核心,绑定对应的文档编号 + 词频 。不再是按文档找关键词,而是反过来:先搜关键词,直接就能查到这个词出现在哪些指定文档 里,不用遍历全部文档,检索速度极快。简单说:倒排索引适合定点找带特定关键词的文档,只认字面精准匹配。

  • 向量库检索 不走关键词匹配逻辑,是全局语义检索。不纠结文字表面一不一样,依托 Embedding 向量,在整个知识库中匹配语义相近的内容。哪怕提问用词和文档用词完全不同,只要语义贴合,就能被检索出来,也是 RAG 知识库最核心的检索方式。

业内还会把这俩对称叫:

  • 稀疏检索 = 倒排索引 + 布尔关键词检索
  • 稠密检索 = 向量库 + Embedding 语义检索

四、「Transformer 位置编码」

Transformer 的自注意力机制,它有个天生的问题:不认识词的顺序。比如把句子 "我吃苹果" 打乱成 "苹果吃我",自注意力算出来的权重分布几乎是一样的 ------ 因为它只看词和词的相似度,不管它们在句子里的位置。但这两个句子的意思完全相反,模型必须知道词的顺序,所以才需要「位置编码」。

位置编码的核心作用,就是给每个词加一个 "位置标签"

  • 给句子里的第 1 个词、第 2 个词、第 3 个词... 分别生成一个独一无二的 "位置向量";
  • 把这个位置向量加到词的 Embedding 向量里,变成 "词的语义 + 位置信息" 的混合向量;
  • 这样模型在计算注意力的时候,就能区分 "第 1 个位置的'我'" 和 "第 3 个位置的'我'",从而理解句子的顺序。

Transformer 里用的是「正弦 / 余弦位置编码」,简单说就是用不同频率的正弦、余弦函数,给不同位置生成不同的向量,这样位置越近的词,位置向量越相似,位置越远的词,位置向量差异越大,刚好能体现句子的顺序。

相关推荐
li星野1 小时前
位运算 & 数学 & 高频进阶九题通关(Python + C++)
c++·python·学习·算法
jerryinwuhan1 小时前
hello算法,简单讲(1)
算法·排序算法
y = xⁿ1 小时前
20天速通LeetCodeday15:BFS广度优先搜索
算法·宽度优先
目黑live +wacyltd1 小时前
算法备案:常见驳回原因与应对策略
人工智能·算法
磊 子2 小时前
多态类原理+四种类型转换+异常处理
开发语言·c++·算法
染指11103 小时前
3.AI大模型-token是什么-大模型底层运行机制
人工智能·算法·机器学习
扬帆破浪3 小时前
sidecar崩溃后前端怎么续命 重启策略与状态保留
前端·人工智能·架构·开源·知识图谱
谙弆悕博士3 小时前
快速学C语言——第19章:C语言常用开发库
c语言·开发语言·算法·业界资讯·常用函数
光影少年3 小时前
前端算法题
前端·javascript·算法