跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaAIjava算法

KAG 实战:基于 LLM 抽取知识图谱与 Neo4j 的图谱问答闭环

综述由AI生成一套 KAG(知识增强生成)的工程闭环方案。通过大模型从文本中抽取知识图谱并导入 Neo4j,结合 Schema 探测与 Cypher 生成预检机制,实现了基于图谱的召回评测与问答功能。以《三国演义》为例,展示了实体抽取、章回定位、Recall@5 评估及图谱问答的完整流程,为 GraphRAG 和 KGQA 落地提供最小可执行参考。

云朵棉花糖发布于 2026/4/6更新于 2026/5/2427 浏览

本文介绍一套可以直接运行的 KAG(Knowledge-Augmented Generation)工程闭环:用大模型从小说文本中抽取知识图谱 JSON 一键导入 Neo4j,用评测集做 Recall@5 召回评测(LLM 参与生成 Cypher + 判定命中),最后把同一套链路用于图谱问答(LLM 生成 Cypher → 查图 → 再让 LLM 组织答案)。可作为 KAG / GraphRAG / KGQA 的最小可落地 MVP。

1. 为什么要做 KAG?我遇到的痛点

做 RAG 时,遇到过典型坑:

  • 向量召回对'典故/情节类问题'并不稳定:搜'温酒斩华雄',但原文可能写成'其酒尚温'、人物可能是'云长/关公',词面变化导致召回波动。
  • 如果分块策略偏大(窗口 512/overlap 80),章节内细粒度信息容易被稀释;如果分块过小,语义又不完整。

而知识图谱擅长的恰好是:

  • 实体/事件/关系的结构化表示(谁在什么事件中做了什么)
  • '章回定位'类问题可以走更确定的路径:通过 Event/Character -> APPEARS_IN -> Chapter 精准落到具体章回

最终选择:

  • RAG 负责'文本证据'与'长上下文生成'
  • KG 负责'结构化召回、强约束定位',二者组合形成 KAG。

2. 本文工程结构:5 个测试类 + 1 个评测集

这套闭环全部以 JUnit 测试类的形式提供,方便在工程里反复迭代。

2.1 评测集
  • doc/eval/sanguo-kg-eval.json 数据结构:
  • query:问题
  • answers[]:标准答案集合
    • chapterTitle:期望命中的章回标题
    • accept[]:可接受关键词(用于判定命中)
2.2 抽取:LlmKgExtractTest
  • 输入:doc/aigc_chunk_store_to_graph.csv
  • 输出:doc/kg_extract_result.json 做的事:
  • 逐行读取 CSV(每行本质是一段'章回文本')
  • 调用 LLM 抽取:
    • Character/Location/Event/Item
    • 关系 relations[{type, head, tail}](这里已要求 LLM 输出中文关系短语)
  • 附带写入章回元信息:documentName/chapterTitle/chapterIndex/text
2.3 入库:KgNeo4jImportTest
  • 输入:doc/kg_extract_result.json
  • 输出:Neo4j 图数据库 核心写入逻辑:
  • 创建 (:Chapter {chapterKey}) 作为'章回锚点'
  • 创建实体节点::Character|:Event|:Location|:Item {name}
  • 把实体与章回相连:
(n)-[:APPEARS_IN]->(c:Chapter)

APPEARS_IN 的含义:实体/事件出现在某章回。这个关系非常关键,它把'结构化实体世界'挂回到'可以回答问题的章回证据'。

2.4 schema 获取:Neo4jSchemaIntrospectTest

LLM 要生成靠谱的 Cypher,必须知道图谱里有哪些 label、有哪些关系类型、每个 label 的关键属性是什么。所以用 CALL db.labels() / CALL db.relationshipTypes() 做了 schema 探测。

2.5 召回评测:SanguoKgRecallEvalTest

核心:把'问题→图谱查询→命中判定'做成评测流程。 链路:

  1. 读取评测集
  2. 探测 Neo4j schema
  3. 对每个 query:
    • LLM 抽取意图/关键词(intent/keywords/constraints)
    • LLM 生成 Cypher(返回 {cypher, params})
    • 对 Cypher 做预检:EXPLAIN <cypher>
      • 若失败,把错误信息回灌给 LLM 做'修复',再预检
    • 执行查询拿 TopK
    • 再让 LLM 判定是否命中标准答案(hit/ reason)
  4. 汇总 Recall@5
2.6 KAG 问答:KagGraphLLMQATest

这是'评测链路'的应用版:

  • 同样先拿 schema
  • LLM → Cypher → 查询 → LLM 组织最终答案 这一步的意义:评测不是终点,最终要的是'线上问答可用'。所以必须把评测链路的关键能力(schema+Cypher 生成 + 预检/修复)迁移到问答链路里。

3. 环境准备(Neo4j + LLM)

3.1 Neo4j

默认连接:

  • bolt://localhost:7687
  • 用户名:neo4j
  • 密码:测试代码里是 secretgraph(请按你的环境调整)
3.2 LLM(OpenAI 兼容接口)

当前测试类默认使用:

  • https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
  • 模型:qwen-plus 注意:建议把 Key 放到环境变量里,不要提交到仓库。

4. 一键跑通闭环:推荐执行顺序

按这个顺序跑,最稳:

  1. LlmKgExtractTest:从 CSV 抽取出 doc/kg_extract_result.json
  2. KgNeo4jImportTest:清空 Neo4j → 写入 Chapter/Entity/Relations
  3. Neo4jSchemaIntrospectTest:确认图谱结构是否如预期
  4. SanguoKgRecallEvalTest:跑 Recall@5
  5. KagGraphLLMQATest:用任意问题做 KAG 问答

5. 两个最关键的工程经验(决定你是不是能跑通)

5.1 让 LLM 生成 Cypher,必须先喂'真实 schema'

很多人 Cypher 生成失败,根本原因是:

  • 你让 LLM 写 (:Chunk) / HAS_CHUNK,但你的图谱里可能压根没有
  • 或者属性叫 chapterTitle 还是 title,LLM 猜错就全挂 所以 schema introspection 是必做项。
5.2 LLM 生成的 Cypher 必须预检 + 自动修复

LLM 写 Cypher 很容易出现:

  • 聚合/ORDER BY 语法错误
  • 用错 APOC
  • 参数类型不匹配 解决方法:
  • 预检:EXPLAIN cypher
  • 若失败:把错误信息 + 原 cypher 回灌给 LLM → 让它修复
  • 最多重试 1~2 次 这就是为什么 SanguoKgRecallEvalTest 的链路可复用到 KagGraphLLMQATest。

6. 召回评测怎么看?为什么能指导 KAG?

doc/eval/sanguo-kg-eval.json 的问题基本都是'章回定位'类:

  • 桃园结义是哪一回?
  • 温酒斩华雄出自哪一回?
  • 草船借箭是哪一回? 这种任务对 KAG 很友好:
  • 你只要能把问题映射成图谱查询
  • 找到对应 Chapter 的 title / index / text
  • LLM 再基于 text 给出最终回答 评测指标:
  • Recall@5:标准答案是否出现在 Top5 返回结果里 它能直接反映:
  • 你的图谱建模是否有效(有没有正确挂到 Chapter)
  • 你的 Cypher 生成策略是否靠谱(关键词拆分、AND/OR 降级)
  • 你的命中判定是否稳定(accept 关键词、标题模糊匹配)

7. 下一步:从'章回定位'升级到真正 KAG(复杂问题)

本文的闭环是 KAG MVP,但已经为复杂问答铺好路:

  1. 先做'证据召回'(KG → Chapter/Text)
  2. 再做'证据生成'(LLM summarization / reasoning) 后面可以继续扩展:
  • 多跳查询:人物 → 事件 → 地点 → 章回
  • 关系约束:如只看 敌对/同盟/父子
  • 图谱 + 向量混合检索:KG 决定范围,RAG 提供长证据

8. 常见坑位排雷(我踩过的都写了)

  • LLM 响应解析:一定要从 OpenAI 兼容结构里取 choices[0].message.content,否则你会把 error 当 content 用。
  • 关系 type 中文化:如果 relation type 输出英文,Neo4j relationshipTypes 会爆炸增长,后续召回更难。
  • Chapter 元数据必须写进 KG JSON:否则你只有实体,没有'章回锚点',无法做章回召回评测。

9. 你可以直接复用的 3 段核心 Prompt(建议收藏)

9.1 抽取 KG(实体 + 关系)

要求:关系 type 用中文短语;实体尽量原文;输出 JSON。

9.2 生成 Cypher(带 schema)

要求:

  • 拆分/扩展关键词
  • 避免高频人名作为严格 AND
  • 返回 title/idx/doc/text
  • LIMIT 5
9.3 命中判定(评测)

输入:query + answers + topK 输出:{hit, reason}

10. 结语:为什么我说这是'最小可落地 KAG'

很多 KAG 文章停留在概念图,但真正工程上,最难的是:

  • 图谱 schema 不统一
  • 查询不可控
  • LLM 生成 Cypher 经常报错
  • 没评测就没迭代方向 本文这套 JUnit 流程解决的恰恰是这些'落地问题'。如果你也在做:
  • GraphRAG / KGQA / KAG
  • Neo4j + 大模型
  • 召回评测体系 这套闭环可以直接作为你的工程起点。
附:本文提到的关键文件
  • doc/eval/sanguo-kg-eval.json
  • doc/kg_extract_result.json
  • src/test/java/com/soft/nda/segment/LlmKgExtractTest.java
  • src/test/java/com/soft/nda/segment/KgNeo4jImportTest.java
  • src/test/java/com/soft/nda/segment/Neo4jSchemaIntrospectTest.java
  • src/test/java/com/soft/nda/segment/SanguoKgRecallEvalTest.java
  • src/test/java/com/soft/nda/segment/KagGraphLLMQATest.java

目录

  1. 1. 为什么要做 KAG?我遇到的痛点
  2. 2. 本文工程结构:5 个测试类 + 1 个评测集
  3. 2.1 评测集
  4. 2.2 抽取:LlmKgExtractTest
  5. 2.3 入库:KgNeo4jImportTest
  6. 2.4 schema 获取:Neo4jSchemaIntrospectTest
  7. 2.5 召回评测:SanguoKgRecallEvalTest
  8. 2.6 KAG 问答:KagGraphLLMQATest
  9. 3. 环境准备(Neo4j + LLM)
  10. 3.1 Neo4j
  11. 3.2 LLM(OpenAI 兼容接口)
  12. 4. 一键跑通闭环:推荐执行顺序
  13. 5. 两个最关键的工程经验(决定你是不是能跑通)
  14. 5.1 让 LLM 生成 Cypher,必须先喂“真实 schema”
  15. 5.2 LLM 生成的 Cypher 必须预检 + 自动修复
  16. 6. 召回评测怎么看?为什么能指导 KAG?
  17. 7. 下一步:从“章回定位”升级到真正 KAG(复杂问题)
  18. 8. 常见坑位排雷(我踩过的都写了)
  19. 9. 你可以直接复用的 3 段核心 Prompt(建议收藏)
  20. 9.1 抽取 KG(实体 + 关系)
  21. 9.2 生成 Cypher(带 schema)
  22. 9.3 命中判定(评测)
  23. 10. 结语:为什么我说这是“最小可落地 KAG”
  24. 附:本文提到的关键文件
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 SpringBoot+Vue 的动漫视频分享与交流平台设计与实现
  • DeepSeek 各版本说明与优缺点分析
  • Python 股票数据接口教程:使用 mootdx 获取行情与财务数据
  • SpringBoot 整合 DL4J 构建智能写作助手
  • VS Code 无法下载 .vsix 插件的离线安装方案(以 C/C++ 插件为例)
  • VSCode 无法下载 vsix 插件的解决方案:以 C/C++ 插件为例
  • 深入解析 AI 大模型:概念、技术架构与产业现状
  • Cesium 无人机智能航线规划:航点动作组与 AI 识别实战
  • 零次方机器人发布轮式人形机器人 Zerith-H1 及操作基础模型 Zerith-V0
  • 昇腾 A2 部署 Pi0 机器人大模型:CANN 环境实测
  • 即梦 AI 基础操作指南:绘画与视频生成入门
  • 基于 SpringBoot+Vue 的高校一卡通管理系统设计与实现
  • Flutter wasm_interop 在鸿蒙 Web 端的适配与性能优化指南
  • IntelliJ IDEA 切换 JDK 版本完整教程
  • Trae AI 将设计稿自动生成前端代码图文指南
  • 无人机如何革新光伏电站巡检
  • Spring Boot 微服务架构:独立匹配系统设计及后端对接
  • 从前端到 DevOps:各类开发者 AI 工作流工具
  • LLM 大模型训练优化策略详解:数据并行、模型并行与 ZeRO
  • 在 PPT 中嵌入 AI 生成的 H5 代码使用方法

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online