模型 / 数据集
InternScience/GraphGen avatar
InternScience/GraphGen

GraphGen:用知识图谱挑出模型的知识盲区,再造 SFT 数据

GraphGen: Enhancing Supervised Fine-Tuning for LLMs with Knowledge-Driven Synthetic Data Generation

1,221 个 Star98 个 ForkPythonApache-2.0

秒懂

它是什么?
GraphGen 把源文本建成细粒度知识图谱,用期望校准误差定位大模型答不好的长尾知识,再针对这些缺口生成 QA 对。它的取舍很明确:用图结构换数据针对性,代价是前期构图开销和上游抽取质量的强依赖。
适合谁用?
GraphGen 适合手里已经有一批领域语料、并且发现通用 SFT 数据在长尾知识上收效有限的人,尤其是需要把领域文本转成可训练 QA 的团队。如果你的语料本身质量差、或者你只是想要一批通用对话数据,它并不划算,因为构图和校准这两步都建立在源文本可靠的前提上。
能商用吗?
可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库最近一次提交在 30 天前。
用什么语言写的?
主要是 Python(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

先看清 GraphGen 要解决的是哪一类数据问题

做 SFT 的人迟早会撞上同一个问题:通用指令数据把模型的对话格式调好了,但模型在自己关心的领域里依然答错,而且错得很有规律,集中在那些语料里出现次数少、但业务上又必须答对的知识点上。继续加量通用数据没用,因为缺口不在数量上。

GraphGen 的切入点是把源文本建成知识图谱,再用期望校准误差(Expected Calibration Error)去衡量模型在图谱上的哪些部分信心与正确率不匹配,把不匹配的地方当成知识缺口,优先为这些高价值长尾知识生成 QA 对。README 的原话是它「identifies knowledge gaps in LLMs using the expected calibration error metric, prioritizing the generation of QA pairs that target high-value, long-tail knowledge」。

所以它面向的不是「我要更多数据」,而是「我要更准的数据」。这个定位决定了它的使用成本结构:你得先有源文本,还得愿意为构图和校准付出算力。

从文本到可训练 QA 的四段流水线

按照 README 的描述,流程分几个可辨识的阶段。第一段是构图:从源文本抽取实体和关系,形成一个细粒度知识图谱。第二段是校准:用期望校准误差找出模型在哪些知识上表现不佳。第三段是采样:采用多跳邻域采样(multi-hop neighborhood sampling)去捕捉复杂的关系信息,这一步决定了生成的题目是否涉及跨实体的推理,而不只是单点事实问答。第四段是生成:用风格控制(style-controlled generation)让同一批知识产出不同表达方式的 QA,避免数据在句式上过度同质。

仓库的更新记录显示这条流水线在持续改造。2025.12.16 的更新提到用 ray 重构了数据生成流水线,目的是改善分布式执行和资源管理。同一天还加入了 rocksdb 作为键值存储后端、kuzudb 作为图数据库后端。这些后端选择说明图谱规模可能超出内存图结构的舒适区,否则不需要引入外部图数据库。

2025.08.14 加入了 Leiden 算法做社区检测,用于合成 Chain-of-Thought 数据。这个改动的意义在于:社区结构天然对应一组彼此关联的概念,围绕一个社区生成推理链比围绕单个三元组生成更自然。

安装与跑通:命令和配置项来自仓库材料

PyPI 上的包名是 graphg,不是 graphgen,这一点在 README 的徽章链接里可以直接看到。文档站点是 chenzihong.gitbook.io/graphgen-cookbook,README 把它列为 latest 文档入口,具体安装命令和配置键应以该文档为准,这里只能给出仓库材料中明确出现的部分。

数据生成的脚本入口在 scripts/generate/ 目录下。README 明确给出的一条命令是 VQA 数据生成:bash scripts/generate/generate_vqa.sh。其他形态的数据生成脚本按同样命名规律放在该目录,但具体文件名需要查仓库。

配置层面,README 提到可以通过配置切换 LLM 客户端与推理后端。已支持的客户端包括 Ollama_client 和 http_client,本地推理后端包括 HuggingFace Transformers 的 hf_wrapper、SGLang 的 sglang_wrapper,以及 2025.12.16 加入的 vllm。这些 wrapper 的路径在 README 里以链接形式给出,例如 graphgen/models/llm/api/ollama_client.py 和 graphgen/models/llm/local/sglang_wrapper.py。

输入格式方面,2025.10.21 起支持通过 MinerU 处理 PDF,2026.02.04 起支持 HuggingFace Datasets 作为输入数据源。搜索后端则从 Google、Bing、Wikipedia、UniProt 扩展到 NCBI 和 RNAcentral。生成完成后,README 指向 LLaMA-Factory 和 xtuner 做微调,也就是说 GraphGen 本身不负责训练。

它不会替你解决源文本的质量问题

整条流水线的上游是知识图谱,而图谱的质量完全取决于从源文本抽取实体和关系的效果。抽取错了,后面的校准就在错误的结构上进行,生成出来的 QA 会系统性地围绕错误知识展开,而且因为经过图谱这一层加工,错误反而更难被人工抽查发现。

2025.12.26 的更新加入了知识图谱评测指标,覆盖实体与关系准确率、冲突检测一致性、以及针对噪声、连通性和度分布的结构鲁棒性。这组指标的存在本身就说明构图质量是个需要被度量的问题,而不是默认成立的前提。如果你的语料是论坛帖子、会议记录这类实体边界模糊的文本,抽取阶段的噪声会明显高于结构化文档。

另一个约束是成本。构图要调用 LLM 做抽取,校准要调用 LLM 做评测,生成还要调用 LLM。整条链路对推理后端的吞吐敏感,这也是引入 vLLM、SGLang 和 ray 的原因。如果只是想要几千条问答数据,走这条路不如直接写 prompt 让模型批量生成。

和直接 prompt 生成数据的差别在哪

最直接的替代做法是拿源文本切片,逐块丢给模型,让它生成问答对。这种做法实现成本极低,缺点也很清楚:模型倾向于围绕文档里反复出现的显眼内容出题,长尾知识被忽略,而且不同切片之间会重复覆盖同一批概念。

GraphGen 的差异在于它把「该问什么」这一步从生成模型手里拿走,交给图谱结构和校准指标决定。多跳邻域采样让题目可以跨越多个实体,这是逐块 prompt 很难稳定做到的,因为单块文本里往往凑不齐一条完整的关系链。期望校准误差则提供了一个筛选依据,让生成预算优先花在模型确实不会的地方,而不是随机分配。

代价是流程变长、可调参数变多、失败点也变多。逐块 prompt 出错时你一眼能看出是哪段文本的问题,图谱流水线出错时你需要在抽取、校准、采样、生成四个环节之间定位。

版本节奏与维护成本

从更新记录看,这个项目的迭代相当密集。2025 年 4 月发布初版,此后几乎每月都有功能性更新,涉及后端替换、输入格式扩展、流水线重构。这种节奏的好处是能力边界在快速扩张,坏处是接口和配置可能不稳定。仓库的 release 列表中,20250422 之后的下一个正式发布是 v0.1.0.post20250930,中间几个月的改动主要通过 commit 和更新日志体现。

对使用者的实际影响是:升级前需要核对配置键和脚本路径是否变化。2025.12.16 那次用 ray 重构流水线,属于会影响调用方式的结构性改动。如果你把 GraphGen 嵌进了自己的数据生产流程,建议锁版本,而不是跟随 main 分支。

许可方面,项目采用 Apache-2.0,允许商用和修改,附带专利授权条款。需要注意的边界是:GraphGen 本身是 Apache-2.0,但它调用的模型、以及你喂进去的源文本各有各的许可,生成数据的可用范围取决于这两者,而不是取决于 GraphGen 的许可。这一点需要你自行确认,不构成法律意见。

pretrain 方向上的 rephrase 流水线

README 里有一段容易被忽略的内容:GraphGen 增加了 rephrase 流水线,用 LLM 驱动的改写为同一份语料生成多样化变体,替代简单重复。这个思路在 README 中被归因于 Kimi-K2 技术报告里的 Improving Token Utility with Rephrasing 和 ByteDance Seed 的 MGA 框架。

README 给出的实验设置是 Qwen3-0.6B 从零开始在 SlimPajama-6B 上训练,对比两轮训练的基线,和一轮训练加 Executive-Summary 改写的版本,评测集包括 ARC-E、ARC-C、HellaSwag、GSM8K 和 TruthfulQA。这是仓库自己给出的数字,我无法独立验证,也不清楚测试的完整条件。

值得注意的是这部分和主线的关系。主线是知识图谱驱动的 QA 生成,rephrase 是面向预训练语料的改写,两者共享 LLM 调用基础设施,但解决的问题不同。如果你关心的是 SFT 数据,这段内容对你参考价值有限。

编辑结论

GraphGen 适合手里已经有一批领域语料、并且发现通用 SFT 数据在长尾知识上收效有限的人,尤其是需要把领域文本转成可训练 QA 的团队。如果你的语料本身质量差、或者你只是想要一批通用对话数据,它并不划算,因为构图和校准这两步都建立在源文本可靠的前提上。上手前先确认三件事:graphgen 在 PyPI 上的版本与仓库中 v0.1.0.post20250930 是否对应,你打算用的 LLM 客户端是否在支持列表里(Ollama、http、HF Transformers、SGLang、vLLM 各有独立 wrapper),以及 Leiden 社区检测生成的 CoT 数据是否真的符合你的任务形态。

官方来源

  1. InternScience/GraphGen on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
社区笔记

社区笔记