File size: 6,233 Bytes
85b19cf | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | # VisTrajQA → Eval Framework 数据适配指南
## 概述
`convert_vistrajqa.py` 将 VisTrajQA 的 `sessions-*.jsonl` 转换为 eval_framework 所需的 domain_a_v2 三文件格式,从而可以用 Mem-Gallery / A-Mem / MemoryOS 等 baseline 进行统一评测。
## 快速使用
```bash
# 转换所有数据源(text-only 模式,默认)
python -m eval_framework.datasets.convert_vistrajqa \
--input data/generated/sessions-vab.jsonl \
data/generated/sessions-eb-nav.jsonl \
data/generated/sessions-arena.jsonl \
data/generated/sessions-eb-alfred.jsonl \
data/generated/sessions-infini-thor.jsonl \
--output eval_framework/converted/all
# 只转换某个数据源
python -m eval_framework.datasets.convert_vistrajqa \
--input data/generated/sessions-vab.jsonl \
--output eval_framework/converted/vab
# multimodal 模式(image caption 作为 attachment 而非内联文本)
python -m eval_framework.datasets.convert_vistrajqa \
--input data/generated/sessions-vab.jsonl \
--output eval_framework/converted/vab-mm \
--multimodal
# 转换后直接跑 eval
python -m eval_framework.cli \
--dataset eval_framework/converted/all \
--baseline FUMemory \
--output-dir eval_framework/results/FUMemory
```
## 转换映射
### 数据结构映射
```
VisTrajQA session → eval_framework sample
├── session_id → sample_id
├── step_plan[] → sessions[].dialogue[] (user + assistant turns)
├── probes[] → checkpoints[] (probe checkpoints)
├── post_trajectory_qa[] → checkpoints[-1] (post-trajectory checkpoint)
└── memory_points[] → gold memory points (S00 embedded + stage4)
```
### Session 切分
一条 VisTrajQA 轨迹(如 30 步,4 个 probe 在 step 6/12/18/24)按 probe 边界切分为 5 个 session:
```
步骤 1-6 → S00 (probe 1 在此 session 结束后触发)
步骤 7-12 → S01 (probe 2)
步骤 13-18 → S02 (probe 3)
步骤 19-24 → S03 (probe 4)
步骤 25-30 → S04 (post-trajectory QA 在全部 session 结束后触发)
```
这样保证 eval_framework 的 runner 在每个 session 完成后恰好触发对应的 checkpoint。
### Turn 构建
每个 step 生成 2 个 dialogue turn:
| Turn | Role | 内容 |
|------|------|------|
| User turn | `user` | OBSERVATION + FEEDBACK + IMAGE caption(text-only 模式) |
| Assistant turn | `assistant` | THOUGHT + ACTION |
**text-only 模式**(默认):image caption 直接写入 user turn 文本,格式为 `IMAGE: <caption>`。适用于所有 text-only baseline。
**multimodal 模式**(`--multimodal`):image caption 作为 `attachment` 附加,不写入正文。适用于 MMMemory 等多模态 baseline。
### Memory Point 映射
| VisTrajQA 字段 | eval_framework 字段 | 说明 |
|----------------|---------------------|------|
| `mp_id` | `memory_id` | 如 `mp_S04_1` |
| `content` | `memory_content` | 一句话事实描述 |
| `type` | `memory_type` | `event_memory` / `state_memory` / `spatial_memory` |
| `source` | `memory_source` | `primary` (文本) / `secondary` (推断) |
| `is_update` | `is_update` | 是否为更新型记忆 |
| `original_memories` | `original_memories` | 被替换的旧内容列表 |
| `importance` | `importance` | 0.4 / 0.6 / 0.8 / 1.0 |
| `update_type` | `update_type` | `status_update` / `location_change` / ... |
Memory point 按 `step_num` 分配到对应 session:
- S00 的 memory points 嵌入在 `domain_a_v2.json` 的 session 对象中
- 其他 session 的 memory points 写入 `stage4_memory_points.jsonl`
### QA / Checkpoint 映射
**Probe checkpoint**:每个 probe 生成一个 checkpoint,`covered_sessions` 为该 probe 及之前所有 session。
**Post-trajectory checkpoint**:覆盖全部 session,包含 9 类 QA。
| VisTrajQA QA type | eval_framework question_type | 缩写 |
|----|----|-----|
| FR | factual_recall | FR |
| DU | dynamic_update | DU |
| MB | memory_boundary | MB |
| TR | temporal_reasoning | TR |
| KR | knowledge_reasoning | KR |
| VFR | visual_factual_recall | VFR |
| VS | visual_search | VS |
| VU | visual_update | VU |
| CMR | cross_modal_reasoning | CMR |
Evidence 字段从 `["mp_S04_1"]`(字符串列表)转换为 `[{"memory_id": "mp_S04_1"}]`(字典列表)以匹配 eval_framework 格式。
## 输出文件
```
eval_framework/converted/all/
├── domain_a_v2.json # 主对话数据 (JSON array)
├── stage4_memory_points.jsonl # 每 session 的 gold memory points
└── stage4b_qa_checkpoints.jsonl # checkpoint QA 题目
```
## 评测维度与 VisTrajQA 的对应
| eval_framework 维度 | 测量内容 | 对应 VisTrajQA 特性 |
|-----|-----|-----|
| Memory Recall | 记忆系统存储了多少 gold points | 直接对应,所有 MP 类型 |
| Memory Correctness | 存储的记忆是否正确 | 检测 hallucination |
| Update Handling | 更新型记忆是否正确替换 | 对应 `is_update=true` 的 MP |
| Interference Rejection | 干扰信息是否被过滤 | VisTrajQA 无 interference 标注,此维度为空 |
| QA Accuracy | 问答正确率 | 对应 9 类 QA (FR/DU/MB/TR/KR/VFR/VS/VU/CMR) |
| Evidence Coverage | 回答引用了多少 gold evidence | 对应 evidence memory_point_ids |
> **注意**:VisTrajQA 没有 interference(干扰信息)标注,因此 eval_framework 的 Interference Rejection 维度在评测结果中会为空值。MB(Memory Boundary)类型的题目在 QA 层面测试了类似能力。
## 注意事项
1. **text-only baseline(FU/ST/LT/GA/MG/RF)**:使用默认 `--text-only`,image caption 内联到用户消息文本中
2. **multimodal baseline(MM/MMFU/NG/AUGUSTUS)**:使用 `--multimodal`,caption 作为 attachment
3. **caption 质量**:text-only baseline 对图像的理解完全依赖 caption 质量。如果 `image_caption` 为空,用户 turn 中不会有任何视觉信息
4. **Arena 数据**:observation 恒为空字符串,视觉信息完全来自 image_caption
5. **转换器会自动验证**:运行后会调用 `load_domain_a_v2_academic` 检验输出是否合法
|