KAG

0 阅读37分钟
  1. 01_项目总览
  2. 02_KAG-Builder知识图谱构建
  3. 03_KAG-Solver推理引擎
  4. 04_混合检索策略
  5. 05_与GraphRAG对比分析

01_项目总览

KAG 项目总览

1. 什么是 KAG

KAG(Knowledge Augmented Generation,知识增强生成)是由蚂蚁集团联合浙江大学等机构研发的专业领域知识服务框架,于 2024 年 10 月通过 OpenSPG v0.5 正式开源。

KAG 的核心论文:"KAG: Boosting LLMs in Professional Domains via Knowledge Augmented Generation"

开源仓库:github.com/OpenSPG/KAG


2. 为什么需要 KAG:RAG 的根本性局限

传统 RAG 与 GraphRAG 在专业领域存在以下系统性缺陷:

缺陷描述
向量相似 ≠ 逻辑相关语义近似的文本不代表逻辑上具有推理关联
无法多跳推理单次检索无法串联跨文档多段证据链
噪声问题严重GraphRAG 的 OpenIE 引入大量非结构化噪声
不支持数值计算无法处理时序关系、数值运算、统计比较等
幻觉问题缺乏结构化知识约束,LLM 容易生成不实内容
Token 成本极高GraphRAG Global Search 可达 4×10⁴ tokens

专业领域(法律、医疗、政务、金融)对精确性要求极高,上述问题都是不可接受的。KAG 正是专为解决这些问题而设计的。


3. 整体架构:三大核心模块

KAG 框架由三个主要模块构成:

原始数据(非结构化文档 + 结构化数据 + 业务规则)
          │
          ▼
┌─────────────────────────────────────────────────────┐
│                    KAG Framework                     │
│                                                      │
│  ┌──────────────────┐     ┌──────────────────────┐  │
│  │   KAG-Builder    │────►│     KAG-Solver        │  │
│  │  (离线知识构建)   │     │   (在线推理求解)      │  │
│  │                  │     │                      │  │
│  │ • 文档解析        │     │ • Planner(规划器)  │  │
│  │ • 实体/关系抽取   │     │ • Reasoner(推理器) │  │
│  │ • 属性归一化      │     │ • Retriever(检索器)│  │
│  │ • 语义对齐        │     │ • Generator(生成器)│  │
│  │ • 互索引构建      │     │                      │  │
│  └──────────────────┘     └──────────────────────┘  │
│            │                         │               │
│            ▼                         │               │
│  ┌──────────────────┐                │               │
│  │  OpenSPG / KG    │◄───────────────┘               │
│  │  (知识图谱存储)   │                                │
│  │  Neo4j / TuGraph │     ┌──────────────────────┐  │
│  └──────────────────┘     │      KAG-Model        │  │
│                           │   (专用模型增强)       │  │
│                           │ • NLU(语言理解)      │  │
│                           │ • NLI(语言推理)      │  │
│                           │ • NLG(语言生成)      │  │
│                           └──────────────────────┘  │
└─────────────────────────────────────────────────────┘

4. 五大核心能力

KAG 提出了五项核心技术创新,区别于传统 RAG 和 GraphRAG:

能力 1:面向 LLM 的友好知识表示(LLMFriSPG)

基于 DIKW(Data-Information-Knowledge-Wisdom)层次理论,将知识分层管理:

  • 数据层:原始文本 Chunk
  • 信息层:OpenIE 抽取的开放三元组(schema-free)
  • 知识层:Schema 约束的领域专业知识
  • 智慧层:推理规则与业务��辑

同一实体类型可以同时支持两种表示模式并存,使 LLM 既能处理开放文本,又能利用结构化专家知识。

能力 2:知识图谱与原文的互索引机制(Mutual Indexing)

  • 将传统词项倒排索引升级为基于图结构的倒排索引
  • KG 节点持有指向原文 Chunk 的双向链接
  • 检索时可从 KG 节点直接回溯完整原文上下文
  • 知识与上下文不再割裂,多跳推理可追溯

能力 3:逻辑形式引导的混合推理(Logical Form Reasoning)

  • 将自然语言问题转换为逻辑形式(Logical Form),明确语义类型和关系
  • 通过 DAG 结构分解复杂问题为可执行子任务
  • 混合使用:LLM 语义推理、KG 符号推理、数值计算

能力 4:基于语义推理的知识对齐(Semantic Alignment)

  • 构建**概念图(Concept Graph)**存储同义词、上位词、包含关系
  • 离线阶段通过语义推理提升知识规范性和图连通性
  • 在线阶段概念图充当用户问题与索引之间的语义桥梁
  • 跨文档实体归一和关系统一,显著降低噪声

能力 5:KAG-Model 专用能力增强

通过指令合成训练专用模型,在较小规模模型上实现大模型效果:

能力应用场景
NLU(自然语言理解)实体识别、关系理解、问题解析
NLI(自然语言推理)语义推断、概念对齐、逻辑验证
NLG(自然语言生成)上下文感知的答案生成与摘要

5. 知识表示:LPG + 向量双模态存储

KAG 采用**结构化知识图谱(LPG)+ 稠密向量(Dense Vector)**双模态并行存储:

原始文档
   │
   ├──► LPG(标签属性图)
   │       • SPO 三元组(主-谓-宾)
   │       • 实体类型 + 关系类型 + 属性约束
   │       • Cypher 查询支持精确图遍历
   │       • 符号化逻辑推理基础
   │
   └──► 向量层(Dense Vector)
           • 文本 Chunk 和知识节点的向量化编码
           • ANN 近似最近邻语义搜索
           • 模糊查询和语义召回

两层通过互索引(Mutual Index)双向打通:
KG 节点 ←──── 互索引 ────► 原文 Chunk

6. SPG Schema 类型体系

SPG(Semantic-Enhanced Programmable Graph)定义了三类核心知识类型:

类型说明示例
EntityType实体类型Person、Organization、Disease
ConceptType概念类型(用于对齐)疾病分类、法规类目、产品类别
EventType事件类型医疗事件、法律案件、金融交易

属性分为两个域:

  • 知识域(Knowledge Area):强 Schema 约束的专家决策知识(静态)
  • 信息域(Information Area):开放信息的文档检索索引(动态)

7. 技术栈全景

层次技术选择
知识图谱引擎OpenSPG(蚂蚁+OpenKG 联合开发)
图数据库(默认)Neo4j(Cypher 接口)
图数据库(蚂蚁内部)TuGraph-DB(蚂蚁自研高性能图存储)
向量存储向量数据库(ANN 索引)
LLM 接入OpenAI / Qwen / LLaMA / ChatGLM 等(可配置)
推理规则KGDSL(知识图谱领域特定语言)
配置管理Python 配置文件 + YAML
算子框架KNext(可编程算子框架)

8. 与同类方案对比

维度Naive RAGGraphRAG(微软)KAG(蚂蚁)
知识结构社区层级图谱SPG 语义增强图谱
多跳推理弱(社区摘要)✓(逻辑形式 DAG)
数值计算✓(math_executor)
知识噪声中(OpenIE 噪声)低(概念图对齐)
专业领域强(Schema 约束)
Token 成本极高中(轻量模式-89%)
推理可解释性高(逻辑形式追溯)

9. 基准测试表现

基准数据集Naive RAGGraphRAGKAG提升
HotpotQA(F1)基线+部分提升最高+19.6%(相对)
2WikiMultiHopQA(F1)基线+部分提升最高+33.5%(相对)
政务问答精确率66%91.6%+25.6pp
医疗问答准确率~70%94%+显著提升

10. 主要应用场景

E-Government(政务问答):

  • 11,000 份政府服务文档
  • 精确率 91.6%,召回率 71.8%
  • 准确解释行政流程、政策法规

E-Health(医疗问答):

  • 超 180 万实体,超 500 万关系
  • 热门科普查询准确率 94%+
  • 疾病推理、症状-诊断链路、治疗方案

法律领域:

  • 法律条款 KG + 判例推理
  • 法条检索 + 时效计算 + 赔偿推算

金融领域:

  • 监管文件 + 历史数据 + 产品文档统一 KG
  • 合规检查、风险评估、量化分析

相关文档


02_KAG-Builder知识图谱构建

KAG-Builder:知识图谱构建 Pipeline

1. 概述

KAG-Builder 是 KAG 框架的离线索引构建模块,负责将原始非结构化文档转化为结构化知识图谱。与 GraphRAG 的 OpenIE + 社区摘要方式不同,KAG-Builder 采用双模态抽取 + 语义对齐 + 互索引的精细化构建策略。

构建目标:

原始数据(文档 / 结构化表 / 业务规则)
        │
        ▼
LPG 知识图谱(SPO 三元组 + 属性)
+
向量索引(Dense Vector Embeddings)
+
互索引(KG 节点 ←→ 文本 Chunk 双向映射)

2. 完整 Pipeline 步骤

总览流程图

① 文档解析(Layout Analysis)
        │  识别段落/表格/标题,处理 PDF/Word/HTML
        ▼
② 语义分块(Semantic Chunking)
        │  基于语义边界切割,保持上下文连贯性
        ▼
③ 知识抽取(Knowledge Extraction)
        │  双模态:OpenIE(schema-free)
        │         + Schema-constrained(领域约束)
        ▼
④ 属性归一化(Property Normalization)
        │  日期格式、单位、编码标准化
        ▼
⑤ 语义对齐(Semantic Alignment)
        │  实体消歧 + 实体归一 + 概念图对齐
        ▼
⑥ 互索引构建(Mutual Index Construction)
        │  KG 节点 ←→ 文本 Chunk 双向链接
        ▼
⑦ 图存储(Graph Storage)
           写入 Neo4j / TuGraph-DB

3. 步骤详解

3.1 文档解析(Layout Analysis)

作用: 识别文档的结构布局,提取内容边界。

PDF / Word / HTML / Markdown
          │
          ▼ Layout Analysis
    ┌─────┴─────┐
    │           │
  结构元素      内容
  • 标题层级    • 正文段落
  • 表格        • 列表
  • 图表标注    • 页眉页脚(过滤)
  • 分页边界

技术难点:

  • 扫描件 PDF 需要 OCR 处理
  • 跨页表格需要合并重组
  • 图表中的数字和标注需要特殊处理

3.2 语义分块(Semantic Chunking)

核心问题: 如何切割文本既保证语义完整,又不超过 LLM 的上下文窗口?

KAG 策略:

  • 基于语义边界(段落、章节)切割,而非固定字符数
  • 保留相邻 Chunk 之间的重叠区域(避免边界处信息丢失)
  • 每个 Chunk 携带元信息(所属章节、页码、文档来源)
  • Chunk 向量化存储到向量数据库

Chunk 数据结构示意:

{
    "chunk_id": "doc001_chunk_042",
    "content": "《劳动合同法》第三条规定,订立劳动合同,应当遵循...",
    "source_doc": "劳动合同法.pdf",
    "section": "第一章 总则",
    "page": 3,
    "vector": [...],          # 向量化表示
    "entity_refs": ["劳动合同法", "劳动合同"],  # 关联实体(互索引)
}

3.3 知识抽取(Knowledge Extraction)

这是 KAG-Builder 最核心的步骤,采用双模态抽取策略

模式一:Schema-free(开放信息抽取 / OpenIE)
  • 不依赖预定义 Schema,对文本进行开放性三元组抽取
  • 灵活适应新领域,适合信息层(Information Area)知识
  • 抽取结果:(主体实体, 关系谓词, 客体实体/属性值)
输入文本:
"马云是阿里巴巴集团的创始人,该公司成立于1999年。"

OpenIE 抽取结果:
(马云, 是, 阿里巴巴集团的创始人)
(阿里巴巴集团, 成立于, 1999年)
(马云, 创始, 阿里巴巴集团)
模式二:Schema-constrained(Schema 约束抽取)
  • 在预定义的领域 Schema 约束下进行精准信息抽取
  • 确保知识结构符合领域规范,适合知识域(Knowledge Area)
  • 减少噪声,提升知识质量
领域 Schema 示例(医疗领域):
EntityType: Disease {name, icd_code, category, symptoms, treatments}
EntityType: Drug {name, compound, dosage, contraindications}
RelationType: TREATS {Drug → Disease, evidence_level}
RelationType: CAUSES {Disease → Symptom, frequency}

Schema-constrained 抽取结果:
Disease("高血压", icd_code="I10", category="心血管疾病")
Drug("氨氯地平", compound="氨氯地平苯磺酸盐", dosage="5-10mg/日")
TREATS("氨氯地平""高血压", evidence_level="A级证据")
四类子任务
子任务说明输出
NER(实体识别)识别 Person、Org、Location、Disease 等实体列表 + 类型
RE(关系抽取)提取实体间语义关系(S, P, O) 三元组
EE(事件抽取)识别事件触发词和事件要素角色事件结构体
属性抽取提取实体的属性值键值对

3.4 属性归一化(Property Normalization / Postprocessor)

作用: 清洗和标准化从不同文档抽取的属性值。

归一化类型:

# 日期格式归一化
"2024年10月24日""2024-10-24"
"24/10/2024""2024-10-24"
"今年10月""2024-10" (结合文档时间戳推断)

# 数值单位归一化
"5千克"5000 (grams) 或保留 5 (kg)
"100ml"0.1 (liters) 或保留 100 (ml)

# 编码标准化
"高血压" → ICD-10: "I10"
"北京市" → 行政区划代码: "110000"

# 噪声过滤
去除空值属性、置信度低的抽取结果

3.5 语义对齐(Semantic Alignment)

语义对齐是 KAG 降噪和提升图质量的关键步骤,分三个层次:

层次一:实体消歧(Entity Disambiguation)

处理同名不同义的实体:

"苹果" → ?
  ├── [水果] 苹果(Fruit)
  └── [公司] 苹果公司(Apple Inc.)

依据上下文语境判断:
"苹果公司发布了新iPhone" → 苹果公司(Apple Inc.)
"苹果富含维生素C"        → 苹果(Fruit)
层次二:实体归一化(Entity Normalization)

合并不同表述的同一实体:

"蚂蚁集团" / "蚂蚁金服" / "Ant Group" / "支付宝母公司"
    → 统一归一到: 蚂蚁集团(entity_id: ant_group_001)
层次三:概念图对齐(Concept Graph Alignment)

利用**概念图(Concept Graph)**进行语义层面的关系对齐:

Concept Graph 中的关系类型:
• 同义词(synonym):  "高血压" ≡ "血压过高"
• 上位词(hypernym):  "高血压" is-a "心血管疾病"
• 包含关系(contains):  "心血管疾病" contains "高血压", "冠心病"
• 相关词(related):   "高血压" related-to "钠盐摄入"

对齐效果:
查询"血压过高的治疗方案"
→ 概念图展开 → 检索"高血压"相关知识
→ 命中Schema-constrained 的TREATS关系三元组

概念图在两个阶段的作用:

  • 离线构建阶段:提升知识规范性,增加图连通性,减少孤立节点
  • 在线查询阶段:作为用户问题与索引之间的语义桥梁,扩展检索覆盖

3.6 互索引构建(Mutual Indexing)

核心创新: 建立 KG 节点与原始文本 Chunk 之间的双向索引

传统 RAG 的问题:
  向量检索 → 文本 Chunk → 缺乏结构化知识锚点

GraphRAG 的问题:
  知识图谱节点 与 原文之间关联薄弱

KAG 互索引解决方案:
  KG 节点 ────────────────► 源文本 Chunk(正向链接)
  文本 Chunk ──────────────► 关联实体/关系(反向链接)

互索引的数据结构:

# KG 节点侧:持有 Chunk 引用
{
    "entity_id": "disease_hypertension_001",
    "name": "高血压",
    "type": "Disease",
    "properties": {...},
    "source_chunks": [           # ← 指向原文
        "doc_health_001_chunk_015",
        "doc_health_003_chunk_042"
    ]
}

# Chunk 侧:持有实体/关系引用
{
    "chunk_id": "doc_health_001_chunk_015",
    "content": "高血压是最常见的心血管疾病...",
    "entity_refs": [             # ← 指向 KG 节点
        "disease_hypertension_001",
        "disease_cardiovascular_001"
    ],
    "relation_refs": [
        "rel_hypertension_is_a_cardiovascular_001"
    ]
}

互索引的价值:

  1. 推理时命中 KG 节点后可直接回溯原文,获取完整上下文
  2. 向量检索命中 Chunk 后可直接定位相关知识节点
  3. 多跳推理的每一跳都保持完整的溯源链路(可解释性强)

3.7 图存储(Graph Storage)

存储目标:

  • 结构化 KG → Neo4j / TuGraph-DB(Cypher 查询)
  • 向量化 Chunk → 向量数据库(ANN 检索)
  • 互索引映射 → 图数据库中的边关系

断点续建机制:

KAG-Builder 生成 Checkpoint 目录,记录各阶段状态:

checkpoint/
├── reader/      ← 文档解析完成的记录
├── splitter/    ← 分块完成的记录
├── extractor/   ← 知识抽取完成的记录
├── postprocessor/ ← 归一化完成的记录
└── chain/       ← 写图完成的记录

任务中断后可从断点自动恢复,避免重复构建。


4. 双模态抽取的质量对比

维度Schema-free(OpenIE)Schema-constrained
适用范围所有文档,无需前期设计需要提前定义领域 Schema
噪声水平较高(开放关系复杂)低(Schema 约束明确)
召回率高(不遗漏任何关系)中(仅抽取 Schema 内关系)
知识质量
推理支持强(有类型约束的推理)

KAG 的创新: 两种模式应用于同一实体类型,在同一图实例中共存,实现"开放信息 + 专家知识"的统一管理。


5. 与 GraphRAG 构建流程对比

GraphRAG 构建:
文档 → OpenIE 抽取 → KG → Leiden 社区检测 → 社区摘要(LLM)
                              └── 丢失大量细节,Token 成本高

KAG 构建:
文档 → Layout 解析 → 语义分块 → 双模态抽取(精准)
     → 属性归一化 → 概念图对齐(降噪)→ 互索引(保留细节)
     → LPG + 向量双存储

关键差异:

  • KAG 无社区摘要步骤,通过互索引直接保留原文上下文
  • KAG 的概念图对齐大幅降低 OpenIE 噪声
  • KAG 的 Schema 约束提供比 GraphRAG 更高质量的领域知识

6. 构建成本优化:轻量模式

KAG 提供了轻量构建模式,相比完整 LLM 抽取可降低 89% 的 Token 成本

构建模式特点Token 成本知识质量
完整模式全程 LLM 抽取 + 对齐最高
轻量模式NLP 模型替代部分 LLM 调用低(-89%)较高
混合模式关键实体用 LLM,其余用 NLP

相关文档


03_KAG-Solver推理引擎

KAG-Solver:逻辑推理求解引擎

1. 概述

KAG-Solver 是 KAG 框架的在线推理核心,负责将用户的自然语言问题转化为结构化的推理过程,最终生成精确可追溯的答案。

设计哲学: 不是简单地"检索 → LLM 生成",而是"逻辑分解 → 混合执行 → 验证迭代"。

核心组件:

用户问题
   │
   ▼
┌─────────────────────────────────────────────────────────┐
│                      KAG-Solver                          │
│                                                          │
│   ┌────────────────┐                                     │
│   │    Planner     │  ← 问题理解 + 逻辑形式分解          │
│   │  (规划器)     │    生成 DAG 子问题图                │
│   └───────┬────────┘                                     │
│           │ 子问题序列                                    │
│           ▼                                              │
│   ┌────────────────┐                                     │
│   │    Executor    │  ← 混合推理执行                     │
│   │  (执行引擎)   │    四类算子调度                      │
│   └───────┬────────┘                                     │
│           │ 子答案                                       │
│           ▼                                              │
│   ┌────────────────┐                                     │
│   │   Generator    │  ← 答案综合 + 验证                  │
│   │  (生成器)     │    不满足则触发重规划                │
│   └────────────────┘                                     │
└─────────────────────────────────────────────────────────┘
   │
   ▼
最终答案(带溯源链路)

2. Planner:规划器

2.1 逻辑形式(Logical Form)

KAG-Solver 的第一步是将自然语言问题转化为逻辑形式(Logical Form)

逻辑形式的作用:

  • 明确问题的语义类型(实体查询 / 关系推理 / 数值计算)
  • 将复杂问题分解为具有依赖关系的子问题
  • 为后续的执行算子选择提供依据
  • 提升推理严谨性和可解释性

示例:

用户问题:
"2023年,蚂蚁集团收购的最大一家公司的CEO是谁?"

逻辑形式分解:
SubQ1: FIND companies WHERE acquired_by="蚂蚁集团" AND year=2023
SubQ2: MAX SubQ1 BY acquisition_amount
SubQ3: FIND person WHERE role="CEO" AND organization=SubQ2

依赖关系 DAG:
SubQ1 ──► SubQ2 ──► SubQ3 → 最终答案

2.2 DAG 子问题图

规划器将问题分解为有向无环图(DAG),节点是子问题,边是数据依赖关系:

复杂问题:
"根据最新指南,高血压合并糖尿病的患者,
 哪种降压药物的推荐级别最高,该药的常见副作用是什么?"

DAG 分解:
  ┌──────────────────────────────────┐
   SubQ1: 高血压合并糖尿病的降压指南  
  └───────────────┬──────────────────┘
                  
  ┌───────────────▼──────────────────┐
   SubQ2: 各药物的推荐级别对比       
         (数值比较 + 排序)          
  └───────────────┬──────────────────┘
                    最高推荐级别的药物名
  ┌───────────────▼──────────────────┐
   SubQ3: 该药物的常见副作用         
  └───────────────┬──────────────────┘
                  
              最终答案综合

2.3 两种规划模式

静态规划模式(Static Planner)
  • 对问题一次性生成完整的 DAG 求解路径
  • 明确所有子问题及其依赖关系
  • 适合问题结构相对清晰的场景
  • 执行效率高(无需中间迭代)
问题输入 → LLM 一次规划 → 完整 DAG → 顺序执行所有子问题 → 答案
迭代规划模式(Iterative Planner)
  • 逐步推进,每步根据已知结果决定下一步
  • 支持多轮推理迭代,直至满足终止条件
  • 适合开放性、复杂度高、答案路径不确定的推理场景
问题输入 → LLM 规划当前步 → 执行 → 观察结果
                │                        │
                └────── 未完成 ────────────┘
                                 │ 完成
                              最终答案

3. Executor:执行引擎

执行引擎是 KAG-Solver 的推理核心,根据子问题的语义类型调度不同算子。

3.1 四类推理算子

算子类型实现方式适用场景典型问题
精确图查询Cypher → Neo4j/TuGraph实体属性、关系查找"蚂蚁集团的创始人是谁?"
语义文本检索DPR + PPR + RRF模糊语义、上下文推断"有哪些治疗高血压的方法?"
数值计算math_executor统计、时序、数学推算"计算5年来的复利收益"
语义推理LLM + 概念图因果推断、分类判断"这个症状可能是什么疾病?"

3.2 算子一:精确图查询(cypher_executor)

原理: 将子问题转换为 Cypher 查询语句,在 KG 中执行精确检索。

# 子问题:蚂蚁集团的总部在哪里?
cypher = """
MATCH (org:Organization {name: '蚂蚁集团'})
RETURN org.headquarters
"""

# 子问题:哪些药物可以治疗高血压?
cypher = """
MATCH (drug:Drug)-[:TREATS]->(disease:Disease {name: '高血压'})
RETURN drug.name, drug.evidence_level
ORDER BY drug.evidence_level DESC
LIMIT 10
"""

优势:

  • 精确、确定性强,无随机性
  • 不依赖 LLM,速度快
  • 结果可完整溯源到 KG 节点

3.3 算子二:语义文本检索(kag_hybrid_exec)

原理: 三阶段混合检索(详见 04_混合检索策略.md):

子问题文本
    │
    ├── DPR(稠密向量检索)→ top-k 语义相近 Chunk
    │
    └── PPR(个性化 PageRank)→ 图传播相关 Chunk
            │
            ▼
        RRF(互惠排名融合)→ 重排序
            │
            ▼
        最相关的 Chunk 列表

3.4 算子三:数值计算(math_executor)

原理: 专门处理需要数值运算的子问题。

# 子问题示例:计算用药安全剂量
"""
患者体重: 70kg
推荐剂量: 5mg/kg/天
用药天数: 7天

计算:总剂量 = 5 × 70 × 7 = 2450mg
"""

# 子问题示例:时序推断
"""
合同签订日期: 2022-03-15
诉讼时效: 3年

诉讼截止日期: 2025-03-15
当前日期: 2024-11-01
剩余时效: 134天

支持的计算类型:

  • 算术运算(加减乘除、百分比)
  • 日期时序推算(到期日、时效计算)
  • 统计计算(平均值、最大最小值、排序)
  • 单位换算

3.5 算子四:语义推理(LLM + 概念图)

原理: 利用 LLM 的语言推理能力,结合概念图进行语义层面的推断。

子问题:
"患者出现持续性头痛、视物模糊、恶心,最可能的诊断是什么?"

推理过程:
1. 概念图展开:
   头痛 → 可能原因 → [高血压危象、偏头痛、颅内压增高]
   视物模糊 → 可能原因 → [高血压视网膜病变、青光眼]
   恶心 → 可能原因 → [颅内压增高、消化道问题]

2. 症状交集推断:
   三个症状共同指向 → 高血压危象(高可信度)
                    → 颅内压增高(中可信度)

3. LLM 综合生成:
   "根据症状组合,最可能的诊断是高血压危象,
    建议立即测量血压并进行眼底检查。"

4. Generator:答案生成器

4.1 答案综合

Generator 将各子问题的执行结果综合为最终答案:

def generate_final_answer(
    original_question: str,
    sub_answers: list[SubAnswer],    # 各子问题结果
    source_chunks: list[Chunk],      # 支撑文本来源
    kg_triples: list[Triple],        # 支撑的 KG 三元组
) -> Answer:
    """
    1. 按 DAG 依赖顺序组织子答案
    2. LLM 综合生成流畅自然语言回答
    3. 附加溯源信息(哪些文档、哪些 KG 节点支撑了答案)
    """

4.2 答案验证与迭代

生成答案后,KAG-Solver 会进行自我验证

答案质量评估维度:
• 完整性:是否回答了所有子问题?
• 一致性:各子答案之间是否矛盾?
• 可信度:是否有足够的证据支撑?
• 准确性:数值计算结果是否正确?

评估结果:
  ✓ 满足 → 输出最终答案
  ✗ 不满足 → 触发重规划(Iterative Mode)
              或降级到更保守的回答策略

5. FunctionCall 机制

KAG-Solver 利用 LLM 的 Function Call / Tool Use 能力实现算子的智能调度:

# 定义可用的算子工具
tools = [
    {
        "name": "cypher_executor",
        "description": "在知识图谱中执行精确查询,适合实体属性和关系查找",
        "parameters": {"cypher_query": "str"}
    },
    {
        "name": "semantic_retrieval",
        "description": "向量检索 + 图传播,适合模糊语义查询",
        "parameters": {"query": "str", "top_k": "int"}
    },
    {
        "name": "math_executor",
        "description": "数值计算,适合时序、统计、单位换算",
        "parameters": {"expression": "str", "variables": "dict"}
    },
    {
        "name": "semantic_reasoning",
        "description": "语义推理,适合因果推断和分类判断",
        "parameters": {"premise": "str", "question": "str"}
    }
]

# LLM 根据子问题语义自动选择最合适的算子
response = llm.chat(
    messages=[{"role": "user", "content": sub_question}],
    tools=tools,
    tool_choice="auto"
)

6. 推理过程完整示例

问题: "我国最新劳动法规定,连续工作满1年的员工,年假天数是多少?如果员工已累计工龄10年,年假又是多少天?"

[Planner - 静态规划]
SubQ1: 最新劳动法关于年假的规定
SubQ2: 连续工作满1年的年假天数(基础查询)
SubQ3: 累计工龄10年的年假天数(数值+条件查询)

DAG: SubQ1 → SubQ2 → SubQ3 → 综合答案

[Executor - SubQ1]
算子选择: kag_hybrid_exec(语义检索)
查询: "年假 劳动法 最新规定"
结果: 命中《职工带薪年休假条例》相关条款(互索引→原文Chunk)

[Executor - SubQ2]
算子选择: cypher_executor(精确图查询)
Cypher:
  MATCH (law:Law {name: '职工带薪年休假条例'})
  -[:STIPULATES]->(rule:Rule {condition: '连续工作满1年'})
  RETURN rule.annual_leave_days

结果: 5天

[Executor - SubQ3]
算子选择: cypher_executor + math_executor
Cypher: 查询工龄10-19年的年假规定 → 10天

[Generator]
综合以上子答案,LLM 生成:
"根据《职工带薪年休假条例》(2008年施行,现行有效):
 - 连续工作满1年不满10年的员工:年假5天
 - 连续工作满10年不满20年的员工:年假10天

 因此,累计工龄10年的员工享有10天带薪年假。

 来源:《职工带薪年休假条例》第三条"

7. 设计亮点与局限

亮点

特性说明
逻辑严谨性逻辑形式强制分解,避免"一步到位"的模糊推理
多算子混合精确查询 + 语义检索 + 数值计算,覆盖多类型问题
完整溯源每个子答案都有对应的 KG 节点和原文 Chunk
迭代纠错验证不通过可重规划,降低幻觉风险
FunctionCall利用 LLM 能力自动调度算子,灵活扩展

局限

局限描述
推理延迟多步逻辑推理比单次向量检索慢
规划依赖 LLMPlanner 本身依赖 LLM 能力,复杂问题可能规划错误
Schema 覆盖Schema 未覆盖的领域只能依赖 OpenIE + 语义检索
多语言主要优化中文,多语言支持有限

相关文档


04_混合检索策略

KAG 混合检索策略:DPR + PPR + RRF

1. 概述

KAG 的混合检索是其在检索精度上超越传统 RAG 的核心机制。它不依赖单一的向量相似度,而是将稠密向量检索(DPR)、**图结构传播(PPR)排名融合(RRF)**三种机制有机结合,实现语义理解与图结构知识的双重覆盖。

传统 RAG 检索的问题:

查询 → 向量相似度 → top-k 文本块
                  ↑
          仅捕获语义近似,
          无法发现图结构上相关但语义距离较远的知识

KAG 混合检索的改进:

查询 ─┬─► DPR 向量检索 ─────────────────┐
      │                                  ├─► RRF 融合排序 → 最终结果
      └─► PPR 图传播检索 ───────────────┘

2. 第一层:DPR(Dense Passage Retrieval,稠密向量检索)

2.1 工作原理

DPR 是传统 RAG 的核心检索机制,在 KAG 中作为第一层召回:

用户查询(或子问题文本)
        │
        ▼ Embedding 模型
    查询向量 q_vec
        │
        ▼ ANN(近似最近邻)检索
    向量数据库(所有 Chunk 的向量)
        │
        ▼ 余弦相似度 / 内积排序
    top-k 最相似的文本 Chunk

数学表达:

相似度(q, chunk) = cos(q_vec, chunk_vec)
                 = (q_vec · chunk_vec) / (|q_vec| × |chunk_vec|)

DPR 结果: {chunk_i: score_i} for top-k

2.2 DPR 的局限

DPR 只能捕获语义表层相似性,对以下情况无能为力:

查询: "谁是蚂蚁集团的实际控制人?"

DPR 可能召回:
  ✓ "马云是阿里巴巴集团创始人..."(语义近似)
  ✓ "支付宝母公司的CEO..."(语义近似)

DPR 可能遗漏:
  ✗ "杰克·马(Jack Ma)..."(实体不同表述)
  ✗ 通过"阿里巴巴 → 控股关系 → 蚂蚁集团"图路径能找到的内容

3. 第二层:PPR(Personalized PageRank,个性化 PageRank 图传播)

3.1 PageRank 原理回顾

PageRank 的核心思想:一个节点的重要性由指向它的节点的重要性决定,模拟随机游走过程:

每次随机游走:
  以概率 (1-d):传送到种子节点(teleport)
  以概率 d:从当前节点随机跳转到相邻节点

d = damping factor(阻尼系数,通常为 0.85

Personalized PageRank(PPR) 是 PageRank 的个性化变体:将随机游走的"传送目标"限定为一组种子节点(Seed Nodes),使排名反映与种子节点的关联程度。

3.2 KAG 中的 PPR 实现

种子节点来源:

KAG 的 PPR 种子节点 = DPR 召回的 top-k 文本 Chunk
                    + 查询中直接识别的实体
                    + 子问题分解出的候选知识单元

PPR 传播过程:

种子节点集合 S = {chunk_i, entity_j, ...}

在知识图谱上执行个性化 PageRank:

图结构(边类型):
  • Chunk → Entity(文本包含实体)
  • Entity → Entity(实体关系)
  • Entity → Chunk(实体出现在文本中,即互索引)
  • Concept → Entity(概念包含关系)

PPR 分数计算(迭代直至收敛):
  PR(v) = (1-d) × IsInS(v)/|S|   # 传送到种子节点的概率
         + d × Σ_{u→v} PR(u)/out_degree(u)  # 邻居传播

收敛后,每个节点得到一个 PPR 分数,
分数越高表示与种子节点的图结构关联越强

3.3 PPR 能捕获什么?

PPR 通过图结构传播,能发现 DPR 语义检索遗漏的相关内容:

示例:多跳图路径

查询: "高血压患者能使用布洛芬吗?"

DPR 直接召回:
  → 高血压相关文本
  → 布洛芬相关文本(可能较少)

PPR 通过图传播发现:
  种子:高血压实体
  └──► 高血压 -[CONTRAINDICATED_WITH]→ NSAIDs(非甾体抗炎药)
       └──► NSAIDs -[IS_A_CLASS]→ 布洛芬所属类别
            └──► 布洛芬相关使用��忌文本

最终 PPR 高分节点:
  • 高血压禁忌用药指南 Chunk ← 通过两跳图路径发现
  • NSAIDs 与血压关系研究 Chunk

PPR 的价值:

能力描述
多跳推理通过图边传播,发现 N 跳之外的相关知识
关系感知利用实体关系(TREATS、CAUSES、CONTRAINDICATED 等)传播
互索引利用通过 KG 节点←→Chunk 双向链接扩展检索覆盖
概念扩展通过概念图上位词关系扩展查询范围

4. 第三层:RRF(Reciprocal Rank Fusion,互惠排名融合)

4.1 问题背景

DPR 和 PPR 分别返回排好序的候选 Chunk 列表,但:

  • 两者的分数量纲不同(余弦相似度 vs. PPR 概率值)
  • 无法直接比较,需要融合重排

4.2 RRF 算法

RRF 是一种简单而有效的排名融合算法,不依赖分数绝对值,只利用排名位置

RRF_score(doc d) = Σ_{i ∈ retrievers} 1 / (k + rank_i(d))

其中:
  k = 平滑常数(通常为 60,防止排名第1的过度优势)
  rank_i(d) = 文档 d 在第 i 个检索器中的排名(从1开始)
  如果文档 d 未出现在某检索器的结果中,该检索器不贡献分数

示例计算:

两个检索器结果:
DPR 排名: [A, B, C, D, E]
PPR 排名: [C, A, F, B, G]

RRF 计算(k=60):
  Doc A: 1/(60+1) + 1/(60+2) = 0.01639 + 0.01613 = 0.03252
  Doc B: 1/(60+2) + 1/(60+4) = 0.01613 + 0.01563 = 0.03176
  Doc C: 1/(60+3) + 1/(60+1) = 0.01587 + 0.01639 = 0.03226
  Doc D: 1/(60+4) + 0         = 0.01563
  Doc E: 1/(60+5) + 0         = 0.01538
  Doc F: 0         + 1/(60+3) = 0.01587
  Doc G: 0         + 1/(60+5) = 0.01538

RRF 最终排名: A > C > B > F > D > E > G

4.3 RRF 的优势

特性描述
分数无关只用排名位置,无需两个系统分数量纲一致
鲁棒性强对任一检索器的偶发失误不敏感
参数简单只有一个超参数 k(通常 60 即可)
无需训练无需额外的重排模型,计算成本极低
互补性两个检索器都召回的文档会获得双重加分

5. 完整混合检索流程

用户问题 / 子问题
        │
        ▼ 问题解析
  提取关键实体 + 语义核心
        │
        ├─────────────────────────────────┐
        │                                 │
        ▼                                 ▼
  DPR 向量检索                    PPR 图传播检索
  1. 问题向量化                   1. 识别种子节点
  2. ANN 检索向量数据库                (DPR top-k + 查询实体)
  3. 返回 top-k Chunk 及排名     2. 在 KG 上运行 PPR
                                  3. 按 PPR 分数排序
                                  4. 返回 top-k Chunk 及排名
        │                                 │
        └──────────────┬──────────────────┘
                       │
                       ▼
              RRF 互惠排名融合
              计算每个 Chunk 的 RRF 分数
              最终排序 → top-m Chunk
                       │
                       ▼
         相关 KG 三元组(来自互索引)
                       │
                       ▼
              送入 Generator 生成答案

6. 与传统检索方案对比

6.1 覆盖率对比

                  DPR 覆盖    PPR 扩展的额外覆盖
                  ─────────   ──────────────────
直接语义相关          ✓              ✓(强化)
多跳图路径关联        ✗              ✓
同义词/上位词扩展      弱             ✓(概念图)
实体关系链接          ✗              ✓

6.2 各检索方案对比总结

检索方案多跳推理图结构利用实现复杂度典型应用
Naive RAG通用问答
GraphRAG Local弱(1-hop)实体查询
GraphRAG Global✗(社区摘要)全局总结
KAG DPR 单独
KAG DPR+PPR+RRF✓(多跳)✓(PPR 传播)中高专业推理

7. 超参数配置

hybrid_retrieval:
  # DPR 配置
  dpr:
    model: "bge-m3"         # 向量化模型
    top_k: 10               # 初始召回数量
    similarity: "cosine"    # 相似度度量

  # PPR 配置
  ppr:
    damping_factor: 0.85    # 随机游走阻尼系数
    max_iterations: 100     # 最大迭代次数
    convergence_threshold: 1e-6  # 收敛阈值
    top_k: 10               # PPR 返回的 Chunk 数量
    seed_from_dpr: true     # 使用 DPR top-k 作为种子节点

  # RRF 配置
  rrf:
    k: 60                   # 平滑常数
    final_top_m: 5          # 最终送入 Generator 的 Chunk 数

8. 实际效果数据

在 HotpotQA 多跳问答基准上,不同检索策略的性能(F1 分数):

检索策略F1 分数相对提升
纯向量检索(DPR only)基线
图检索(PPR only)基线 +5%+5%
DPR + PPR(无 RRF)基线 +12%+12%
DPR + PPR + RRF(KAG)基线 +19.6%+19.6%

RRF 的额外贡献(相比简单合并)约提升 7-8%,说明排名融合本身带来了显著的质量提升。


相关文档


05_与GraphRAG对比分析

KAG vs. GraphRAG 深度对比分析

1. 背景

GraphRAG(微软研究院,2024年4月)和 KAG(蚂蚁集团,2024年10月)都是基于知识图谱增强 RAG 的代表性框架,但两者的设计目标、技术路线和适用场景存在显著差异。

GraphRAGKAG
发布方微软研究院蚂蚁集团 + 浙江大学
发布时间2024年4月2024年10月
论文"From Local to Global: A Graph RAG Approach to Query-Focused Summarization""KAG: Boosting LLMs in Professional Domains via Knowledge Augmented Generation"
核心定位大规模语料全局理解与摘要专业领域精准推理与问答

2. 设计理念对比

2.1 GraphRAG 的核心思想

GraphRAG 聚焦于解决"查询聚焦摘要"问题:如何从大量文档中回答需要全局理解的宏观问题?

GraphRAG 的核心路径:
文档 → OpenIE 抽取 → KG → 社区检测(Leiden 算法)
     → 社区层级摘要(LLM)
          │
          ├── Global Search: 汇总所有社区摘要(Map-Reduce)
          └── Local Search: 从实体出发遍历 1-hop 邻居

适合的问题类型:

  • "这批文档的主要主题是什么?"
  • "哪些组织在这个领域最具影响力?"
  • "整体趋势如何?"(全局综合性问题)

2.2 KAG 的核心思想

KAG 聚焦于解决"专业领域精准推理"问题:如何在要求事实精确、逻辑严谨的专业场景下提供可靠答案?

KAG 的核心路径:
文档 → 双模态抽取(OpenIE + Schema约束)→ 概念图对齐
     → 互索引(KG节点 ←→ Chunk)
          │
          └── KAG-Solver:
              逻辑形式分解(DAG)→ 混合推理(DPR+PPR+RRF)
              → 四类算子执行(图查询/语义检索/数值计算/推理)

适合的问题类型:

  • "高血压患者能否同时使用布洛芬?"(多知识结合推理)
  • "连续工作满1年的员工,年假天数是多少?"(精确法规查询)
  • "2023年蚂蚁集团收购的公司中,收购金额最大的是哪家?"(多跳+数值)

3. 知识图谱构建对比

3.1 构建流程对比

GraphRAG 构建:

文档
 ↓ 文本分块
 ↓ 实体/关系抽取(OpenIE - LLM)
 ↓ 知识图谱(无 Schema 约束)
 ↓ Leiden 社区检测(图算法)
 ↓ 社区报告生成(LLM)← Token 成本极高
输出:
  • entities.parquet
  • relationships.parquet
  • communities.parquet
  • community_reports.parquet(核心检索对象)

KAG 构建:

文档
 ↓ Layout 解析 + 语义分块
 ↓ 双模态知识抽取
   ├── Schema-free OpenIE(信息层)
   └── Schema-constrained 精准抽取(知识层)
 ↓ 属性归一化
 ↓ 概念图语义对齐(降噪)
 ↓ 互索引构建(KG ←→ Chunk 双向映射)
 ↓ LPG + 向量双模态存储
输出:
  • 知识图谱(Neo4j / TuGraph)
  • 向量数据库(Chunk Embeddings)
  • 互索引(双向映射表)

3.2 知识图谱质量对比

维度GraphRAGKAG
Schema 约束无(完全开放 OpenIE)双模态(开放 + 约束)
噪声水平高(OpenIE 抽取自由度大)低(概念图对齐降噪)
知识精确性高(领域 Schema 保证)
知识与文本关联弱(KG 节点与原文割裂)强(互索引双向绑定)
图连通性依赖 OpenIE 质量高(概念图增强连通)
社区摘要有(Leiden + LLM 摘要)

4. 检索与推理机制对比

4.1 GraphRAG 的两种查询模式

Local Search(局部精确查询):
  Query → 向量检索 → 相关实体
       → 图遍历(1-hop 邻居)
       → [实体信息 + 关系 + 社区报告片段 + 文本块]
       → LLM 生成答案

  优点:速度快,适合实体相关问题
  缺点:仅 1-hop,无法多跳推理

Global Search(全局综合查询):
  Query → 所有社区报告 → 并发 Map(每个社区一次 LLM 调用)
       → Reduce(LLM 汇总所有局部答案)

  优点:全局视角,综合性强
  缺点:Token 成本极高(4×10⁴ tokens),无法精确推理

4.2 KAG 的混合推理

KAG-Solver(统一推理引擎):
  Query
   → 逻辑形式分解(DAG 子问题图)
   → 对每个子问题:
       ├── cypher_executor:精确图查询
       ├── kag_hybrid_exec:DPR + PPR + RRF 混合检索
       ├── math_executor:数值计算
       └── semantic_reasoning:LLM + 概念图推理
   → 子答案综合 → 验证 → 最终答案

  优点:支持多跳推理、数值计算、精确匹配、语义推理全覆盖
  缺点:推理延迟较高

4.3 推理能力对比

推理类型GraphRAGKAG
单跳实体查询✓(Local)
全局总结✓(Global)弱(无社区摘要机制)
多跳图推理✓(DAG + PPR)
数值计算✓(math_executor)
时序推理✓(math + Cypher)
概念扩展✓(概念图)
逻辑推断✓(逻辑形式)
探索式研究✓(DRIFT Search)

5. Token 成本对比

5.1 构建阶段

阶段GraphRAGKAG(完整模式)KAG(轻量模式)
实体/关系抽取LLM(高)LLM(高)NLP 模型(极低)
摘要/报告生成LLM(极高)
对齐归一化LLM(中)NLP 模型(低)
总计极高低(-89%)

GraphRAG 社区摘要生成是 Token 消耗的主要来源——每个社区都需要一次 LLM 调用生成摘要,大规模语料(如 10 万文档)可能需要数万次 LLM 调用。

5.2 查询阶段

GraphRAG Global Search Token 消耗(单次查询):
  - 所有社区报告(level=1)平均:2000 tokens × 100 社区 = 200,000 tokens(Map 阶段)
  - Reduce 阶段:~5,000 tokens
  - 总计:~200,000 tokens(约 4×10⁴ tokens 是保守估计)

KAG 查询 Token 消耗(单次查询):
  - 规划器:~1,000 tokens
  - 每个子问题的上下文:~2,000 tokens × N 个子问题
  - 最终生成:~1,000 tokens
  - 总计:通常 5,000~15,000 tokens(取决于问题复杂度)

成本比较:GraphRAG Global Search 约为 KAG 的 10-40 倍

6. 知识与文本的关联机制

这是 KAG 与 GraphRAG 最根本的架构差异之一:

GraphRAG 的关联方式(弱关联)

原始文本 ──► 实体/关系节点(KG)
              │
              └── 指向社区摘要(LLM 生成的摘要文本)
                        │
                        └── 社区摘要与原始文本之间的联系已弱化

问题:

  • 社区摘要是 LLM 生成的二次文本,可能丢失原文细节
  • 推理结果的溯源链路断裂(答案来自摘要,而非原文)

KAG 的互索引(强关联)

原始文本 Chunk ◄──── 互索引 ────► KG 节点(实体/关系)
     │                                    │
     │ 携带实体引用                        │ 携带 Chunk 引用
     ▼                                    ▼
可直接定位相关实体                   可直接回溯原文上下文

优势:

  • 每个推理步骤都可追溯到具体原文段落
  • 不丢失细节,知识与上下文完整保留
  • 推理结果可引用具体文档位置(高可解释性)

7. 性能基准对比

7.1 多跳推理基准

HotpotQA(需要跨两篇文章推理):

方案F1 分数
Naive RAG~45%
GraphRAG~52%
KAG~64%
提升(vs GraphRAG)+12pp

2WikiMultiHopQA(需要跨多文档多跳推理):

方案F1 分数
Naive RAG~38%
GraphRAG~42%
KAG~56%
提升(vs GraphRAG)+14pp

7.2 专业领域基准

政务问答(E-Government QA):

方案精确率召回率
Naive RAG66%
GraphRAG71%
KAG91.6%71.8%

医疗热门科普(E-Health Popular QA):

方案准确率
Naive RAG~70%
KAG94%+

8. 适用场景决策指南

需要全局理解和宏观总结?
  └── 是 → GraphRAG(Global Search)
          └── "这批文档涉及哪些主要议题?"

问题涉及具体实体,需要局部精确答案?
  └── 是 → GraphRAG(Local Search)或 KAG 均可
          └── "Tesla 的主要业务是什么?"

问题需要多跳推理(跨多个知识节点)?
  └── 是 → KAG(逻辑形式 + DAG)
          └── "蚂蚁集团的母公司阿里巴巴的创始人在哪里读大学?"

问题涉及数值计算或时序推断?
  └── 是 → KAG(math_executor)
          └── "这份合同还有多少天到期?"

专业领域(法律/医疗/金融/政务)问答?
  └── 是 → KAG(Schema 约束 + 精确推理)

探索性研究,不知从何入手?
  └── 是 → GraphRAG(DRIFT Search)

大规模通用语料,快速构建,成本敏感?
  └── 是 → GraphRAG(fast 模式)或 Naive RAG

9. 两者的互补性

KAG 和 GraphRAG 并非互斥关系,各有所长:

优势场景推荐方案
通用问答、宏观摘要GraphRAG
探索式开放研究GraphRAG DRIFT
专业领域精准推理KAG
多跳逻辑推理KAG
数值时序计算KAG
成本极度敏感Naive RAG / GraphRAG fast
超大规模语料全局理解GraphRAG

10. 总结

维度              GraphRAG              KAG
─────────────────────────────────────────────
设计目标          大规模全局理解         专业领域精准推理
KG 构建质量       中(OpenIE噪声)       高(Schema+对齐)
知识-文本关联     弱(社区摘要)         强(互索引)
多跳推理          ✗                     ✓
数值计算          ✗                     ✓
全局总结          ✓(Global Search)    ✗
Token 成本        高(Global 极高)      中(轻量-89%)
可解释性          中                    高(逻辑溯源)
专业领域          中                    强
多跳基准提升      基线                  +19.6%~33.5%

KAG 在专业领域精准推理上的优势来自于:

  1. Schema 约束的高质量知识图谱
  2. 逻辑形式引导的结构化推理
  3. 互索引保证的完整上下文溯源
  4. 四类算子覆盖的全面推理能力

GraphRAG 的优势则在于大规模语料的全局理解和探索性研究场景。


相关文档