跳到主要内容

向量检索与混合检索 — 把「意思」变成可以算的距离

这一章讲三件事: 向量检索的四个零件各自解决什么问题; 用一篇爱因斯坦论文把最小 RAG 从零走到出答案;再加一路全文检索, 拼成混合检索——并看清分数合并时要踩的那个坑。这一章的机制贯穿全书每一章。

1. 顶层全景:检索器 + 生成器

RAG 应用就两个部件:检索器(找到相关材料)和生成器(拿材料写答案)1。 生成器一侧有个隐性好处:知识都在检索侧,模型不必大——更小、更快、更便宜, 幻觉也更少,因为它只负责「读懂材料、组织语言」,不负责「记得全世界」2。 本章把检索器拆开:

建库时: 文本语料 → 分块 → 逐块算嵌入 → 存进带向量索引的数据库
提问时: 问题 → 用同一个嵌入模型算嵌入 → 向量索引找最近邻 → 取回原文块 → 交给生成器

图说:两列的关键约束是同一个——建库和提问必须用同一个嵌入模型。

2. 四个零件,各管一件事

零件一:嵌入——把文字变成一串数

机器不会算「两句话意思近不近」,但很会算「两组数距离远不远」。 所以第一步是把每段文字交给嵌入模型(专门把文字压成一串数,并让 意思相近的文字得到的数串也相近的模型),产出的数串就叫嵌入3

嵌入的长度叫维度(数串里有几个数)。维度越高能装的信息越多, 但生成和检索的计算也越贵4。本章实战用的是 OpenAI 的 text-embedding-3-small,1536 维5;书里也给了本地就能跑的替代品 all-MiniLM-L12-v26

一条硬规矩:全程只能用同一个嵌入模型。 库里的数串和问题的数串必须出自 同一个模型才有可比性;换模型 = 全库重算重灌7

零件二:余弦相似度——怎么比较两串数

比较两个嵌入有常见的两种算法:欧氏距离(量两点间的直线距离) 和余弦相似度(量两个方向夹得多近)。书里的选择理由: 余弦相似度就是给「两个方向夹得多近」打的分——文本场景下夹角代表「意思有多像」,输出 0 到 1, 1 表示完全相同,是对文本问答最合适的8

零件三:分块——每段话切多大

整篇文章算一个嵌入,会把文章里所有不同的想法平均成一团糊, 检索时谁都匹配不上;切得越碎,每个嵌入越聚焦,检索越准9。 这个切分动作叫分块

分块没有标准答案——按句切、按段切、按固定字数加滑动窗口都行, 要按数据和使用场景实验10。本章实战:500 字符一块、相邻块重叠 40 字符 (重叠是为了让跨块的答案不至于被切断),并且只在空格处下刀, 避免把单词劈成两半11

零件四:向量索引——百万段落里怎么找得快

段落多了以后,逐一比较是来不及的。向量索引是一种把向量组织起来 方便查找的数据结构;用索引的检索就叫近似最近邻(不苛求「最近的那个」,够近就算)搜索—— 拿速度换那一点点准确率12

四个零件到齐。第 12 章会交代承载它们的数据库本体;这里只需知道: 书里用的是 Neo4j,每块文字存成一个节点,节点上挂 text 和 embedding 两个属性, 再对 embedding 建向量索引13

3. 主走查:一篇爱因斯坦论文,从建库到答案

书里的实战材料是论文《Einstein's Patents and Inventions》 (爱因斯坦的专利与发明)14。走查从头到尾:

第 1 步 建库:全文按 500 字符/40 重叠切分 → 89 个块[^14]
→ 逐块算嵌入(每条 1536 个数)[^4] → 存库、建向量索引

第 2 步 提问:"At what time was Einstein really interested
in experimental works?"(爱因斯坦什么时候真正对实验工作感兴趣?)

第 3 步 用同一个嵌入模型把问题变成 1536 维的嵌入

第 4 步 向量索引返回最相似的两块:
第 42 块,得分 0.8185——内容讲他少年时在父亲工厂摆弄机器、
在 ETH(苏黎世联邦理工学院)读书时 genuinely interested in 实验工作
第 44 块,得分 0.7906——内容讲他的主要职业是理论物理、发明是消遣,
列出与 Szilard 合作的制冷系统等三项发明[^15]

第 5 步 两块原文 + 问题塞进 prompt,限定「只准用给出的材料作答」

第 6 步 LLM 输出:"During his ETH days, Einstein was genuinely
interested in experimental works."[^16]

每一步旁边都有具体的数:89 块、1536 维、0.8185、0.7906。 这些分数是向量索引真实返回的,不是编的——它们顺手演示了余弦相似度的量感: 0.8 出头就算「高度相关」,不是我们直觉里的「八成像」。

最小 RAG 到此走通。但第 4 步里藏着这个方案的第一个裂缝——往下看。

4. 混合检索:两路搜索,一个榜

向量检索什么时候会失手

纯向量检索对「精确词」不敏感。用户搜一个编号、一个人名、一个术语, 语义上「意思相近」的段落会挤掉「包含这个词」的段落。 全文检索(传统的关键词搜索)正好相反:按词的精确匹配来找, 意义理解为零15。两路各有所长,于是有了混合检索: 两路都查,把结果合到一个榜上。

关键机制:归一化,否则两路的分没法比

归一化,就是把两路分数折算成同一把尺。向量检索的分数是余弦相似度(0 到 1),全文检索的分数是另一套口径 (跟词频相关,数值范围完全不同)。直接把两个分数排在一起, 等于拿「摄氏度」和「华氏度」比大小。书里的做法: 每一路的分数都除以这一路的最高分——两路的第一名都变成 1.0, 其余分数变成「相当于本路第一名的几成」,这才有了可比性16。 合流后再去重,取前 k 条17

走查续:同一个问题,混合检索改变了什么

拿第 3 节同一个问题再跑一遍混合检索(取前 4 条)18:

向量路第一名:第 42 块 → 归一化后 1.0(和纯向量检索的第一名相同)
全文检索路追上来一个新结果:第 31 块 → 0.9836
——它讲爱因斯坦离开专利局、去苏黎世大学任教的经历,
纯向量检索时它根本没进前二;靠「关键词精确命中」挤进了榜[^21]

第二名变了,这就是混合检索的价值:每一路都能捞回另一路漏掉的

5. 作者的判断与证据

  • 「混合检索比单路好,但顶仍然很低」——书里的原话方向:两路合用 在某些场景确实更好,但只用非结构化数据时,质量、准确率、性能仍有明显天花板, 因为「文中的引用关系抓不到,周边上下文(材料周围的前后文)经常不足以让 LLM 理解含义」19。 这句话是第 04-10 章全部存在的原因;
  • **余弦优于欧氏(文本场景)**是书里明确给的工程判断8,但没有给实验数字;
  • 分块「没有标准答案、必须实验」10——这是本领域少有的被作者直说的「没有理论」地带。

判断(我们的,不是书里的): 本章四个零件里,对最终答案质量影响最大、 也最常被省事跳过的,是分块。嵌入模型和索引是「选型问题」,分块是「数据问题」—— 你手里文档的结构(条款、小节、表格)才是分块策略的依据, 这也是第 07 章按合同条款切分、第 08 章按 24 卷书切分的共同母题。 如果错,会错在: 如果某类材料本来就短而均质(聊天记录、短邮件), 分块策略的收益会缩水,选型反而更重要——按材料形态判断,别套模板。

6. 边界与局限

  • 书里本章的实战只建了「扁平的块」:块与块之间没有任何关系, 这正是它检索能力的上限(第 04 章开始给块挂结构);
  • 归一化只解决了「两路分数可比」,没有解决「两路该各占几个名额」—— 更精细的融合策略(RRF 等)书里没讲(补充(不在书里,来自通用知识): 倒数排名融合是业界常用的替代方案,不依赖分数绝对值);
  • 500/40 这组参数(切块时定下的两个数)只对这一篇论文有效,书里明说换个场景就要重调11;
  • 全文检索依赖词形完全匹配,单复数、时态变化会漏——书里没有展开, 这是它比向量检索「脆」的一面(补充(不在书里,来自通用知识))。

7. 可带走的

  1. 嵌入 = 让意思变成距离;嵌入模型全程唯一,换模型等于全库重灌;
  2. 余弦相似度(0–1)是文本问答的默认选择,0.8 出头就算强相关;
  3. 分块是被大多数教程一笔带过、却最影响检索质量的一步,没有标准答案、必须实验;
  4. 向量索引用「近似」换速度,百万段落级别的检索靠它才可行;
  5. 混合检索 = 向量一路 + 关键词一路,各自捞回对方漏掉的;
  6. 两路合榜前必须归一化(各除以本路最高分),否则分数不可比;
  7. 纯非结构化检索的天花板:引用关系抓不到、上下文不够——往后所有章节都在拆这堵墙。

8. 原文地图

主题原书章原文位置
检索器+生成器2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:35(搜「two main components」)
嵌入定义2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:71(搜「semantic classification」)
同一模型、换模型重灌2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:74(搜「stays the same」)
维度2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:77(搜「embedding dimension」)
余弦 vs 欧氏、0–12 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:60(搜「cosine similarity and」) · text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:65(搜「0 and 1」)
分块定义与目的2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:88(搜「splitting up text」)
没有标准答案2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:96(搜「no right answers」)
向量索引、近似最近邻2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:47(搜「strictly required」) · text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:50(搜「approximate nearest neighbor」)
小模型也够用2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:111(搜「as large」)
爱因斯坦论文语料2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:173(搜「Einstein's Patents」)
500/40、只在空格切2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:186(搜「500 characters」) · text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:189(搜「chunk at spaces」)
89 块2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:229(搜「89 chunks」)
1536 维2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:260(搜「1536 dimensions」)
all-MiniLM 替代品2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:235(搜「all-MiniLM」)
问题与检索结果(0.8185/42、0.7906/44)2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:333(搜「really interested」) · text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:371(搜「0.8185」) · text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:384(搜「0.7906」)
ETH days 答案2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:435(搜「During his ETH days」)
全文检索=精确匹配2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:453(搜「exact match」)
归一化2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:470(搜「normalize the scores」)
混合结果(1.0/42、0.9836/31)2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:523(搜「1.0 42」) · text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:537(搜「0.9835」) · text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:542(搜「better match」)
非结构化检索的天花板2 Vector similarity search and hybrid searchtext/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:551(搜「References in the」)

Footnotes

  1. 出处:「2 Vector similarity search and hybrid search」第 35 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:35,搜「two main components」)。

  2. 出处:「2 Vector similarity search and hybrid search」第 111 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:111,搜「as large」)。原文:RAG 相对微调的好处之一是模型不必那么大;用语言模型为的是生成文本的能力而非知识,更小、更快、更省,也更能基于检索到的材料作答、更少编造。

  3. 出处:「2 Vector similarity search and hybrid search」第 71 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:71,搜「semantic classification」)。原文:文本语义分类的产物叫嵌入;所有要参与向量相似度检索的文本都必须先转成嵌入。

  4. 出处:「2 Vector similarity search and hybrid search」第 77 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:77,搜「embedding dimension」)。原文:维度决定嵌入能承载多少信息;维度越高,生成与检索的计算开销越大。

  5. 出处:「2 Vector similarity search and hybrid search」第 253 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:253,搜「text-embedding-3-small」)与第 260 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:260,搜「1536 dimensions」)。

  6. 出处:「2 Vector similarity search and hybrid search」第 235 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:235,搜「all-MiniLM」)。原文:经 Sentence Transformers 提供的 all-MiniLM-L12-v2 是 OpenAI 嵌入模型的好替代,可在本地 CPU 上跑。

  7. 出处:「2 Vector similarity search and hybrid search」第 74 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:74,搜「stays the same」);建索引时维度定了、换模型要重建索引见第 287 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:287,搜「recreate the vector index」)。

  8. 出处:「2 Vector similarity search and hybrid search」第 60 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:60,搜「cosine similarity and」)与第 65 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:65,搜「0 and 1」)。原文:欧氏距离表示文本的内容与强度(本书场景不重要);余弦相似度量夹角,在文本嵌入场景代表两段文字意思有多像;0 表示完全不同,1 表示相同;被认为最适合文本聊天机器人。 2

  9. 出处:「3 Advanced vector retrieval strategies」第 139 段(text/12-ch03-3-advanced-vector-retrieval-strategies.txt:139,搜「blur distinct ideas」)。原文:嵌入整个长文档时,向量会经由平均把不同的想法糊在一起,难以匹配具体查询。

  10. 出处:「2 Vector similarity search and hybrid search」第 96 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:96,搜「no right answers」)。原文:这些问题没有标准答案,取决于用例、数据和领域,要尝试不同方法。 2

  11. 出处:「2 Vector similarity search and hybrid search」第 186 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:186,搜「500 characters」)与第 189 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:189,搜「chunk at spaces」)。原文:滑窗 500 字符、重叠 40,索引变大但检索更准;只在空格处切,让块首尾不出现残词。 2

  12. 出处:「2 Vector similarity search and hybrid search」第 47 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:47,搜「strictly required」)与第 50 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:50,搜「approximate nearest neighbor」)。原文:向量索引不是必需但强烈推荐;它找的是非常接近最近邻的向量,是速度与准确率之间的取舍。

  13. 出处:「2 Vector similarity search and hybrid search」第 268 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:268,搜「single node type」)。原文:数据模型只有一个 Chunk 节点类型,带 text 和 embedding 两个属性;建向量索引见第 294 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:294,搜「CREATE VECTOR INDEX」)。数据库本体的选择与安装见第 12 章。

  14. 出处:「2 Vector similarity search and hybrid search」第 173 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:173,搜「Einstein's Patents」)。原文:论文题为《Einstein's Patents and Inventions》(Caudhuri, 2017);书末参考文献给出 arXiv:1709.00666(出处:「references」第 4 段,text/22-fm-references.txt:4,搜「Einstein」)。

  15. 出处:「2 Vector similarity search and hybrid search」第 453 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:453,搜「exact match」)。原文:全文搜索按关键词精确匹配,不是在向量空间里按相似度。

  16. 出处:「2 Vector similarity search and hybrid search」第 470 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:470,搜「normalize the scores」)。原文:为比较两路分数,把每路分数除以该路最高分。「摄氏/华氏」的比方便是我们加的(补充(不在书里,来自通用知识))。

  17. 出处:「2 Vector similarity search and hybrid search」第 493 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:493,搜「deduplicate」)。原文 Cypher:合并两路结果、按分数排序取前 k 条。

  18. 出处:「2 Vector similarity search and hybrid search」第 503 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:503,搜「similar_hybrid_records」)。k=4。

  19. 出处:「2 Vector similarity search and hybrid search」第 551 段(text/11-ch02-2-vector-similarity-search-and-hybrid-search.txt:551,搜「References in the」)。原文:引用不总被抓到,周边上下文常不足以让 LLM 生成好答案。