flashtrace / exp /exp2 /README.md
wenbopan's picture
Sync FlashTrace package from GitHub
55b60a8
# 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 会分别显示尝试与成功计数。
使用说明
```bash
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/...`,按数据集和模型分目录。
使用说明
```bash
# 生成侧 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`)。