跳到主要内容

全局搜索与局部搜索 — 一个索引,两种问法

这一章讲三件事: global search 的 map-reduce 两步各自怎么转、 重要性分数怎么用;local search 怎么从入口实体扩出四类上下文; 以及一个书里没有点破、但你对照两段示例输出就能看出的现象—— 小图上两条路的输出可能几乎一样。这也是第 07-09 章的收官章。

1. 顶层全景:问题的两种形状

先给问题分类,两条路的分工立刻清楚1:

「这部书整体在讲什么?」「这些报告里的主要主题?」
→ 全局问题:答案散在全图 → global search(吃社区报告)

「Ulysses 是谁?」「洋甘菊有什么疗效?」
→ 实体问题:答案挂在某个实体周围 → local search(吃实体邻域)

两条路都跑在第 07-09 章建好的同一份资产上:厚图 + 实体摘要 + 关系摘要 + 社区报告。索引期的预计算,到这一章开始还债。

2. 全局搜索:把「读全库」变成「读几份报告」

map 步:每份社区报告独立答题

global search 的第一背骨是 map-reduce(把一个大任务拆成 多个独立小任务并行(同时一起做),再把小结果合并成总结果)的 map(拆)部分: 取全部(或过滤后的)社区报告,每一份单独过一次 LLM, 产出这份报告范围内对问题的「要点列表」2

map 提示的三个设计值得抄走:

  1. 每个要点带 0-100 的重要性分——「不知道」类回答记 0 分, 后面靠分数筛3;
  2. 不知道就直说,不准编——提示里明写:数据表里没有就不许造4;
  3. 要点要带出处编号(引用了哪份报告),最多列 5 个、多了写「+more」5

reduce 步:按重要性合成一个答案

reduce(合)部分把所有中间要点按重要性降序排好,再调一次 LLM, 合成一个 markdown 格式的最终答案;同样要求保住数据引用、 没有证据的内容不许进答案6

两个旋钮

  • rating 阈值:进 map 的社区报告先按第 09 章的影响分过滤, 低于阈值的直接不看(书里默认 5)7——省调用的第一道闸;
  • 层级选择:从社区树的哪一层取报告?低层详细但 LLM 调用多、慢; 高层抽象、快,但丢细节。书里只建了单层,这个旋钮只是点到8

3. 局部搜索:从一个实体出发的邻域快照

怎么找入口

local search 要先定位「问的是哪个实体」。办法还是第 03 章那套: 给每个实体的摘要算嵌入、建向量索引;用户问题算嵌入后, 在实体上做向量检索,最相近的几个实体就是入口9

怎么扩上下文

从入口实体出发,沿图收集四类材料,各自排序、限量10:

收什么怎么排
相关的原文块(经 HAS_CHUNK 挂在实体上)按「命中的入口实体个数」降频
相关社区报告(实体所属社区)按社区 rank 与 weight
实体间的摘要关系按关系 rank 与 weight
入口实体的摘要不另排序

四类材料组装成一个「数据表」,连同问题交给 LLM 生成答案; 提示里同样带着「不知道就直说、引用要带编号」的纪律11

注意这份清单里两种资产的合流:图的(报告、关系、摘要)+ 文本的(原文块)。 local search 回答实体问题时,既有结构化归纳(第 08 章的摘要), 又有一手原文(切块),这正是第 02 章许诺的「结构与非结构化互相挂接」的兑现。

4. 主走查:两个问题,两条路

书里的两个成品示例放在一条走查里对照。

全局路:问「What is this story about?」(这个故事讲的是什么)12

第 1 步 取社区报告,rating ≥ 5 过滤(9 个社区里留下若干)
第 2 步 map:每份报告独立产出要点,带 0-100 分
(示例要点:女神引导忒勒马科斯寻父——92 分;
Mentes 是 Taphians 人的首领——71 分……分数为演示)
第 3 步 reduce:要点按分排序、合并去重 → 最终答案
成品讲三层:伊萨卡家务事(密涅瓦引导、求婚者盘踞);
Mentes 的航海;神系恩怨(Jove、Aegisthus、Orestes 的复仇循环),
每层都挂着 [Data: Reports (1)] 这样的出处编号[^13]

局部路:问「Who is Ulysses?」(Ulysses 是谁)13

第 1 步 问题嵌入 → 实体向量索引 → 命中 ULYSSES(及相邻实体)
第 2 步 扩四类上下文:他出现的原文块、所属社区报告、
他的摘要关系(父亲 Laertes、儿子忒勒马科斯…)、他的摘要
第 3 步 组装成数据表 → LLM 生成带引用的答案

一个书里没有点破的现象:把书里印出的两段最终答案对照读, 开头几乎是同一句话(「The story revolves around the intricate dynamics of a community involving key figures such as Minerva, Telemachus…」)14。 原因不难指认——这张图只有一卷《奥德赛》、66 个实体、9 个社区, 全局问题和实体问题的答案池本来就高度重叠。 这是示例的局限,不是机制的失败:材料一多、社区一多, 两条路的输出会迅速分化(global 吃不到实体邻域的细节, local 吃不到全库归纳)。但读这本书时要带着这个折扣。

判断(我们的,不是书里的): global 与 local 的分界,本质是 「答案的熵(信息论里的词:内容有多分散)在哪」——答案均匀散在全库,归纳预计算(社区报告)才划算; 答案集中在少数实体周围,邻域检索(向量+图扩展)更准更便宜。 你手头的系统该不该上 GraphRAG,可以先统计这个构成做判据: 抽 50 个真实问题,数一数全局型的比例。 如果错,会错在: 如果问题集随时间漂移(今天全局明天点查), 静态判据会失准——但漂移本身也能从评测(第 11 章)里看出来,再补索引不迟。

5. 作者的判断与证据

  • local 的适用问题类型书里给了明确例子(「洋甘菊的疗效」这类实体深挖题)15;
  • 两级旋钮(rating 阈值、社区层级)都是书里明写的工程自由度78;
  • 社区报告可另作他用:书里在章末提了一嘴——社区摘要也能单独算嵌入, 当一路独立的向量检索器用16,「一个索引,多条检索路」的组合弹性;
  • map/reduce 提示里的「不知道就说、引用带编号、不编造」三连, 是书里从论文原样搬来的纪律,没有改动。

6. 边界与局限

  • 单卷图让示例失去区分度(第 4 节走查已说明),两条路的真实差异 要靠大材料量才能看出;
  • global search 的调用次数 = 社区数:社区一多,map 步的调用一次一次往上加, 钱和延迟都在索引期之外继续涨——书里没有给成本数;
  • 重要性分和影响分都是 LLM 打的,校准没有保证;书里没有实验验证 「0-100 分打得散不散、合不合理」;
  • local search 的四类限量参数(topChunks/topCommunities/topInsideRels) 书里给了名字没给推荐值,要自己调;
  • 没有混合路由:「这个问题该走 global 还是 local」由使用者判断, 自动判断在第 06 章的 agent 框架里,本章没有接上(书里也没接)。

7. 可带走的

  1. 全局问题找 global(社区报告 map-reduce),实体问题找 local(向量入口+图扩展);
  2. map 提示三件套:要点带 0-100 分、不知道记 0 分、引用带编号;
  3. rating 阈值是 global 的省钱闸;社区层级是粒度旋钮;
  4. local 的四类上下文(原文块/社区报告/摘要关系/实体摘要)各自排序限量;
  5. local = 结构与文本两种资产合流,第 02 章「互相挂接」在此兑现;
  6. 小图上 global 和 local 的输出可能几乎一样——别拿玩具示例当机制差异的证据;
  7. 社区摘要还能再嵌回去当独立向量检索路——索引资产可以组合复用。

8. 原文地图

主题原书章原文位置
local/global 分工7.3 Graph retrieverstext/18-ch07-03-7-3-graph-retrievers.txt:38(搜「local search and global search」)
global 用社区报告答聚合题7.3 Graph retrieverstext/18-ch07-03-7-3-graph-retrievers.txt:43(搜「intermediate responses」)
map-reduce 两步7.3 Graph retrieverstext/18-ch07-03-7-3-graph-retrievers.txt:61(搜「Map step」) · text/18-ch07-03-7-3-graph-retrievers.txt:69(搜「Reduce step」)
要点带 0-100 分、不知道记 07.3 Graph retrieverstext/18-ch07-03-7-3-graph-retrievers.txt:101(搜「0-100」)
不知道就直说7.3 Graph retrieverstext/18-ch07-03-7-3-graph-retrievers.txt:97(搜「Do not make anything up」)
引用编号、最多 5 个 +more7.3 Graph retrieverstext/18-ch07-03-7-3-graph-retrievers.txt:120(搜「+more」)
reduce 合成与保引用7.3 Graph retrieverstext/18-ch07-03-7-3-graph-retrievers.txt:144(搜「multiple analysts」)
rating 阈值默认 57.3 Graph retrieverstext/18-ch07-03-7-3-graph-retrievers.txt:199(搜「rating_threshold」)
层级选择权衡7.3 Graph retrieverstext/18-ch07-03-7-3-graph-retrievers.txt:77(搜「community hierarchy」)
全局问题成品(主走查)7.3 Graph retrieverstext/18-ch07-03-7-3-graph-retrievers.txt:258(搜「What is this story about」) · text/18-ch07-03-7-3-graph-retrievers.txt:265(搜「story revolves」)
local 的实体问题例(洋甘菊)7.3 Graph retrieverstext/18-ch07-03-7-3-graph-retrievers.txt:305(搜「chamomile」)
向量找入口实体7.3 Graph retrieverstext/18-ch07-03-7-3-graph-retrievers.txt:309(搜「entry points」)
实体摘要嵌入+索引7.3 Graph retrieverstext/18-ch07-03-7-3-graph-retrievers.txt:334(搜「text embeddings for enti」)
四类上下文排序限量7.3 Graph retrieverstext/18-ch07-03-7-3-graph-retrievers.txt:419(搜「ranked by」)
local 成品(主走查)7.3 Graph retrieverstext/18-ch07-03-7-3-graph-retrievers.txt:514(搜「Who is Ulysses」) · text/18-ch07-03-7-3-graph-retrievers.txt:521(搜「story revolves」)
社区摘要可当独立向量检索路7.3 Graph retrieverstext/19-fm-summary.txt:4(搜「standalone」)

Footnotes

  1. 出处:「7.3 Graph retrievers」第 38 段(text/18-ch07-03-7-3-graph-retrievers.txt:38,搜「local search and global search」)。原文:local 从检测出的社区内紧密相连的实体取信息;global 考虑整个图结构找最相关信息。

  2. 出处:「7.3 Graph retrievers」第 61 段(text/18-ch07-03-7-3-graph-retrievers.txt:61,搜「Map step」)。原文:按查询(可选含对话历史)取指定层级的社区报告,切成块,每块由 LLM 产出带数值重要性评分的要点列表。

  3. 出处:「7.3 Graph retrievers」第 101 段(text/18-ch07-03-7-3-graph-retrievers.txt:101,搜「0-100」)。原文:重要性分是 0-100 的整数;「我不知道」类回答记 0 分。

  4. 出处:「7.3 Graph retrievers」第 97 段(text/18-ch07-03-7-3-graph-retrievers.txt:97,搜「Do not make anything up」)。原文:数据表不足以回答时直说,不许编。

  5. 出处:「7.3 Graph retrievers」第 117 段(text/18-ch07-03-7-3-graph-retrievers.txt:117,搜「+more」)。原文:单条引用最多列 5 个记录 id,其余以「+more」示意。

  6. 出处:「7.3 Graph retrievers」第 144 段(text/18-ch07-03-7-3-graph-retrievers.txt:144,搜「multiple analysts」)。原文:把多位分析师(按重要性降序)的报告合成目标长度与格式的回答;删除无关信息;保留数据引用。

  7. 出处:「7.3 Graph retrievers」第 199 段(text/18-ch07-03-7-3-graph-retrievers.txt:199,搜「rating_threshold」)。原文:函数默认阈值 5,只取 rating 达标的社区摘要;「省钱闸」是我们的表述。 2

  8. 出处:「7.3 Graph retrievers」第 77 段(text/18-ch07-03-7-3-graph-retrievers.txt:77,搜「community hierarchy」)。原文:低层报告细但调用多、慢;高层抽象、高效但丢粒度;平衡是关键。 2

  9. 出处:「7.3 Graph retrievers」第 334 段(text/18-ch07-03-7-3-graph-retrievers.txt:334,搜「text embeddings for enti」)与第 309 段(text/18-ch07-03-7-3-graph-retrievers.txt:309,搜「entry points」)。原文:为实体摘要算嵌入、建向量索引;语义相关实体作为取数入口。

  10. 出处:「7.3 Graph retrievers」第 419 段(text/18-ch07-03-7-3-graph-retrievers.txt:419,搜「ranked by」)。原文:原文块按关联实体频次排序限量;社区报告按 rank/weight;关系按重要性;实体摘要不另排序。

  11. 出处:「7.3 Graph retrievers」第 468 段(text/18-ch07-03-7-3-graph-retrievers.txt:468,搜「transparency」)。原文:local 系统提示要求结构化引用、找不到就直说、不编造。

  12. 出处:「7.3 Graph retrievers」第 258 段(text/18-ch07-03-7-3-graph-retrievers.txt:258,搜「What is this story about」)。

  13. 出处:「7.3 Graph retrievers」第 514 段(text/18-ch07-03-7-3-graph-retrievers.txt:514,搜「Who is Ulysses」)。

  14. 出处:「7.3 Graph retrievers」第 265 段(text/18-ch07-03-7-3-graph-retrievers.txt:265,搜「story revolves」)与第 521 段(text/18-ch07-03-7-3-graph-retrievers.txt:521,搜「story revolves」)。两段成品答案开头几乎相同,「小图导致答案池重叠」是我们的分析,书里没有点破。

  15. 出处:「7.3 Graph retrievers」第 305 段(text/18-ch07-03-7-3-graph-retrievers.txt:305,搜「chamomile」)。

  16. 出处:「7.3 Graph retrievers」第 19 段第 4-6 行(text/19-fm-summary.txt:4,搜「standalone」)。原文:社区摘要可单独嵌入,作为独立的向量检索路使用,按查询焦点更有针对性地取。