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` 检验输出是否合法