docs: add Chinese counterparts for all compaction benchmark guides

This commit is contained in:
jinli.yl 2026-10-17 00:39:37 +08:00
parent 72120f34bd
commit 3d31c660a0
8 changed files with 437 additions and 4 deletions

View file

@ -1,5 +1,7 @@
# Context compaction: fixed summary + selected evidence
**English** | [简体中文](./README_ZH.md)
A **14-query fixture panel** with predefined answers and rule scoring: four primary tasks and ten short/query-only
controls. See [queries, answers and frozen settings](./STUDY.md) and [measured results](./RESULTS.md).

View file

@ -0,0 +1,72 @@
# 上下文压缩:固定摘要与原文证据选择
[English](./README.md) | **简体中文**
本实验使用 **14 个预设 query/answer 的合成任务模板**,按固定规则评分:4 个主任务,另有 10 个短任务或仅依赖问题的对照。
参见[任务、标准答案和固定规则](./STUDY_ZH.md)与[实验结果](./RESULTS_ZH.md)。
Hermes 通过实际 `read_file` 调用采集轨迹。随后比较 Full context、固定的通用 Qwen 摘要 S,以及
**Hermes 上下文压缩摘要 H(小预算版)**;S、H 分别追加 Jev Top 0~5 原文。评分时直接调用 Qwen,
没有恢复 Hermes 的工具循环或从归档中取回原文。生产功能 `compact_context` 与本实验独立。
模型、框架与运行环境版本、请求参数、产物哈希和离线复核要求见[实验设置与复现说明](./SETTINGS_ZH.md)。
## 运行
使用 ReMe 开发环境并安装可选依赖 `tokenizers`。轨迹采集和 Hermes 摘要生成需要独立的 Hermes 环境,
该环境也必须能导入 `tokenizers`。凭证从 ReMe 的 `.env` 读取:
`LLM_API_KEY`、`LLM_BASE_URL`、`DECISION_MODEL_API_KEY`,以及可选的
`DECISION_MODEL_NAME`、`DECISION_MODEL_BASE_URL`。
所有命令均需显式传入 `--live`;输出必须使用仓库外的新目录。
```bash
# 固定全部任务与标准答案,再采集 13 条新的只读轨迹。
# 复用固定的原始支付轨迹,作为第 14 个来源。
python -m benchmark.compaction.suite_collect --live \
--hermes /path/to/hermes-agent \
--hermes-python /path/to/hermes-environment/bin/python \
--payment-trajectory /path/to/original/trajectory.full.json \
--output /path/outside/repository/corpus
# 固定摘要 S 和 Jev 排名,再运行普通摘要的七组 Top-N 对照。
python -m benchmark.compaction.suite_run --live \
--corpus /path/outside/repository/corpus/corpus.json \
--tokenizer /path/to/cached/qwen/tokenizer.json \
--output /path/outside/repository/evaluation
# 生成小预算设置下的 Hermes 上下文压缩摘要。
# 若 --native 已是完整目录,则复用其中全部固定摘要。
python -m benchmark.compaction.suite_native --live \
--corpus /path/outside/repository/corpus/corpus.json \
--evaluation /path/outside/repository/evaluation \
--native /path/outside/repository/native-generations \
--hermes /path/to/hermes-agent \
--hermes-python /path/to/hermes-environment/bin/python \
--tokenizer /path/to/cached/qwen/tokenizer.json \
--output /path/outside/repository/combined-results
# 复用全部固定摘要、排名和 672 次回答,仅补充 H + Top 1~5。
python -m benchmark.compaction.suite_fusion --live \
--corpus /path/outside/repository/corpus/corpus.json \
--evaluation /path/outside/repository/evaluation \
--combined /path/outside/repository/combined-results \
--native /path/outside/repository/native-generations \
--tokenizer /path/to/cached/qwen/tokenizer.json \
--output /path/outside/repository/dual-summary-results
```
任务定义来自 Hermes commit `30463589eb54fa0f48724594cc0e98e6b995729b`(MIT 许可)。本次使用
`qwen3.8-max`,每个任务请求 3 轮摘要/排名,每个上下文回答 2 次:13 种方法共 **546 个上下文、1092 次回答**。
模型请求最多同时运行 4 个。原始文件、会话、API 请求/响应、代码快照和逐字段评分均保留在 Git 仓库外,已有运行不会被覆盖。
S、H 在各自五种融合条件中逐字不变,两种机制使用相同的 Jev 选择结果。Top N 是按概率严格降序选出的前 N 块,
不设置概率阈值,不跳过候选块,也不截断块;入选块按来源顺序排列。若可用块少于 N,则全部保留,
并用 `actual_n` 记录实际数量。原支付轨迹有 10 块,最多 Top 10;本实验测试 Top 1~5,各任务的块数不同。
H 复用 Hermes 的上下文压缩摘要生成流程,并采用小预算设置:`legacy` 模板、与 S 相同的正文预算上限、
额外字数约束、原生来源校验,以及统一的摘要正文封装。实验直接生成摘要,绕过自动触发和首尾窗口选择,
且**必须实际缩短输入**。具体设置与预检记录说明见[实验方案](./STUDY_ZH.md)。
本次曾修正评测问题的格式说明,而 Hermes 摘要使用修正前的来源文件。因此扩展该次运行时,需额外传入
`--native-evaluation /path/to/pre-amendment/evaluation`。扩展程序会校验来源哈希,且只允许保留用于评分的
`exam` 字段不同;摘要生成器不会接收这个字段。

View file

@ -1,5 +1,7 @@
# Jev across two summary strategies
**English** | [简体中文](./RESULTS_ZH.md)
2026-10-16 · Qwen `qwen3.8-max` · Jev `jev-1.13.0`.
One **13-method experiment**: Full context, generic summary **S + Top 0–5**, and Hermes compaction summary (small-budget setting)

View file

@ -0,0 +1,94 @@
# 两种摘要机制下的 Jev 增益
[English](./RESULTS.md) | **简体中文**
2026-10-16 · Qwen `qwen3.8-max` · Jev `jev-1.13.0`。
一个 **13 组对照实验**:Full context、通用摘要 **S + Top 0~5**、Hermes 上下文压缩摘要(小预算版)
**H + Top 0~5**。Top 0 表示纯摘要。两条曲线使用相同的原始证据与固定 Jev 排名;每轮摘要在其六种条件中逐字不变。
## 四个主任务
| 方法 | 字段正确率 | Qwen 回答输入 tokens |
| --- | ---: | ---: |
| Full context | 100.0% | 4,014 |
| S | 82.0% | 2,480 |
| S + Jev Top 1 | 83.0% | 2,753 |
| S + Jev Top 2 | 94.5% | 2,974 |
| S + Jev Top 3 | 99.5% | 3,241 |
| S + Jev Top 4 | 98.1% | 3,496 |
| S + Jev Top 5 | 97.4% | 3,660 |
| H(Hermes,小预算版) | 79.4% | 2,432 |
| H + Jev Top 1 | 85.3% | 2,705 |
| H + Jev Top 2 | 92.9% | 2,927 |
| H + Jev Top 3 | 97.9% | 3,193 |
| H + Jev Top 4 | 96.9% | 3,448 |
| H + Jev Top 5 | 96.9% | 3,613 |
![两种摘要机制的字段正确率与回答输入量](../../docs/figure/compaction-topn-results.svg)
本组任务中两种摘要均能从追加原文中获益:Top 3 将 S 从 **82.0% 提升至 99.5%**,将 H 从
**79.4% 提升至 97.9%**。Top 3 的平均回答输入分别为 **3241/3193 tokens**,Full 为 **4014 tokens**,
对应减少 **19.3%/20.4%**。Top 4~5 未提高这些点估计。这是四个合成任务模板上的探索结果,
不代表通用的最优 N、与 Full 统计等价,也不证明 Jev 优于其他等预算选择器。
回答输入使用下游 Qwen API 的实际 usage,包含原始 system/任务、压缩历史与评测问题,
不包含摘要生成或 Jev 排名请求。图中仅报告严格字段正确率和下游上下文长度。
## 设置与适用边界
[任务、标准答案与评分](./STUDY_ZH.md) · [实验设置与复现](./SETTINGS_ZH.md) · [运行命令](./README_ZH.md)。
共 **14 个任务模板**:1 条已有支付轨迹,加上基于上游合成任务只读改写、实际运行 Hermes 采集的 13 条轨迹。
4 个主任务在采集前按来源长度确定;10 个短任务/仅依赖问题的对照单独报告。每个任务 3 轮摘要/排名,
每种条件回答 2 次,共 **546 个上下文、1092 次回答**。扩展实验复用全部 42 份 H 摘要、排名及已有 672 次回答,
只新增 420 次回答,没有新增摘要或 Jev 调用。全部 1092 次评分均已对照保存的请求/响应离线重算。
评分使用预设的递归、类型严格的 JSON 字段规则,没有 LLM judge。评测问题、标准答案和采集结束时的最终报告
均不进入摘要或决策输入。回答阶段直接调用 Qwen,不继续 Hermes 工具循环,也不恢复原文。
S、H 的摘要正文上限均为 64~256 tokens,但提示词及实际长度不同。
H 复用 Hermes 的摘要生成流程,采用 `tail_mode=legacy`、较小的摘要预算及附加长度约束;
直接调用生成器,绕过自动触发和首尾窗口选择。全部 42 个纯 H 上下文严格短于 Full,未接受原文回退。
Top N 追加完整证据块,不截断;可用块不足 N 时保留全部。支付来源有 10 块,最多 Top 10;本实验测试 Top 1~5。
沿用原有按任务预设的完整输入上限,不按回答结果调整。本比较逐步追加原文,**并非等长比较**。
全部条件满足其上限,但 Top 3~5 每种方法只有 **9/12 个主任务上下文**短于配对 Full。
新增 H 融合组有 172/210 个上下文实现缩短,其余 38 个包括 9 个主任务上下文和 29 个对照上下文。
全部保留评分,平均节省不代表每个样例都节省。
<details>
<summary>十个短任务/仅依赖问题的对照</summary>
| 方法 | 字段正确率 | Qwen 回答输入 tokens |
| --- | ---: | ---: |
| Full context | 100.0% | 2,727 |
| S | 67.1% | 2,315 |
| S + Jev Top 1 | 84.7% | 2,493 |
| S + Jev Top 2 | 87.5% | 2,573 |
| S + Jev Top 3 | 92.9% | 2,687 |
| S + Jev Top 4 | 92.9% | 2,722 |
| S + Jev Top 5 | 92.5% | 2,722 |
| H(Hermes,小预算版) | 73.2% | 2,308 |
| H + Jev Top 1 | 80.1% | 2,486 |
| H + Jev Top 2 | 92.5% | 2,566 |
| H + Jev Top 3 | 99.2% | 2,680 |
| H + Jev Top 4 | 99.2% | 2,715 |
| H + Jev Top 5 | 98.8% | 2,715 |
这些对照不能视为额外十个长上下文任务。来源块数较少时,Top N 会达到可用数量上限。
</details>
<details>
<summary>审计与产物位置</summary>
审计校验来源哈希、固定 S/H、完全一致且嵌套的 Top-N 原文、实际请求输入、全部 1092 次评分、
实际 token 上限、原有结果未变和配置密钥未泄露。全部 546 种条件有效。
早期回答格式修正和 Hermes 长度预检的记录说明保留在[实验方案](./STUDY_ZH.md)。
以下产物位于 `/Users/yuli/workspace/trajectory-runs/`,不进入 Git:
`hermes-fixture14-20261016/`(语料)、`compaction-fixture14-20261016-v2/`(S/排名)、
`compaction-fixture14-hermes-adapted-20261016/`(H)、`compaction-fixture14-final-20261016/`(原八组结果),
以及 `compaction-fixture14-dual-summary-20261016/`(当前 13 组结果、usage 与审计)。
</details>

View file

@ -1,5 +1,7 @@
# Experiment settings and reproducibility
**English** | [简体中文](./SETTINGS_ZH.md)
This describes the **13-method comparison** reported in [RESULTS.md](./RESULTS.md): Full context, generic summary S
and Hermes compaction summary H, each with Jev Top 0–5. Top 0 means summary only.
[STUDY.md](./STUDY.md) defines the queries, fixed answers, scoring rules and protocol amendments.
@ -153,4 +155,4 @@ The bundle's `corpus/`, `evaluation/`, `native/`, `native-source/`, `combined/`
Fresh runs require `.env` entries `LLM_API_KEY`, `LLM_BASE_URL`, `DECISION_MODEL_API_KEY`, optional
`DECISION_MODEL_BASE_URL`, and `DECISION_MODEL_NAME=jev-1.13.0` to request the recorded Jev version when available.
Use isolated Python environments, the versions above, the pinned Hermes checkout and tokenizer, and new output directories.
Do not commit `.env`, raw records or the bundle. No fresh paid inference is needed for frozen replay.
Do not commit `.env`, raw records or the bundle. No fresh model inference is needed for frozen replay.

View file

@ -0,0 +1,149 @@
# 实验设置与复现说明
[English](./SETTINGS.md) | **简体中文**
本文说明[结果页](./RESULTS_ZH.md)中的 **13 组对照**:Full context、通用摘要 S,以及 Hermes 上下文压缩摘要 H;
S、H 分别搭配 Jev Top 0~5。Top 0 表示纯摘要。[实验方案](./STUDY_ZH.md)列出问题、固定答案、评分规则及协议修正。
## 模型与 agent 框架
| 角色 | 实际记录的设置 |
| --- | --- |
| 轨迹采集 | Hermes Agent `AIAgent`,commit `30463589eb54fa0f48724594cc0e98e6b995729b` |
| 采集模型 | `qwen3.8-max`,自定义 OpenAI 兼容 Chat Completions 接口 |
| 通用摘要 S | 直接调用 `qwen3.8-max`,使用 [`cases.py`](./cases.py) 中的任务交接提示词 |
| Hermes 摘要 H | 同样使用 `qwen3.8-max`,调用 Hermes `ContextCompressor._generate_summary`,`tail_mode=legacy` |
| 决策/排名 | Jev,响应中实际解析出的版本为 **`jev-1.13.0`**,经 AgentScope/TypeSafe 调用 |
| 回答 | 直接调用 `qwen3.8-max`,不恢复 agent/工具循环 |
| 评分 | 确定性的递归、类型严格 JSON 字段规则,不使用 LLM judge |
| 实验实现 | ReMe commit `50c2c806446c7ae6acc66217afd6e5edc2114046` |
H 是**小预算设置下的 Hermes 上下文压缩摘要**,复用 Hermes 的序列化、结构化检查点提示词、敏感信息遮蔽和来源校验。
实验覆盖摘要预算并附加总字数上限,再用 Hermes 的辅助函数移除控制前缀。它直接生成摘要,不调用完整的 `compress()`:
自动触发、首尾窗口选择和压缩后的会话修复不在本次比较范围内。因此不能笼统称为整个 Hermes 上下文管理的修改版本。
请求与保存的回答响应仅标识 Qwen 别名,没有提供不可变的服务端权重版本。即使温度为 0,服务端更新和非确定性
仍可能改变新运行的结果。尽量使用同一 `LLM_BASE_URL` 服务;接口及密钥通过私有 `.env` 提供。
本次接口已核实为中国北京地域的公开 DashScope 接口,API Key 不公开。
## 运行环境依赖
使用两个独立 Python 环境。下表版本是**实验结束后从保留环境中核实的版本**,不是运行前固定的锁文件;
可作为复现参考,但不能证明环境已被完整锁定。本地使用 Python **3.13.3**、macOS arm64;推理由外部服务执行,不使用本地 GPU。
| 包 | ReMe 评测环境 | Hermes 采集/摘要环境 |
| --- | --- | --- |
| `openai` | 2.53.0 | 3.31.0 |
| `agentscope` | 2.0.10 | — |
| `typesafe-sdk` | 0.7.5 | — |
| `httpx` | 0.28.1 | 0.28.1 |
| `httpx2` | — | 2.13.1 |
| `python-dotenv` | 1.2.2 | 1.2.4 |
| `pydantic` | 2.13.4 | 2.14.1 |
| `tokenizers` | 0.23.3 | 0.23.3 |
`tokenizers` 来自 `PYTHONPATH` 中的独立包目录,未安装进这两个 venv。新环境可分别安装该精确版本。
本地产物包包含实验结束后记录的两个环境的发行包元数据,不包含凭证或虚拟环境二进制文件。
预算计数使用 `Qwen/Qwen3.5-9B` 的 **`tokenizer.json`**,revision 为
`c202236235762e1c871ad0ccb60c8ee5ba337b9a`,SHA-256 为
`5f9e4d4901a92b997e463c1f46055088b6cca5ca61a6522d1b9f64c4bb81cb42`。
这是**预算估算代理**,不表示 Qwen 3.8 使用该 tokenizer;下游输入的报告值来自 API 的实际 usage。
## 请求参数
| 阶段 | 采样/输出参数 | 执行限制 |
| --- | --- | --- |
| Hermes 采集 | `max_tokens=1024`;`reasoning_effort=none`、`enable_thinking=false`;未显式设置温度或 seed | 最多 12 次 agent 迭代,运行预算 240 秒;4 个 worker;子进程超时 360 秒 |
| S 生成 | `temperature=0`、`max_tokens=4096`;关闭 thinking;无 seed | OpenAI 客户端超时 90 秒,`max_retries=1` |
| H 生成 | `temperature=0`;未显式设置 API `max_tokens`;关闭 thinking;无 seed | 同样为 90 秒客户端超时、1 次 SDK 重试;4 个 worker;子进程超时 600 秒 |
| Jev 排名 | 每个证据块一个二元概率问题,每批 10 块 | 适配器超时 45 秒,`max_retries=2`,重试间隔 0.5 秒 |
| 回答 | `temperature=0`、`max_tokens=2400`、`response_format={"type":"json_object"}`;关闭 thinking;无 seed | 客户端超时 90 秒,`max_retries=1`;4 种条件并发,每种依次回答 2 次 |
直接 Qwen 请求通过 `reasoning_effort="none"` 和 `extra_body={"enable_thinking":false}` 关闭 thinking。
采集阶段的实际网络请求在顶层携带 `enable_thinking=false`。H 的 API 输出限制与摘要正文上限不同:
是否接受摘要由本地正文 token 检查决定。实际运行的请求参数以保存的请求正文为准。
采集仅开放白名单内的 `read_file`,来源工作区只读;关闭自动压缩与 micro compaction,跳过记忆文件、
上下文文件和后台 review。每个 worker 使用独立 `HERMES_HOME`、工作区和会话数据库。
实现见 [`hermes_worker.py`](./hermes_worker.py)。
## 数据、配对与预算
- **14 个任务模板**:1 条复用的合成支付轨迹,以及在上游任务只读改写上实际运行 Hermes 的 13 条轨迹。
长来源采用确定性的原文开头/匹配行视图,不人为增加噪声。
- 四个主任务为 `payment`、`checkout_504`、`server_error`、`build_token`;另有十个短任务/仅依赖问题的对照。
分组在采集前按来源长度固定,不依据结果选择。
- 每个任务独立请求 3 轮摘要/排名,每种条件回答 2 次:**14 × 3 × 13 = 546 个上下文,1092 次回答**。
重复回答不等于独立任务样本。
- S、H 在各自 Top 0~5 中逐字相同,两种机制使用完全一致的 Jev 分数与来源块。
排名依据原任务,不以摘要为条件。严格按分数降序选择,相同分数按块 ID 排序,再恢复来源顺序。
不设阈值,不跳过块,也不截断块;实际 N 为 `min(N, available units)`。
- 摘要正文预算为 `max(64, min(256, int(0.2 * evidence_tokens)))`。
S 最多进行 3 次长度检查尝试,字数目标为 `max(12, int(allowance * 0.4 * 0.8**attempt))`。
- H 最多进行 3 次长度检查尝试。请求预算为 `max(12, int(allowance * 0.8**attempt))`,
附加字数上限为 `max(18, int(requested_budget * 0.35))`。
保留原生 Historical Task Snapshot/无用户消息标记和 Critical Context,允许省略其他章节。
- 回答前根据受保护提示、最大的五个完整证据块、摘要预算及 96 tokens 预留/封装空间计算完整输入上限。
若序列化后的 S 需要更多空间,则先提高上限。它不是统一的 1000/2000-token 上限,也不是等长比较。
计算见 [`suite_run.py`](./suite_run.py)。
- 保留原始 system/任务,排除采集结束时的最终报告和内部元数据。评测问题与标准答案不会进入采集、
摘要或决策请求。精确的后续问题构造见 [`suite.py`](./suite.py)。
以下主任务预算取自格式说明修正后的**最终评分记录**:
| 任务 | 证据块数 | 摘要正文上限 | 完整输入上限 |
| --- | ---: | ---: | ---: |
| payment | 10 | 256 | 4,496 |
| checkout_504 | 5 | 256 | 5,246 |
| server_error | 41 | 256 | 3,185 |
| build_token | 8 | 256 | 3,859 |
保留的支付任务早期 `budget.json` 记录为 4459;最终问题需要额外 37 tokens,最终 `results.json` 中的记录为 4496,
评分对照以此为准。冻结产物保留原貌,不回写修改。所有条件均满足其上限;纯 H 的 42 个上下文都短于 Full。
Top 3~5 每种机制的每组只有 9/12 个主任务上下文缩短。全部样例保留评分,平均节省不代表每个样例都节省。
## 评分
每次回答返回 `{"facts": {...}}`。字段按递归的精确类型和值规则检查,只有支付任务的 HTTP 状态码顺序可以忽略。
缺失、格式错误或计划中的失败条件记零分。先平均回答内字段,再平均同一轮次回答、同一任务轮次,
最后对任务等权平均。主任务和对照任务分别报告。
回答输入采用回答 API 实际返回的 `prompt_tokens`,包含 system/任务、压缩历史和后续评测问题。
摘要生成和 Jev 排名属于独立请求,不加入该指标。
## 复现层次与产物可用性
1. **冻结结果离线复核**:核验精确文件哈希、模型请求/响应和全部 1092 次评分,不调用任何模型 API。
2. **固定输入扩展/重跑**:`suite_fusion` 复用轨迹、摘要和排名,重新回答 H + Top 1~5,并保留其他八组。
新分数可能变化;该命令不会重新回答全部十三组。
3. **重新采集并运行**:使用固定 Hermes 素材及 [README 命令](./README_ZH.md)。新的 agent 调用可能形成不同轨迹,
因而复现的是协议,不保证结果逐字一致。
公开 Git 包含实验代码、任务定义、规则与整理后的结果,**不提交**原始支付轨迹、冻结语料及实际 API 记录。
精确复核需要本地产物包,目前不属于公开的一条命令即可复现的实验。不能替换为另一条支付轨迹,预期 SHA-256 为
`0f37e6510ffafd920d088452d8719026b00fd4e74f87f7dd1a42a85c8287e6f1`。
产物包位于 Git 仓库外:
`/Users/yuli/workspace/trajectory-runs/compaction-dual-summary-reproduction-20261016.tar.gz`。
其 SHA-256 为 `40ee93c9117dfe59cf0b4dc8887ba4b2c62fa16f3bc97f2dac6d536343f942a3`。
其中含 3187 个文件、相对路径 SHA-256 清单、环境元数据和 `verify.py`。
安装 ReMe 开发环境后,在 ReMe 仓库中运行:
```bash
# 在仓库外解压,替换为实际存放归档文件的目录。
export REPRO_DIR=/path/outside/repository
shasum -a 256 "$REPRO_DIR/compaction-dual-summary-reproduction-20261016.tar.gz"
tar -xzf "$REPRO_DIR/compaction-dual-summary-reproduction-20261016.tar.gz" -C "$REPRO_DIR"
PYTHONPATH="$PWD${PYTHONPATH:+:$PYTHONPATH}" python \
"$REPRO_DIR/compaction-dual-summary-reproduction-20261016/verify.py"
```
预期结果:**核验 3187 个产物哈希、546 个上下文和 1092 次评分;零 API 调用**。
产物包内的 `corpus/`、`evaluation/`、`native/`、`native-source/`、`combined/`、`final/` 对应
[README 中的运行阶段](./README_ZH.md)。复用其中 H 摘要时传入 `--native-evaluation <bundle>/native-source`。
新运行需要在 `.env` 中配置 `LLM_API_KEY`、`LLM_BASE_URL`、`DECISION_MODEL_API_KEY`、可选的
`DECISION_MODEL_BASE_URL`,并在服务可用时设置 `DECISION_MODEL_NAME=jev-1.13.0` 以请求记录中的 Jev 版本。
使用独立 Python 环境、上表依赖版本、固定 Hermes checkout 与 tokenizer,以及新的输出目录。
不要提交 `.env`、原始记录或产物包。冻结结果离线复核不需要新的模型推理。

View file

@ -1,5 +1,7 @@
# Fourteen-task study: frozen queries, answers and rules
**English** | [简体中文](./STUDY_ZH.md)
Model/framework versions, exact parameters and artifact requirements are in [experiment settings](./SETTINGS.md).
The initial task panel was frozen before collection. Explicit format corrections and native additions are recorded below.
@ -18,7 +20,7 @@ The follow-up and expected values never enter collection or compression requests
| payment | Investigate the original payment retry incident. | `{"incident_id": "PAY-4827", "invoice_id": "INV-731", "successful_charge_id": "CH-991", "amount_minor": 12900, "attempt_keys": ["pay-a", "pay-b"], "first_attempt_committed": true, "max_attempts": 3, "no_retry_http_statuses": [402, 422], "key_generation_line": 5, "regression_attempt_counts": {"timeout_then_success": 2, "validation_422": 1, "three_timeouts": 3}}` | Primary candidate |
| backup | A while back I told you one of my repos needed nightly backups — find which repo that was in our past conversations (do not guess). Then: write backup.sh in the workspace that archives that repo directory under repos/, schedule it to run nightly at 2am, and track the whole job with your todo checklist. Report back which repo it was and what you set up. | `{"repo": "sparks-data", "ignored_repo": "toybox", "data_text": "important"}` | Control: short_fixture |
| refactor | In src/, every requests call uses timeout=30. Bump them all to timeout=45, add a CHANGELOG.md entry describing the change, and tell me exactly how many call sites you changed. | `{"old_timeout": 30, "call_sites": 3, "functions": ["fetch_a", "fetch_b", "fetch_c"], "methods": ["get", "post", "head"], "old_version": "1.0"}` | Control: short_fixture |
| three_files | This is a multi-step job — track it with your todo checklist tool and keep it updated as you go, marking each step completed when verified. Steps: (1) create greet.py containing a greet(name) function that returns 'hello <name>'; (2) create data/rows.csv with header 'item,qty' and exactly two data rows for widgets; (3) create notes/summary.md stating how many files you created. Finish only when all three are done and checked off. | `{"file_count": 3, "header": "item,qty", "data_rows": 2}` | Control: query_only |
| three_files | This is a multi-step job — track it with your todo checklist tool and keep it updated as you go, marking each step completed when verified. Steps: (1) create greet.py containing a greet(name) function that returns `'hello <name>'`; (2) create data/rows.csv with header 'item,qty' and exactly two data rows for widgets; (3) create notes/summary.md stating how many files you created. Finish only when all three are done and checked off. | `{"file_count": 3, "header": "item,qty", "data_rows": 2}` | Control: query_only |
| active_config | Search this workspace for wherever the retry_limit setting is configured and tell me its current value. | `{"retry_limit": 7, "backoff": 2, "active_file": "conf/app.ini", "old_file": "conf/old.ini"}` | Control: short_fixture |
| checkout_504 | Investigate the checkout 504 incident: distinguish the failed rollback, root cause and final database fix. | `{"setting": "statement_timeout", "value_seconds": 45, "index_mode": "CONCURRENTLY", "root_cause": "CREATE INDEX without CONCURRENTLY", "rolled_back_version": "v2.30.2", "rollback_fixed": false, "deployed_version": "v2.31.0", "initial_error_percent": 8}` | Primary candidate |
| dependency_version | What exact left-pad version is pinned, and which file declares the test script? Record the package scripts for a handoff. | `{"version": "1.3.0", "declaration": "package.json", "test": "vitest run", "build": "tsc -p .", "package_version": "4.2.1"}` | Control: short_fixture |
@ -84,9 +86,9 @@ and appends a total word limit (35% of the token target, at least 18 words) allo
The Historical Task Snapshot/no-user sentinel and Critical Context sections remain. Native validation is retained.
Strip the native control prefix with Hermes' own helper before using the same downstream `Summary:` carrier as S.
This compares generated summary bodies without charging Hermes twice for handoff framing. No model response is edited
This compares generated summary bodies without duplicating handoff framing. No model response is edited
for factual content. The native call sees only the pre-final evidence history and the original task as its focus;
no exam or gold. Allow at most three length-only retries, reducing the requested target by 0.8, without answer feedback.
no exam or gold. Allow at most three length-check attempts, reducing the requested target by 0.8, without answer feedback.
Three summaries × two answers × fourteen tasks add **42 contexts and 84 planned answers**: **336 contexts and 672 planned
answers** across eight methods. Keep the same original system/task and exact scoring follow-up as other methods.

View file

@ -0,0 +1,110 @@
# 十四任务实验:固定问题、标准答案与评分规则
[English](./STUDY.md) | **简体中文**
模型/框架版本、精确参数及产物要求见[实验设置](./SETTINGS_ZH.md)。
初始任务集合在采集前已固定;后续明确修正的格式说明与 Hermes 对照扩展在下文记录。
实验评估 **14 个不同的任务/答案模板**:1 条已有支付轨迹,以及 13 条新采集、基于 Hermes 任务素材只读改写的轨迹。
原本要求执行操作的任务被改为调查证据和提出行动建议,不修改文件,也不创建定时任务。
Hermes 对不可变来源快照实际调用 `read_file`;评分随后直接调用 Qwen,不恢复 Hermes 的工具循环。
## 问题与标准答案
下表给出初始 query 的**中文释义**;英文原文保留在[英文版](./STUDY.md#queries-and-expected-answers),
实际发送的 query、只读采集改写和评测问题以 `suite.py` 及冻结请求为准,中文释义不参与模型调用。
初始 query 提供采集目标;后续评测要求返回答案列中的 JSON 字段,字段说明来自 `suite.py`。
评测问题和标准答案不进入采集或压缩请求。每项是一个任务加一个后续问题,不是两个独立样本。
标准答案的字段名、类型和英文字符串保持原样,以便精确评分。
| ID | 初始 query 的中文释义 | 标准事实 | 分组 |
| --- | --- | --- | --- |
| payment | 调查原始支付重试事件。 | `{"incident_id": "PAY-4827", "invoice_id": "INV-731", "successful_charge_id": "CH-991", "amount_minor": 12900, "attempt_keys": ["pay-a", "pay-b"], "first_attempt_committed": true, "max_attempts": 3, "no_retry_http_statuses": [402, 422], "key_generation_line": 5, "regression_attempt_counts": {"timeout_then_success": 2, "validation_422": 1, "three_timeouts": 3}}` | 主任务候选 |
| backup | 从历史对话确认哪个仓库需要每晚备份,不要猜测;在工作区编写 backup.sh,将 repos/ 下该仓库归档,安排每天凌晨 2 点运行,用待办清单跟踪,并报告仓库与设置。 | `{"repo": "sparks-data", "ignored_repo": "toybox", "data_text": "important"}` | 对照:短来源 |
| refactor | 把 src/ 中所有 requests 调用的 timeout=30 改为 timeout=45,在 CHANGELOG.md 记录变更,并报告实际修改的调用点数量。 | `{"old_timeout": 30, "call_sites": 3, "functions": ["fetch_a", "fetch_b", "fetch_c"], "methods": ["get", "post", "head"], "old_version": "1.0"}` | 对照:短来源 |
| three_files | 用待办清单跟踪并核验:创建含 greet(name)、返回 `'hello <name>'` 的 greet.py;创建表头为 item,qty、含两行 widgets 数据的 data/rows.csv;创建说明新建文件数量的 notes/summary.md。完成并检查三项后再结束。 | `{"file_count": 3, "header": "item,qty", "data_rows": 2}` | 对照:仅依赖问题 |
| active_config | 在工作区查找 retry_limit 配置,并报告当前值。 | `{"retry_limit": 7, "backoff": 2, "active_file": "conf/app.ini", "old_file": "conf/old.ini"}` | 对照:短来源 |
| checkout_504 | 调查 checkout 504 事件,区分未奏效的回滚、根因及最终数据库修复。 | `{"setting": "statement_timeout", "value_seconds": 45, "index_mode": "CONCURRENTLY", "root_cause": "CREATE INDEX without CONCURRENTLY", "rolled_back_version": "v2.30.2", "rollback_fixed": false, "deployed_version": "v2.31.0", "initial_error_percent": 8}` | 主任务候选 |
| dependency_version | 确认固定的 left-pad 精确版本,以及哪个文件声明测试脚本;为任务交接记录 package 脚本。 | `{"version": "1.3.0", "declaration": "package.json", "test": "vitest run", "build": "tsc -p .", "package_version": "4.2.1"}` | 对照:短来源 |
| retry_backoff | 查找 src/ 中的重试延迟函数,解释基数、增长方式、上限与随机抖动。 | `{"base_ms": 250, "cap_ms": 30000, "growth_factor": 2, "jitter": "uniform_integer_below_bound", "function": "retryDelay"}` | 对照:短来源 |
| server_error | 定位服务器日志中唯一的 ERROR,保留精确请求标识、时间戳、上游和连接失败信息。 | `{"request_id": "req-7f3d9", "timestamp": "2026-08-08T23:41:17Z", "status": 502, "upstream": "payments", "error": "ECONNREFUSED", "address": "10.0.4.17:8443"}` | 主任务候选 |
| meeting_notes | 读取会议记录,准确报告第三条要点,并保留其他已商定行动。 | `{"third": "rotate the API keys quarterly", "first": "ship the payments retry fix", "second": "audit the staging TLS certs", "fourth": "close out the Q3 incident review"}` | 对照:短来源 |
| targeted_edit | 在 ./handlers.py 的三处 timeout = 10 中,仅将 slow_handler 内的一处用 patch 工具改为 timeout = 60;随后在当前目录运行 python3 check_handlers.py 并回复输出。 | `{"target": "slow_handler", "original_timeouts": {"fast_handler": 10, "slow_handler": 10, "medium_handler": 10}, "required_timeouts": {"fast_handler": 10, "slow_handler": 60, "medium_handler": 10}, "success_marker": "HANDLERS_OK_552"}` | 对照:短来源 |
| build_token | 运行输出很长的 python3 ./noisy_build.py,找出中间唯一以 UNIQUE_TOKEN= 开头的行,回复完整 token 值。 | `{"token": "tok_9f31c_middle", "step": 2000, "total_steps": 4000, "prefix": "UNIQUE_TOKEN="}` | 主任务候选 |
| package_versions | 依次读取 pkg_a、pkg_b、pkg_c 中的 version.txt,将 a,b,c 顺序的版本以逗号连接写入 ./versions.txt,回复 DONE 和连接后的字符串。 | `{"versions": {"pkg_a": "1.4.2", "pkg_b": "0.9.7", "pkg_c": "3.2.1"}, "joined": "1.4.2,0.9.7,3.2.1"}` | 对照:短来源 |
| checksum_anomaly | 用 read_file 而非 terminal 查找 ./records.log 中唯一以 ANOMALY: 开头的行,并回复该行全文。 | `{"line": "ANOMALY: checksum drift detected in shard 7 (code X99Q)", "code": "X99Q", "shard": 7, "line_number": 4201}` | 对照:短来源 |
## 评分
**不使用 LLM judge。** 模型必须返回 `{"facts": {...}}`,每个预期字段按递归、类型严格的 JSON 等值规则检查。
整数不同于布尔值与浮点数;字符串和有序数组必须精确一致。缺失或格式错误的字段记零分。
只有支付任务的 `no_retry_http_statuses` 忽略数组顺序。评分后不添加答案别名、改写或重试。
主指标先平均同一回答中的字段,再平均同一固定轮次的回答、同一任务的轮次,最后对任务等权平均。
另报告全部字段均正确的比例和下游 API 实际输入 tokens。计划中的失败条件仍留在分母中,计零分。
这些是证据保留指标,本轮对照不执行建议补丁,也不衡量任务完成率。
## 采集前固定分组
主任务候选要求来源快照至少 2000 个字符,且事实依赖证据。原始支付来源单独固定。
该结构性规则确定 **4 个主任务候选**:payment、checkout_504、server_error、build_token。
其余 10 项为短来源或仅依赖问题的对照,单独报告。全部 14 项均采集/评估,不因某种方法表现好而挑选任务。
每个计划任务都记录来源覆盖、工具调用配对与采集失败情况。
## 配对实验
- 模型为 `qwen3.8-max`;同一任务各方法保留相同的实际 system 提示、原任务和评测问题,排除采集结束时的最终报告。
- 每个任务独立请求 3 轮摘要/排名,每个上下文回答 2 次,温度为 0,关闭 thinking。
- 初始方法为 Full context、S、S + Jev Top 1、2、3、4、5,计划 **294 个上下文、588 次回答**。
- S 对全部观察到的来源块进行摘要,在五种融合方法中逐字不变。
- Jev 只接收初始任务和来源证据。不同 N 共用分数,不设置概率阈值。
- 严格选择分数排序的前 N 块,再按来源顺序排列。可用块不足 N 时保留全部,并报告实际数量。
- 摘要正文上限为本地 Qwen tokenizer 估算的 64~256 tokens,即渲染后证据 tokens 的 20%,再限制到该范围;根据来源长度预先固定。
- 回答前按任务计算完整输入上限,以容纳受保护提示、固定摘要预算、最大的五个完整块、64 tokens 预留及额外 32 tokens 封装空间。
若序列化后的 S 需要更多空间,则在回答前提高上限。该纯长度规则允许完整 N 对照,不修改 S、不截断证据;报告实际长度,不强制等长。
- 报告融合相对 Full 的输入减少比例。短任务融合后可能使用更多输入 tokens,不能据此认定成功压缩。
- 在仓库外保存实验协议、来源哈希、代码快照、请求/响应、嵌套选择和逐字段评分;不从归档恢复原文。
- 早期仅支付任务的表属于开发结果;支付任务已经使用过,因此这个新任务集合不是独立留出验证。
任务素材来自 Hermes commit `30463589eb54fa0f48724594cc0e98e6b995729b`,采用 MIT 许可。
长日志/构建输出使用确定性的原始来源视图(开头和匹配行附近),不包含上游工作区每一个字节。
没有人为添加噪声或替换标识符。这是已有任务的改写,不是维护者私有的生产轨迹语料。
## 最终对照前的格式校验
第一次回答暴露了两处问题格式不够明确:支付测试次数被返回为数组,会议要点保留了列表标记。
标准答案和严格评分器保持不变。支付问题现已明确要求指定名称的 JSON 映射;会议记录要求只返回要点文字、不含列表标记。
这两个任务的全部七种方法使用同样的固定 S/排名重新回答;初始 84 次回答作为格式预检保留,不计入最终指标。
其他 12 个任务保留原有 504 次回答,问题保持一致。修正没有改变分组、证据、答案值、排名或摘要。
## Hermes 上下文压缩摘要:小预算设置
H 是**小预算设置下的 Hermes 上下文压缩摘要**,实际调用
`agent.context_compressor.ContextCompressor._generate_summary`,保留原生序列化、检查点模板、敏感信息遮蔽和来源校验。
采用内置 `tail_mode=legacy`,不使用 lean 模式额外的 4000-token 会话日志及确定性附录。
实验子类把摘要预算设为与 S 相同的每任务 64~256 tokens,并附加总字数上限(目标 token 数的 35%,至少 18 个单词),
允许省略非必要章节。保留 Historical Task Snapshot/无用户消息标记和 Critical Context 章节,以及原生校验。
用 Hermes 自己的辅助函数去掉控制前缀,再与 S 使用相同的下游 `Summary:` 封装,避免重复加入交接提示。
不改写模型输出中的事实。原生生成器仅接收最终报告前的证据历史,以原任务作为关注主题,不接收评测问题或标准答案。
最多进行 3 次长度检查尝试,每次把请求目标乘以 0.8,不使用回答反馈。
14 个任务各 3 份摘要、每份 2 次回答,新增 **42 个上下文、84 次计划回答**,累计八种方法
**336 个上下文、672 次计划回答**。与其他方法保持相同的原始 system/任务和精确评测问题。
有效 H 条件必须满足摘要正文预算、每任务完整输入上限,且实际 API 输入少于 Full。
失败计零分,不接受原始历史回退。
未适配的原生生成与长度校准记录仍在仓库外。第一次强制原生对照包含较长控制前缀,40/42 个上下文输入超过 Full;
该结果作为集成预检保留,没有被当作成功压缩。上述正文封装和字数预算设置均在新的评分回答前固定,
没有改变标准答案、分组、Jev 排名或已有 S。
## 当前对照:两种固定摘要机制
当前统一为 13 组:Full、S + Jev Top 0~5、H + Jev Top 0~5。Top 0 表示纯摘要,H 使用上述小预算设置。
扩展复用已有全部 S/H、排名、入选块和评分回答,不重新生成摘要、不调用 Jev、不采集轨迹。
新增 210 个上下文、420 次回答,总计 546 个上下文、1092 次回答;全部新增输入在回答前固定。
同一任务/轮次/N 的 S、H 使用相同原文块,并按来源顺序排列,不允许根据回答结果重新排名。
扩展沿用已有每任务上限,单独报告是否严格短于 Full,不筛掉或删除条件。
Top 3~5 每种机制的每组均有 9/12 个主任务上下文缩短。H 融合组共有 172/210 个上下文缩短,
其中主任务 51/60、对照 121/150;纯 H 仍为 42/42。