本文不是概念科普,而是一套可以直接跑起来的 KAG(Knowledge-Augmented Generation)工程闭环:用大模型从小说文本中抽取知识图谱 JSON 一键导入 Neo4j,用评测集做 Recall@5 召回评测,最后把同一套链路用于图谱问答。
你可以把它当成做 KAG、GraphRAG 或 KGQA 的最小可落地 MVP。
为什么要做 KAG?我遇到的痛点
做 RAG 时,我踩过一个典型坑:向量召回对'典故/情节类问题'并不稳定。比如你搜'温酒斩华雄',但原文可能写成'其酒尚温',人物可能是'云长/关公',词面变化导致召回波动。
如果分块策略偏大,章节内细粒度信息容易被稀释;如果分块过小,语义又不完整。而知识图谱擅长的恰好是实体、事件、关系的结构化表示。通过 Event/Character -> APPEARS_IN -> Chapter 可以精准落到具体章回。
所以我最终选择:RAG 负责'文本证据'与'长上下文生成',KG 负责'结构化召回、强约束定位',二者组合形成 KAG。
工程结构:5 个测试类 + 1 个评测集
这套闭环全部以 JUnit 测试类的形式提供,方便你在工程里反复迭代。
评测集
数据位于 doc/eval/sanguo-kg-eval.json。数据结构包含 query 问题,以及 answers[] 标准答案集合,其中记录了期望命中的章回标题和可接受关键词。
抽取:LlmKgExtractTest
输入是 doc/aigc_chunk_store_to_graph.csv,输出为 doc/kg_extract_result.json。逐行读取 CSV(每行是一段章回文本),调用 LLM 抽取 Character、Location、Event、Item 等实体,以及关系 relations[{type, head, tail}]。同时附带写入章回元信息如 documentName/chapterTitle。
入库:KgNeo4jImportTest
核心写入逻辑是创建 (:Chapter {chapterKey}) 作为'章回锚点',再创建实体节点。关键是把实体与章回相连:
(n)-[:APPEARS_IN]->(c:Chapter)
这个 APPEARS_IN 的含义是实体/事件出现在某章回。它非常关键,把'结构化实体世界'挂回到'可以回答问题的章回证据'。
Schema 获取:Neo4jSchemaIntrospectTest
LLM 要生成靠谱的 Cypher,必须知道你图谱里有哪些 label、关系类型以及每个 label 的关键属性。我用 CALL db.labels() / CALL db.relationshipTypes() 做了 schema 探测。
召回评测:SanguoKgRecallEvalTest
核心是把'问题→图谱查询→命中判定'做成评测流程。链路如下:
- 读取评测集。
- 探测 Neo4j schema。
- 对每个 query:LLM 抽取意图/关键词,生成 Cypher(返回
{cypher, params})。对 Cypher 做预检EXPLAIN <cypher>,若失败把错误信息回灌给 LLM 做修复,再预检。 - 执行查询拿 TopK,再让 LLM 判定是否命中标准答案。
- 汇总 Recall@5。
KAG 问答:KagGraphLLMQATest
这是'评测链路'的应用版。同样先拿 schema,LLM → Cypher → 查询 → LLM 组织最终答案。这一步的意义在于评测不是终点,你最终要的是线上问答可用,所以必须把评测链路的关键能力迁移到问答链路里。
环境准备
默认连接配置如下:
- Neo4j:
bolt://localhost:7687, 用户名 , 密码建议按你的环境调整。

