知乎有一篇文章,可以拿来参考:
* https://zhuanlan.zhihu.com/p/1899069273533581204
论文要解决的问题
论文旨在解决大语言模型(LLM)监督微调(SFT)中高质量监督数据稀缺的问题。现有合成数据生成方法存在事实错误、长尾知识覆盖不足、知识结构简单化和输出同质化等缺陷,尤其在闭卷知识密集型问答任务中表现不佳。GraphGen通过知识图谱引导的合成数据生成,提升数据质量。
前人研究现状
- 基于知识图谱(KG)的方法:早期依赖人工模板生成,存在多样性差的问题;后续引入RNN等模型,但难以保证事实一致性。
- 纯LLM生成方法:依赖模型自生成数据,但存在幻觉和可控性差的问题(如Genie、SELF-QA)。
- 混合方法:结合KG与LLM(如EntiGraph),但多聚焦通用文本生成而非SFT数据优化。
当前水平:现有方法在知识覆盖深度、复杂推理支持和数据多样性上仍有显著不足。
论文的idea来源
灵感来源于:
- 知识图谱的结构化知识表示:解决LLM生成数据的碎片化问题
- 预期校准误差(ECE):量化模型对知识的置信度偏差,识别知识盲区
- 多跳推理需求:从生物医学/农业领域复杂QA任务中抽象出原子/聚合/多跳三类场景
具体方案
四阶段流程:
* *知识构建:从原始文本抽取实体关系构建细粒度KG
4. 理解评估:通过ECE计算模型对KG三元组的置信度偏差,筛选高价值长尾知识
5. 图谱组织:基于k-hop邻域采样生成子图,控制子图复杂度(最大token数、采样策略)
6. QA生成:
- 原子QA:单实体/关系直接生成
- 聚合QA:融合子图信息生成连贯长答案
- 多跳QA:基于路径推理生成链式问题
伪代码:GraphGen核心流程
def GraphGen(source_texts, trainee_model):
# Step 1: 知识图谱构建
kg = build_knowledge_graph(source_texts)
# Step 2: 理解度评估
high_value_edges = []
for edge in kg.edges:
paraphrases = generate_paraphrases(edge.description)
conf_scores = [trainee_model.confidence(p) for p in paraphrases]
ece = compute_ece(conf_scores) # 计算预期校准误差
if ece > threshold:
high_value_edges.append(edge)
# Step 3: 子图采样
synthetic_data = []
for edge in high_value_edges:
subgraph = k_hop_sampling(
kg,
start_edge=edge,
max_hops=2,
strategy="max_loss"
)
# Step 4: QA生成
if scenario == "atomic":
qa = generate_atomic_qa(subgraph)
elif scenario == "aggregated":
summary = summarize_subgraph(subgraph)
qa = (generate_question(summary), summary)
elif scenario == "multi_hop":
qa = generate_multihop_qa(subgraph)
synthetic_data.append(qa)
return synthetic_data
ECE是什么:
在GraphGen框架中,预期校准误差(Expected Calibration Error, ECE) 的计算原理是通过量化模型预测置信度与实际准确性之间的偏差,识别模型对知识的理解盲区。其核心思想是:一个完美校准的模型,其预测置信度应等于真实正确概率。以下是具体原理和计算步骤:
1. 核心思想
- 校准目标:若模型对某知识的置信度为 p,则该知识的真实正确概率也应为 p
- 误差定义:模型置信度与真实正确概率的差异即为校准误差
- 应用场景:通过ECE识别模型高置信但低准确(过度自信)或低置信但高准确(保守预测)的知识点
2. 计算步骤
步骤1:生成正负样本
对知识图谱中每个三元组 R_i(例如“水在常温下是液体”):
- 正样本:生成 n 个同义改写 R_{i1}, R_{i2}, ..., R_{in}
(例:“液态是水的常温常态”)
- 负样本:生成 n 个否定形式 \neg R_{i1}, \neg R_{i2}, ..., \neg R_{in}
(例:“水在常温下是固体”)
步骤2:计算置信度
对每个样本,通过二元判断获取模型置信度:
- 正样本置信度:模型预测为“真”的概率 P(\text{True}|R_{ij})
- 负样本置信度:模型预测为“假”的概率 P(\text{False}|\neg R_{ij})
步骤3:综合置信度
对每个知识三元组 R_i,计算平均置信度:
C_{R_i} = \frac{1}{2n} \left( \sum_{j=1}^n P(\text{True}|R_{ij}) + \sum_{j=1}^n P(\text{False}|\neg R_{ij}) \right)
步骤4:计算校准误差
- 真实正确概率:正样本的真实正确概率为1,负样本为0
- 分箱统计:将置信度区间 [0,1] 划分为 B 个箱(如10个等宽区间)
- 箱内误差:对每个箱 b,计算置信度均值 \text{conf}(b) 和准确率均值 \text{acc}(b)
- ECE公式:
\text{ECE} = \sum_{b=1}^B \frac{N_b}{N} \left| \text{conf}(b) - \text{acc}(b) \right|
其中 N_b 是箱 b 中的样本数,N 是总样本数。
3. 在GraphGen中的具体应用
筛选高价值知识
- 高ECE值:模型对某知识点置信度与真实正确率差异大 → 知识盲区
- 优先生成:对高ECE的三元组生成QA对,针对性增强模型理解
理解损失(Loss_C)
通过交叉熵量化模型对知识的掌握差距:
\text{Loss}_C = -\frac{1}{2n} \sum_{j=1}^n \log P(\text{True}|R_{ij}) - \frac{1}{2n} \sum_{j=1}^n \log P(\text{False}|\neg R_{ij})
- Loss_C高 → 模型对知识点理解不足 → 需重点训练
4. 直观示例
假设某知识点 R_i 的生成样本:
- 正样本置信度:[0.9, 0.8, 0.7](应全正确)
- 负样本置信度:[0.3, 0.2, 0.1](应全错误)
计算:
C_{R_i} = \frac{1}{6} (0.9+0.8+0.7 + (1-0.3)+(1-0.2)+(1-0.1)) = 0.85
若真实准确率为1(所有样本正确),则校准误差:
\text{ECE} = |0.85 - 1.0| = 0.15
表明模型对该知识点过度保守(置信度低于真实准确率)。
5. 核心意义
- 数据高效性:通过ECE筛选长尾、高价值知识,减少冗余数据生成
- 抗幻觉:强制模型对齐置信度与真实知识,降低合成数据错误率
- 动态优化:训练过程中持续监控ECE,指导数据生成策略调整
通过这一机制,GraphGen实现了知识靶向增强,显著提升闭卷QA任务中模型的知识掌握深度。
thinking
场景就是针对SFT的数据合成,需要大量的针对垂直领域的QA对
其实这里比较自然的思路可能就是,针对每一个知识点,我们去让LLM针对这个知识点生成问答
通过知识图谱我们可以得到相对比较原子的知识点,针对这些知识点做问答。
让模型学会针对原子的知识点之后,就需要一些综合(比如做题也不会只考单一一个地方),这里就可以通过知识图谱把相关联的知识点给融合起来一起生成QA对。
并且为了做专项训练,针对模型不会的地方生成数据,筛选出长尾的细节知识,GraphGen会先计算模型的ECE:
* 即如果模型认为我能回答,并且确实回答正确的话,说明对这个知识点掌握的比较好
* 如果模型认为我能回答,并且回答不正确,或者认为不能回答但是回答正确的话,说明知识点掌握的不好,就可以针对这种知识点生成数据。
这里有两个insight:
* 利用ECE去寻找模型对知识点掌握不好的地方,并针对性训练
* 利用知识图谱的关联性质来生成多种类型的QA对。
* 这里从回答问题变成了生成QA,这个思路可以通用化
* 比如时序知识图谱上,从可以回答带时序的问题变成生成带有时序问题的QA对
* 或者在一些带有总结,或者概念的图上,针对概念,而非实体来进行QA
文章评论