想象你是一座城市的新任导航员,办公桌上堆满了写着地标名字的卡片——“图书馆开放时间”“咖啡店招牌饮品”“学校历史沿革”。游客问:“离图书馆最近的咖啡店在哪?”你翻遍所有卡片,能背出咖啡店的营业时间,却算不出它和图书馆之间的距离。这正是传统向量RAG的困境:它擅长按字面相似度翻找卡片,却无法理解文本中“谁与谁有关”。 GraphRAG换了一种解题思路:先请测绘队把整个知识领域画成一张城市地图。每个实体(公司、产品、人物)是地图上的建筑,每个关系(合作、位于、隶属于)是连接建筑的道路。提问时,你不再盲目翻卡片,而是从地图上的入口出发,沿道路行走,把多跳路径上的答案找出来。 这张“城市地图”就是知识图谱。从文本中抽取实体与关系(测绘)、搭建图索引(挂门牌)、遍历图路径(导航)、融合全局与局部信息(看总图也看详图)——这就是GraphRAG图谱驱动RAG的完整旅程。本文将带你亲手搭建这样一套系统。

岗位关联

掌握GraphRAG构建技术,标志着检索系统从“语义匹配”升级为“关系推理”。作为AI从业者,你将能设计出超越传统向量检索局限的企业级问答系统,在复杂多跳问答、知识密集型场景中建立核心竞争力。

目录
  1. 可视化演示
  2. 图谱核心概念
  3. 实体关系抽取
  4. 图索引构建
  5. 查询图遍历
  6. 全局局部摘要
  7. 工程优化实践
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

图谱核心概念

想象你是一位刚上任的城市导航员,办公桌上堆满写着地标名字的卡片——“图书馆开放时间”“咖啡店招牌饮品”“学校历史沿革”。游客问:“离图书馆最近的咖啡店在哪?”你翻遍卡片,能背出咖啡店营业时间,却算不出它和图书馆的距离。

传统向量RAG就是这位只会翻卡片的导航员。它把文档切成块、用Embedding向量表示语义,检索时找“文字最相似的段落”,却看不见段落间“谁认识谁、谁属于谁”的关联。一旦问题涉及多跳关系——“A公司的供应商的竞争对手是谁”——它只能在卡片堆里大海捞针。

GraphRAG换了一种思路:在翻卡片前,先请测绘队把整座城市画成地图。这张地图就是知识图谱,数学形式为:

G=(V,E)\displaystyle G = (V, E)

其中V是节点集合,代表语料中的实体;E是边集合,代表实体之间的关系。有了这张图,面对“离图书馆最近的咖啡店”时,只需找到“图书馆”节点,沿“相邻”“步行5分钟”的关系边走一两步,答案就浮现出来。

1. G 代表整个知识图谱:知识图谱是一个有向图,由节点和边共同构成。

GG

2. V 是节点集合:每个节点对应语料中的一个实体,例如“北京大学”“腾讯公司”。

V={v1,v2,…,vn}V = \{v_1, v_2, \dots, v_n\}

3. E 是边集合:每条边连接一个头实体和一个尾实体,并带上关系类型。

E⊆V×V×RE \subseteq V \times V \times R

4. R 是关系类型集合:它限定了关系种类,防止抽取阶段出现关系爆炸。

R={位于,合作,相邻,… }R = \{\text{位于}, \text{合作}, \text{相邻}, \dots\}

和纸质地图一样,知识图谱也有“比例尺”:抽取多少实体、保留哪些关系,决定了地图的精细度。地图太粗,断头路多;地图太细,冗余小巷多。工程化第一步,就是找到适合业务的“比例尺”。

实体关系抽取

画地图的第一步是派测绘队。GraphRAG的“测绘队”是大语言模型,它接过一叠叠文档,用两种能力绘制草图:NER(命名实体识别)负责认出“哪里是建筑”——把人名、地名、机构名从句子中圈出来;RE(关系抽取)负责判断“两栋建筑之间是否通路”。

以句子“腾讯公司与北京大学合作建立实验室”为例,NER圈出“腾讯公司”“北京大学”“实验室”,RE判断出“腾讯公司与北京大学存在合作关系”,最终产出一条结构化三元组:(腾讯公司,合作,北京大学)。这个过程看似简单,却决定了整张地图的准确度。

工程落地时,LLM调用策略是成本与效果的分水岭。一种常见做法是:先按段落分块,设计统一的抽取提示词,要求LLM返回JSON三元组列表,解析失败自动重试;再用轻量规则或模型过滤明显错误,最后归一化实体名(“北大”→“北京大学”)。关系抽取的概率建模可写成:

P(r∣s,o,c)=exp⁡(score(s,r,o,c))∑r′∈Rexp⁡(score(s,r′,o,c))\displaystyle P(r \mid s, o, c) = \frac{\exp(\text{score}(s, r, o, c))}{\sum_{r' \in \mathcal{R}} \exp(\text{score}(s, r', o, c))}

1. P(r|s,o,c) 是条件概率:给定头实体 s、尾实体 o 和上下文 c 时关系 r 成立的概率。

P(r∣s,o,c)P(r \mid s, o, c)

2. score 是相关性打分:模型为候选关系 r 计算一个实数值分数,分数越高越可能成立。

exp⁡(score(s,r,o,c))\exp(\text{score}(s, r, o, c))

3. 分母是所有候选关系的指数和:对全部关系类型做归一化,使输出成为概率分布。

∑r′∈Rexp⁡(score(s,r′,o,c))\sum_{r' \in \mathcal{R}} \exp(\text{score}(s, r', o, c))

4. 取概率最大的关系:argmax 选出最可能的关系作为抽取输出。

r^=arg⁡max⁡r∈RP(r∣s,o,c)\hat{r} = \arg\max_{r \in R} P(r \mid s, o, c)

测绘队的工作质量直接决定地图可靠性。抽错实体(把“深圳大学”拆成“深圳”和“大学”)、判错关系(把“合作”误判为“收购”),都会让导航员把游客带到错误的地方。所以抽取后的清洗、消歧和置信度过滤,是GraphRAG工程质量的第一道防线。

图索引构建

地图上标好了建筑和道路,测绘队还要在每个地标门口挂一个“胶囊信箱”(Embedding向量),里面装着该地标的文字简介。导航员出发前,不用走到门口,只要扫一眼胶囊就能了解“这是什么地方”。给节点挂胶囊的过程,就是图索引构建。

图索引构建包含两层:一是图结构的存储,让节点和边能被快速检索和遍历;二是节点属性的向量化,让节点的语义可量化、可比较。前者回答“谁和谁连在一起”,后者回答“谁和谁本质相似”。

图结构可以用Neo4j、JanusGraph等图数据库存储,也可以直接用邻接表(Adjacency List)放在内存中——每行记录一个节点及其直接邻居。节点属性向量化则用预训练文本Embedding模型,将实体名与实体描述拼成文本后编码为稠密向量,连同向量一起存入向量数据库。节点之间的语义相似度用余弦相似度计算:

sim(ni,nj)=cos⁡(ei,ej)=ei⋅ej∥ei∥⋅∥ej∥\displaystyle \text{sim}(n_i, n_j) = \cos(\mathbf{e}_i, \mathbf{e}_j) = \frac{\mathbf{e}_i \cdot \mathbf{e}_j}{\|\mathbf{e}_i\| \cdot \|\mathbf{e}_j\|}

1. e_i 是实体节点 n_i 的向量:用文本Embedding模型把实体名和描述编码成稠密向量。

ei=Embedding(name(ni),desc(ni))\mathbf{e}_i = \text{Embedding}(\text{name}(n_i), \text{desc}(n_i))

2. 点积衡量方向一致性:两个向量对应维度相乘再求和,值越大方向越接近。

ei⋅ej=∑keikejk\mathbf{e}_i \cdot \mathbf{e}_j = \sum_k e_{ik} e_{jk}

3. 模长归一化:分母用两个向量的模长,把点积压缩到 [-1,1]。

∥ei∥=∑keik2\|\mathbf{e}_i\| = \sqrt{\sum_k e_{ik}^2}

4. 余弦相似度:结果接近 1 表示语义相近,接近 0 表示无关。

sim(ni,nj)=ei⋅ej∥ei∥∥ej∥\text{sim}(n_i, n_j) = \frac{\mathbf{e}_i \cdot \mathbf{e}_j}{\|\mathbf{e}_i\| \|\mathbf{e}_j\|}

胶囊里装的简介越精确,导航员对地标的预判就越准。工程上,实体描述文本由多种来源拼接:实体名、抽取时的原文片段、以及一跳邻居的名称。如果某个实体的胶囊信息过于稀疏,它就会变成地图上的“无字标记”,既难被语义检索命中,也难参与相似度比较。

查询图遍历

游客终于问出具体问题。导航员打开地图,从入口实体出发,沿道路逐户走访相邻建筑——就像在街区里逐户敲门传话。这在图论中叫图遍历,是GraphRAG查询阶段的核心动作。

遍历策略主要有两种:BFS(广度优先搜索)像水面波纹一样逐层扩散,先访问全部一跳邻居,再访问二跳邻居;DFS(深度优先搜索)则像钻迷宫,沿一条路走到底再折返。GraphRAG中BFS更常用,因为它允许精确控制最大跳数(max_depth),避免被深层噪声关系带偏。

查询流程分为三步:第一步,通过实体链接或向量检索定位入口实体;若入口实体不存在,则触发回退策略——用向量检索召回语义相关文本块,再从文本块中提取候选实体作为入口。第二步,从入口出发做K跳BFS遍历,得到一组结构化候选路径。第三步,将图遍历得分与向量检索得分归一化后加权融合,得到最终排序:

Score(c)=λ⋅GraphScore(c)−μgσg+(1−λ)⋅VecScore(c)−μvσv\displaystyle \text{Score}(c) = \lambda \cdot \frac{\text{GraphScore}(c) - \mu_g}{\sigma_g} + (1-\lambda) \cdot \frac{\text{VecScore}(c) - \mu_v}{\sigma_v}

1. GraphScore(c) 是图遍历得分:候选上下文与入口实体之间路径越短,得分越高。

GraphScore(c)=1depth(c)+1\text{GraphScore}(c) = \frac{1}{\text{depth}(c) + 1}

2. VecScore(c) 是向量检索得分:查询向量与候选向量之间的余弦相似度。

VecScore(c)=cos⁡(eq,ec)\text{VecScore}(c) = \cos(\mathbf{e}_q, \mathbf{e}_c)

3. Z-score 归一化:减去均值再除以标准差,让两类得分尺度对齐。

x−μσ\frac{x - \mu}{\sigma}

4. λ 是融合权重:λ 大时图结构证据占主导,1-λ 大时语义相似证据占主导。

λ∈[0,1]\lambda \in [0, 1]

导航员的高明不在于某一种能力特别强,而在于把“看地图找到的路”和“听路人描述的印象”结合起来。只靠地图可能漏掉新开的小店,只听路人描述可能迷路。图遍历与向量检索的融合,正是这种“地图+口碑”的决策机制。

全局局部摘要

出发前,资深导航员会做两件事:先看一眼整座城市的规划图,掌握东西南北的大格局;再放大目的地的街区图,看清每一条小巷。对应到GraphRAG,就是全局摘要(Global Summary)与局部摘要(Local Summary)的协同。

全局摘要回答“这个语料库整体在讲什么”。实现上,先对图谱做社区检测,把关系紧密的实体聚成社区;对每个社区,用LLM将其中所有三元组概括成一段摘要;再对社区摘要做摘要,逐层向上合成为一颗摘要树。查询时,从摘要树中取主题最相关的若干社区摘要作为背景信息。

局部摘要针对性更强:从查询的入口实体出发图遍历K跳,取出一个局部子图,把子图内的实体、关系、属性汇总成紧凑上下文。全局摘要提供主题背景,局部摘要提供直接证据,两者按查询性质动态组合。答案生成的上下文可以抽象为:

ctx(q)=[GlobalSummary(q);  LocalSubgraph(q)]\displaystyle \text{ctx}(q) = [\text{GlobalSummary}(q);\; \text{LocalSubgraph}(q)]

1. LocalSubgraph(q) 是局部子图:从查询入口实体出发做 K 跳遍历,收集所有相关三元组作为直接证据。

LocalSubgraph(q)={(e,r,e′)∣dist(e,eq)≤K}\text{LocalSubgraph}(q) = \{(e, r, e') \mid \text{dist}(e, e_q) \le K\}

2. GlobalSummary(q) 是全局摘要块:从社区的摘要树中取出与查询主题最相关的摘要,提供宏观背景。

GlobalSummary(q)=⋃c∈community(q)summary(c)\text{GlobalSummary}(q) = \bigcup_{c \in \text{community}(q)} \text{summary}(c)

3. [;] 拼接上下文:把宏观背景和局部证据放入同一个上下文窗口。

[GlobalSummary(q);LocalSubgraph(q)][\text{GlobalSummary}(q); \text{LocalSubgraph}(q)]

4. LLM 生成最终答案:语言模型以拼接上下文为条件,输出概率最高的回答。

a^=arg⁡max⁡aP(a∣q,ctx(q))\hat{a} = \arg\max_a P(a \mid q, \text{ctx}(q))

全局摘要像城市的骨架印象——知道这座城建在山边还是海边;局部摘要像导航的最后500米——精确到哪个路口左转。两图叠加,导航才能一路顺畅。只用全局摘要,答案会泛泛而谈;只用局部摘要,答案会缺少大局观。

工程优化实践

再完美的城市地图,若测绘成本高到城市负担不起、导航慢到游客失去耐心,也只是一张废纸。GraphRAG工程化落地,本质上是构建成本、检索延迟、效果指标三者的平衡木。

成本大头在LLM抽取调用。若对全部文档做全量抽取,API费用会迅速失控。常用优化手段包括:只抽取与业务实体词典匹配的句子;按文档分块批量调用,减少往返次数;先让轻量模型初筛,再让大模型精抽。

延迟层面,图的邻接表常驻内存或使用图数据库缓存,热点实体的子图可预计算;向量检索用HNSW等近似最近邻索引加速。效果评估上,用精确率、召回率、F1等指标衡量检索质量,同时监控构建耗时、查询延迟与单次查询成本三项指标:

F1=2×P×RP+R,P=TPTP+FP,R=TPTP+FN\displaystyle F1 = \frac{2 \times P \times R}{P + R}, \quad P = \frac{TP}{TP+FP}, \quad R = \frac{TP}{TP+FN}

1. 精确率 P:在模型返回的所有结果中,真正相关的比例,衡量“有没有检索到噪声”。

P=TPTP+FPP = \frac{TP}{TP + FP}

2. 召回率 R:在全部正确答案中,模型找回的比例,衡量“有没有漏检”。

R=TPTP+FNR = \frac{TP}{TP + FN}

3. F1 是调和平均:当精确率与召回率严重失衡时,F1 会给出较低分数,倒逼两者均衡。

F1=2×P×RP+RF1 = \frac{2 \times P \times R}{P + R}

好的地图系统,既要在测绘时精打细算,又要在导航时响应敏捷,最终还要让游客顺利抵达目的地。这三项指标的持续平衡与调优,贯穿GraphRAG从原型到上线的每一步。

AI 应用场景

企业级智能知识问答

阶段:图谱构建与检索增强生成

解决的问题:传统向量RAG对“设备停机了→诊断该设备的供应商→联系供应商的备件仓库”这类多跳问题无能为力,只能返回语义相似但缺乏结构的碎片。GraphRAG将维修手册构建为知识图谱,查询时从故障实体出发,沿“设备—供应商—备件”路径多跳检索,给出可追踪的推理链。

具体案例:某制造企业搭建设备维修知识库。工程师提问“3号产线机械臂的供应商是否与质检部门有合作”,系统先定位“3号产线→机械臂→供应商”,再沿“合作”边遍历到质检部门,输出完整路径,替代人工逐条翻阅手册。

金融风控关联分析

阶段:实体关系抽取与图遍历推理

解决的问题:反欺诈场景中,关键信息藏在“A是B的法人,B是C的大股东,C是本次贷款申请方”这类多跳关系中。传统文本检索无法回答“申请方背后实际控制人是谁”。GraphRAG从企业工商数据中抽取人员、企业、股权关系构建图谱,遍历3跳内路径识别隐性控制链。

具体案例:银行风控团队用GraphRAG分析企业申请材料。查询“王五与申请人是否存在间接股权关联”,系统从“王五→A公司→B公司→申请人”的路径中返回关联强度,辅助审核决策。

医药研发文献挖掘

阶段:知识抽取与全局局部摘要协同

解决的问题:药物研发需从数万篇论文中提取“药物—靶点—疾病”关系。全量阅读不现实,关键词检索又漏掉间接关联。GraphRAG抽取三元组构建药理图谱,全局摘要归纳领域热点,局部摘要针对“某靶点”展开多跳路径细节。

具体案例:某药企NLP团队构建药物图谱。研究员问“有哪些药物可能作用于KRAS通路的下游靶点”,系统沿“药物—抑制—靶点—参与—通路”遍历,结合社区摘要给出候选药物及证据链。

Python 演示

python103 行
# -*- coding: utf-8 -*-"""简化版 GraphRAG:演示知识图谱增强 RAG 的核心流程."""import refrom collections import defaultdict  class SimpleGraphRAG:    """教学用简化 GraphRAG 实现."""     def __init__(self):        self.node_labels = {}        self.adjacency = defaultdict(list)     def extract_entities(self, sentences):        """用预置词典在句子中识别实体."""        vocab = ["腾讯公司", "北京大学", "北京图书馆", "深圳大学", "实验室"]        entity_dict = {}        for sent_idx, sent in enumerate(sentences):            for token in sorted(vocab, key=len, reverse=True):                if token in sent:                    entity_dict.setdefault(token, []).append(sent_idx)        return entity_dict     def extract_relations(self, sentences, entities):        """通过模式匹配抽取实体之间的关系."""        patterns = [            ("位于", r"(.+?)位于(.+?)。"),            ("合作", r"(.+?)与(.+?)合作"),            ("相邻", r"(.+?)与(.+?)相邻"),            ("成立于", r"(.+?)成立于(.+?)。"),        ]        relations = set()        for sent in sentences:            for rel, pat in patterns:                match = re.search(pat, sent)                if match:                    a, b = match.group(1), match.group(2)                    if a in entities and b in entities:                        relations.add((a, b, rel))        return relations     def build(self, sentences):        """抽取实体与关系并建立邻接表索引."""        entities = self.extract_entities(sentences)        relations = self.extract_relations(sentences, entities)        for name in entities:            nid = len(self.node_labels)            self.node_labels[nid] = name        name_to_id = {name: nid for nid, name in self.node_labels.items()}        for a, b, rel in relations:            src, dst = name_to_id[a], name_to_id[b]            self.adjacency[src].append((dst, rel))            self.adjacency[dst].append((src, rel))        return len(self.node_labels), len(relations)     def traverse(self, start_id, max_depth):        """BFS 图遍历:从起点出发逐层扩展."""        visited = set([start_id])        queue = [(start_id, 0, [])]        results = []        while queue:            node, depth, path = queue.pop(0)            if depth >= max_depth:                continue            for nxt, rel in self.adjacency[node]:                if nxt in visited:                    continue                visited.add(nxt)                new_path = path + [(self.node_labels[node], rel, self.node_labels[nxt])]                results.append((nxt, depth + 1, new_path))                queue.append((nxt, depth + 1, new_path))        return results     def answer(self, question, max_depth=2):        """定位起点实体后做图遍历并返回路径."""        start_id = None        for nid, name in self.node_labels.items():            if name in question:                start_id = nid                break        if start_id is None:            return "问题中未找到图谱内的实体"        paths = self.traverse(start_id, max_depth)        return [(self.node_labels[nid], depth, " -> ".join(            f"{s}-{r}->{t}" for s, r, t in path))            for nid, depth, path in paths]  if __name__ == "__main__":    corpus = [        "腾讯公司位于深圳。",        "腾讯公司与北京大学合作建立实验室。",        "北京大学成立于1898年。",        "北京图书馆与北京大学相邻。",        "深圳大学与腾讯公司合作研发AI。",    ]    rag = SimpleGraphRAG()    node_count, edge_count = rag.build(corpus)    print(f"构建完成: {node_count} 个实体, {edge_count} 条关系")    question = "北京大学与哪些实体有关联?"    print(f"查询: {question}")    for name, depth, path in rag.answer(question):        print(f"深度 {depth}: {name}  路径: {path}")
目的:用约60行代码实现一个教学级GraphRAG——从非结构化句子中抽取实体与关系、构建邻接表图索引、再通过BFS图遍历回答多跳关联问题,演示了生产级GraphRAG的核心数据流。
  1. self.adjacency = defaultdict(list)邻接表是图谱的核心存储结构,记录每个节点的直接邻居和关系名。
  2. for token in sorted(vocab, key=len, reverse=True):按长度降序匹配实体名,避免短词先命中而遮蔽长词。
  3. if a in entities and b in entities:关系两侧必须是已识别实体,否则丢弃这条关系,过滤噪声。
  4. self.adjacency[src].append((dst, rel))无向图中双向写入邻接表,保证从任意一端都能遍历到。
  5. if depth >= max_depth: continueBFS的深度闸门,防止遍历在深层噪声关系上无限扩散。
  6. if nxt in visited: continue访问集合去重,避免在环路中死循环。
  7. if name in question:通过文本包含关系定位入口实体,是最简单的实体链接形态。
  8. paths = self.traverse(start_id, max_depth)图遍历是查询核心:从入口出发、按深度扩展、返回结构化路径。

常见误区

误区初学者以为把向量数据库和Neo4j放在一起就是GraphRAG了。实际上只是把两个箱子叠在一起,中间没有打通,查询时先向量检索、再随便查一下图,二者毫无协同。

正解GraphRAG的核心在于“图谱驱动检索”的完整闭环:从实体关系抽取、图索引构建,到查询时的图遍历与向量融合排序、再到全局局部摘要协同。缺了任何一环都只是“有图的RAG”,不是图谱驱动的RAG。就像有了地图和导航软件,但没人教导航员怎么把两者结合起来,等于还是两张废纸。

为何常见:因为从系统架构图上看,GraphRAG确实包含图数据库和向量检索两个模块,容易被误读为“叠加组合”。

误区既然GraphRAG主打图谱,那么向量检索就可以退役了。查询时只要在图里跳一跳,所有问题都能解决。

正解图遍历擅长结构化、多跳关系推理,向量检索擅长模糊语义匹配。实际系统中两者是互补关系:实体缺失时需要用向量检索召回候选实体,再以候选实体为入口进入图遍历;最终结果按归一化得分加权融合,缺一不可。地图能告诉你路怎么走,但“这家咖啡店口碑好”这种模糊信息还得靠口碑索引。

为何常见:人们容易夸大新方案的能力,忽视混合检索的互补性,走向“一招鲜”的极端。

误区最好把语料库里所有实体和关系都抽出来,图越密越聪明。于是工程师让LLM做全量抽取,结果图谱爆炸、成本飙升、查询变慢。

正解全量抽取会带来组合爆炸的噪声实体和虚假关系。应以查询侧需求为导向,优先抽取核心实体和高价值关系,并设置置信度过滤。抽取错误的关系比漏抽更危险——错误道路会误导导航员,而缺失的道路最多让导航员绕路。

为何常见:“图是越密越聪明”的直觉错觉,忽略了噪声边的危害远大于缺失边。

误区全局摘要已经把每个社区都总结了,查询时直接拿全局摘要当上下文,既省事又省钱,没必要再做局部摘要。

正解全局摘要提供宏观背景,但缺少针对具体查询的细节。局部摘要在查询时从图遍历到的子图中动态生成,包含实体属性、多跳路径等直接证据。两者必须协同:全局控方向、局部给证据。只看城市规划图找不到具体门牌号,只看街区图会迷路——导航必须两图叠加。

为何常见:不了解两者生成时机和作用层次,误把全局摘要当成“缓存好的答案”。

面试题

Q1. GraphRAG与传统向量RAG最核心的区别是什么?

单选题 · easy

  • A.使用了更大的语言模型
  • B.引入知识图谱结构← 正确答案
  • C.增加微调训练环节
  • D.增加更多提示模板

答案:B。GraphRAG与传统向量RAG的根本差异在于引入了显式的知识图谱结构(G=(V,E)),使系统具备实体级的关系推理能力。A是资源投入问题,C、D属于训练与工程技巧,都不构成核心区别。

Q2. 知识图谱中的三元组基本表示形式是?

单选题 · easy

  • A.文档、段落、句子
  • B.头实体、关系、尾实体← 正确答案
  • C.查询、答案、上下文
  • D.节点、边、以及权重

答案:B。知识图谱的基本表示单元是三元组(头实体,关系,尾实体),例如(腾讯公司,合作,北京大学)。A是文档层级结构,C是检索系统组件,D缺少关系语义类型。

Q3. GraphRAG相比传统向量RAG的优势包括?

多选题 · easy

  • A.支持多跳关系推理← 正确答案
  • B.擅长实体关系问答← 正确答案
  • C.灵活处理结构数据← 正确答案
  • D.完全不依赖向量库

答案:ABC。知识图谱使GraphRAG能沿关系边做多跳推理(A)、回答实体关系类问题(B)、融合结构化数据(C)。D错误:图索引构建仍需Embedding存储,回退机制也依赖向量检索,GraphRAG并非完全抛弃向量库。

Q4. NER在GraphRAG构建阶段的核心功能是?

单选题 · mid

  • A.从文本中识别实体← 正确答案
  • B.计算图谱的直径
  • C.生成最后的答案
  • D.决定图遍历层数

答案:A。NER(命名实体识别)负责从非结构化文本中识别实体,如人名、地名、机构名。B是图分析任务,C是生成阶段任务,D是查询阶段配置,均与NER无关。

Q5. 查询阶段图遍历的主要目的是?

单选题 · mid

  • A.减少CPU运算量
  • B.找到多跳关联实体← 正确答案
  • C.对所有图节点排序
  • D.生成向量特征表

答案:B。图遍历从入口实体出发,沿关系边逐层扩展,目的是找到与查询实体多跳关联的其他实体,为问答提供结构化证据。A、C、D都不是遍历的目标。

Q6. GraphRAG图谱构建的输入来源可能包括?

多选题 · mid

  • A.企业非结构化文档← 正确答案
  • B.已有的关系数据库← 正确答案
  • C.半结构化的电子表格← 正确答案
  • D.数据库底层二进制

答案:ABC。图谱构建输入可以是非结构化文本(经NER/RE抽取),也可以是结构化数据库、半结构化表格直接映射为三元组。D是存储介质而非语义输入源,无法直接抽取实体关系。

Q7. 关于全局摘要和局部摘要的说法正确的是?

单选题 · mid

  • A.全局摘要提供主题背景← 正确答案
  • B.局部摘要替代全局摘要
  • C.两者之间完全无关
  • D.只用全局摘要最好

答案:A。全局摘要回答“语料库整体在讲什么”,提供宏观主题背景;局部摘要针对查询动态生成子图细节证据。二者是协同关系,不是替代或无关关系。

Q8. 融合图遍历与向量检索结果时最合理的策略是?

单选题 · hard

  • A.只保留图遍历结果
  • B.只保留向量检索结果
  • C.加权融合两类得分← 正确答案
  • D.随机选一类结果

答案:C。最合理策略是将两类得分各自做Z-score归一化后,按权重λ加权融合(Score=λ·图得分+(1-λ)·向量得分)。A、B单边主义,D随机选择无意义。

Q9. GraphRAG工程化落地需重点考虑?

多选题 · hard

  • A.LLM抽取调用成本← 正确答案
  • B.图谱检索的延迟← 正确答案
  • C.实体消歧与去重← 正确答案
  • D.固定使用大集群

答案:ABC。实际部署需关注LLM抽取的API成本(A)、图谱存储与检索延迟(B)、实体消歧与关系去重(C)。D“必须使用大集群”错误,小规模场景单机即可运行。

Q10. 当入口实体不在图谱中时,最佳回退策略是?

单选题 · extreme

  • A.立即返回空结果
  • B.向量检索再入图← 正确答案
  • C.返回全部的实体
  • D.强行插入伪实体

答案:B。正确做法是先用向量检索召回语义相关的文本块,从文本块中解析出候选实体,再以候选实体为入口进入图遍历。A直接放弃查询机会,C无意义,D污染图谱结构。