外观
Graph RAG 面试题
内容整理自学习笔记,仅供面试备考参考;不构成录用、培训或考试承诺。
1. 为什么需要 Graph RAG?
基于向量嵌入的语义搜索虽然强大,但存在精度问题。例如 "保温大棚" 和 "保温杯" 在通用语义(Embedding)上高度相关,可能作为错误的上下文引入幻觉。
知识图谱可以有效缓解这种问题:
- 利用领域知识图的结构化关系过滤不相关结果
- 减少纯语义搜索导致的不准确性
- 利用实体间的关系支持多跳推理
2. 什么是 Graph RAG?
Graph RAG 是一种基于知识图谱的检索增强技术:
- 将实体和关系以图的形式表达
- 将知识图谱等价于一个超大规模词汇表,实体和关系对应单词
- 在检索时将实体和关系作为单元进行联合建模
3. Graph RAG 的实现思路
核心流程:
用户查询 → 实体提取 → 子图构建(上下文) → LLM生成回答python
def simple_graph_rag(query_str, nebulagraph_store, llm):
entities = _get_key_entities(query_str, llm)
graph_rag_context = _retrieve_subgraph_context(entities)
return _synthesize_answer(query_str, graph_rag_context, llm)详细步骤:
Step 1:提取关键实体
python
def _get_key_entities(query_str, llm=None, with_llm=True):
# 使用 LLM 从问题中提取关键实体
# 扩展同义词
return _expand_synonyms(entities)Step 2:检索子图
python
def _retrieve_subgraph_context(entities):
# 以提取的实体为种子节点
# 在图谱中进行 2 跳甚至更深的遍历
# 获取子图上下文Step 3:生成回答
python
def _synthesize_answer(query_str, graph_rag_context, llm):
return llm.predict(PROMPT_SYNTHESIZE_AND_REFINE, query_str, graph_rag_context)示例
查询:"Tell me events about NASA"
提取关键词:['NASA', 'events']
召回的二度关系:
nasa ['public release date', 'mid-2023']
nasa ['announces', 'future space telescope programs']
nasa ['publishes images of', 'debris disk']
nasa ['discovers', 'exoplanet lhs 475 b']这些结构化知识作为上下文送入 LLM 完成最终回答。
4. Graph RAG 与向量 RAG 的融合
知识图谱召回可以作为额外一路召回与传统向量召回进行融合,综合利用:
- 向量召回的语义泛化能力
- 图谱召回的结构化关系能力
5. Graph RAG 的排序优化
当图谱规模很大时,子图召回可能引入多条不相关路径。需要引入路径排序环节:
粗排阶段(LightGBM)
根据 Query 和候选路径的特征进行初筛,保留 Top-N 条路径。特征包括:
| 特征类别 | 具体特征 |
|---|---|
| 文本特征 | 字符重合数、词重合数、编辑距离、字符 Jaccard 相似度、词语 Jaccard 相似度 |
| 图特征 | 路径跳数、路径长度、路径中的关系数、路径中的实体个数、路径中的答案个数 |
| 匹配特征 | 路径字符是否全在 Query 中、Query 和路径是否都包含数字、数字 Jaccard 相似度 |
精排阶段(预训练语言模型)
计算 Query 与粗排阶段保留路径的语义匹配度,选择得分 Top 2-3 的答案路径作为最终答案。
6. Graph RAG 的局限性
- 子图噪声:召回的多条路径中可能出现不相关内容
- 实体识别精度:关键词提取方式较为粗暴,精度有限
- 依赖知识图谱质量:若图谱数据量和广度不够,可能引入噪声
- 两阶段排序成本:粗排+精排增加了流程复杂度