FlashTrace 实验 2(多步推理下的忠实度)
本目录提供「11 数据集 × 9 方法 × 3 指标」的实验工具,跳过 AT2,跳过 math。流程分为两步:先采样并过滤高质量 CoT+boxed 生成,再对过滤结果做归因评估。
支持数据集:MoreHopQA、HotpotQA(RULER hotpotqa_long)、RULER niah(niah_*)、RULER variable tracking(vt_*)。RULER 路径自动在 data/ruler_multihop/<len>/.../validation.jsonl 中搜索。
主要文件:
sample_and_filter.py:采样 + 判定一致性,输出到exp/exp2/data/run_exp.py:归因测试,输出到exp/exp2/output/dataset_utils.py:数据加载、答案 span 解析
采样脚本支持的数据集
morehopqa(本地data/with_human_verification.json)hotpotqa_long(自动在data/ruler_multihop/<len>/hotpotqa_long/validation.jsonl搜索)niah_*(RULER niah 变体,自动搜索同上)vt_*(RULER variable tracking 变体,自动搜索同上)- 直接传 RULER JSONL 路径(作为数据集名处理),其余类型不支持
归因测试支持
- 数据集:优先使用
exp/exp2/data/<name>.jsonl缓存,若无则按采样同样的解析规则加载;math 显式拒绝。 - 指标:
faithfulness_gen(生成侧):可运行在任何已加载样本(math 以外)。recovery_ruler(恢复率,仅 RULER):Recall@10%(排名只在 prompt tokens 上进行,gold 来自needle_spans)。
- 方法(
--attr_funcs):IG、perturbation_all、perturbation_CLP、perturbation_REAGENT、attention(内部融合 IG)、ifr_all_positions、ifr_multi_hop、attnlrp、ft_attnlrp、basic。AT2 未提供。
数据采样
实现逻辑
- 统一数据加载:
DatasetLoader读取 MoreHopQA / HotpotQA / RULER niah / RULER vt;可直接传自定义 RULER JSONL。 - 生成模型:
qwen3-235b-a22b-2507(英文 system prompt),要求「先简要思考,再用\box{}包裹最终答案且末尾不追加内容」;user prompt 为原题,无额外模板。 - 判定模型:
deepseek-v3-1-terminus(英文 system prompt),只输出 True/False 判断\box{}内文与参考答案是否一致。 - 过滤:仅保留「思考 + 末尾 boxed 答案」且判定为 True 的样本;
target用提取的思考片段与 去掉 box 包裹的最终答案 重组,附带 token 级sink_span/thinking_span、reference_answer、judge_response(不再存candidate_answer),indices_to_explain统一写为sink_span(boxed 内文在target的 generation token span,[start_tok, end_tok])。 - 采样会按原始顺序依次尝试样本,判定失败立即跳过;累计到
--max_examples条成功样本即提前停止(若源数据不足则更少),tqdm 会分别显示尝试与成功计数。
使用说明
export FLASHTRACE_API_KEY=sk-yaojia-get-ccfa # 或 OPENAI_API_KEY
# 示例:采样 hotpotqa_long,保留最多 100 条判定为 True 的样本
python exp/exp2/sample_and_filter.py \
--dataset data/with_human_verification.json \
--max_examples 100 \
--api_key sk-yaojia-get-ccfa \
--tokenizer_model /opt/share/models/Qwen/Qwen3-8B > exp/exp2/out.log
常用参数:
--dataset:morehopqa | hotpotqa_long | niah_* | vt_*(或直接 JSONL 路径)--max_examples:希望保留的成功样本数;达到后即停止(若源数据不足则更少)--tokenizer_model:用于 span 检测的 tokenizer(默认复用生成模型)--api_base/--api_key:接口地址与密钥(默认本地 http://localhost:4000/v1)--request_interval/--judge_interval:生成/判定间隔节流(默认 1s)--rate_limit_delay:遇到 HTTP 429 时的等待秒数(默认 5s);会在重试前自动 sleep 输出:exp/exp2/data/<dataset>.jsonl
归因测试
实现逻辑
- 输入:优先读取
exp/exp2/data/<dataset>.jsonl(过滤缓存);若不存在则回退到原始数据解析。 - 方法:忠实度(token-level RISE/MAS)对齐
evaluations/faithfulness.py的逻辑(AT2 未实现),math 自动拒绝。 - 多跳 FlashTrace:若缓存含
sink_span/thinking_span则用于 multi-hop IFR,否则默认整句答案为 sink。 - 一次运行可同时评测多个指标:
--mode支持多值与逗号分隔(如--mode faithfulness_gen,recovery_ruler或--mode faithfulness_gen, recovery_ruler),对同一批样本只做一次归因。 - 可选保存样本级 trace:加
--save_hop_traces会为所有方法、所有样本保存归因向量与逐样本指标到exp/exp2/output/traces/...;对 multi-hop 方法还会额外保存每跳的 token-level 向量V_h(单一vh,即实际参与多跳传播的向量),并在 manifest 中记录attnlrp_neg_handling/attnlrp_norm_mode等设置。 - 已知兼容性:部分 tokenizer 在 chat template 边界会出现 token 合并,导致评测侧用 token-id 子序列定位 user prompt 失败;exp2 已改为直接复用归因阶段算出的
user_prompt_indices做扰动定位。 - 批大小估算:沿用原脚本
(max_input_len-100)/len(tokenizer(format_prompt(prompt)+target))的保守估计(至少 1)。max_input_len由代码内置映射表基于--model字符串决定,未命中或仅传--model_path时默认 2000;如需映射值而又用本地路径,请同时传入对应的--model名称。 - 计时:对每个样本的归因计算(recovery/faithfulness)分别计时,最终在 CSV 末尾追加
Avg Sample Time (s)并在控制台打印平均耗时。 - 输出:
exp/exp2/output/faithfulness/...、exp/exp2/output/recovery/...,以及(可选)exp/exp2/output/traces/...,按数据集和模型分目录。
使用说明
# 生成侧 RISE/MAS 忠实度 perturbation_all_fast,perturbation_CLP_fast,perturbation_REAGENT_fast,ifr_multi_hop_stop_words,ifr_multi_hop_both,ifr_multi_hop_split_hop,ft_attnlrp,ifr_multi_hop,attnlrp,ifr_all_positions,perturbation_all,perturbation_REAGENT,perturbation_CLP,IG,attention
python exp/exp2/run_exp.py \
--datasets exp/exp2/data/math.jsonl \
--attr_funcs IG,attention \
--model qwen-8B \
--model_path /opt/share/models/Qwen/Qwen3-8B/ \
--cuda 2,3,4,5,6,7 \
--num_examples 100 \
--mode faithfulness_gen \
--n_hops 1 \
--save_hop_traces \
&& python exp/exp2/run_exp.py \
--datasets exp/exp2/data/morehopqa.jsonl \
--attr_funcs IG,attention \
--model qwen-8B \
--model_path /opt/share/models/Qwen/Qwen3-8B/ \
--cuda 2,3,4,5,6,7 \
--num_examples 100 \
--mode faithfulness_gen \
--n_hops 1 \
--save_hop_traces
# --attnlrp_neg_handling drop \
# --attnlrp_norm_mode norm
常用参数:
--datasets:逗号分隔数据集名;若已存在exp/exp2/data/<name>.jsonl则直接使用。--attr_funcs:逗号分隔方法(无 AT2);ifr_multi_hop与ft_attnlrp支持多跳(由--n_hops控制)。--attnlrp_neg_handling:FT-AttnLRP 每跳负值处理(drop/abs)。--attnlrp_norm_mode:FT-AttnLRP 正则化与 hop ratio 开关(norm/no_norm)。--data_root/--output_root:缓存与结果目录(默认exp/exp2/data/exp/exp2/output)。--mode:faithfulness_gen、recovery_ruler,可多值/逗号分隔(一次归因同时输出多个指标);--num_examples控制评测条数。math 会被拒绝。***--save_hop_traces:保存样本级 trace 到exp/exp2/output/traces/<dataset>/<model>/<run_tag>/(每样本ex_*.npz+manifest.jsonl)。