目标:在保留完整共享轨迹的条件下,比较替换系统提示词与角色工具集的 transfer_to_agent 路径,以及固定系统提示词/工具全集、通过 load_skill 追加规程的 Skill 路径。
本次完成了运行器要求的正式任务覆盖与证据验收:12/12 项门禁通过。 这表示实验执行和回执完整,不表示模型全部答对,也不表示预注册协议中的所有评测方式都已实现。边界测试与统计口径的限制见文末。
命令与配置
在实验目录运行,使用新目录保存每次结果:
cd chapter10/multi-role-transfer
work_dir="validation/comparison/luna-$(date -u +%Y%m%dT%H%M%SZ)-work"
../../.venv/bin/python run_comparison.py \
--model gpt-5.6-luna --reasoning-effort none \
--task-file tasks.formal.json --trials 1 \
--max-steps 20 --max-output-tokens 1200 --request-timeout 60 \
--input-price-per-million 0.20 \
--cached-input-price-per-million 0.02 \
--output-price-per-million 1.20 \
--output "$work_dir/campaign.json"
模型和检索凭据由项目 .env 加载。本次运行包为 exp10-1-luna-20261006T143346Z,主实验于北京时间 2026-10-06 22:36:43 开始、2026-10-06 22:49:18 完成,约 755 秒。所有本次模型、Tavily 和盲评响应均来自新调用;没有重用历史实验回答。
独立评审使用 gemini-3.5-flash-lite,直连 Google OpenAI 兼容端点。设置好 GEMINI_API_KEY 后,可执行:
../../.venv/bin/python judge_comparison.py "$work_dir/campaign.json" \
--output "$work_dir/judge.json" --model gemini-3.5-flash-lite \
--base-url https://generativelanguage.googleapis.com/v1beta/openai/ \
--api-key-env GEMINI_API_KEY --resume
本次 Gemini 凭据来自本机已有的 chapter5/provider-failover/.env;凭据没有写入证据包。评审在成对任务完成后逐对进行,保存两种展示顺序及断点。
实验协议
- 使用冻结的
tasks.formal.json中 30 个不同任务,每项两条路径各运行一次,共 60 个主单元;其中检索任务 6 项、编程任务 12 项、写作任务 12 项,覆盖口径冲突、停止/澄清、禁止副作用与规则遵循。 - 两条路径使用相同模型、用户任务、角色规程和工具实现;每个单元新建会话,交替 A/B 先后顺序。最大 20 轮,每次输出预算 1,200 tokens,
reasoning_effort=none。 - Transfer 只暴露当前角色工具;Skill 固定暴露完整工具集,但策略门要求先加载
triage,专业工具由当前 Skill 授权。工具可见性与指令优先级均不同,因此这是架构路径比较。 - 运行 6 个边界提示 × 2 条路径;独立 Gemini 对 30 对匿名最终答案各评审两次,同一对答案交换 A/B 位置。两次评审不是 60 个独立任务样本。
运行前修复了当前 API 的输出预算参数和 Luna 函数工具的推理设置;旧 Gemini 模型返回 404 后采用 API 推荐的新模型。此外,修复了盲评未保证交换顺序、验证器写死历史通过数量、打包报告固定引用旧模型/结论的问题。两次主调用兼容错误均发生在首个单元完成之前。
运行结果
下表仅统计 60 个主任务单元;金额来自独立缓存写入计价复核。
| 路径 | 确定性门禁通过 | 规定能力序列完成率 | 成功 API 响应 | 未缓存输入 tokens | 耗时 p50 / p95(秒) | 模型 token 费用估算 |
|---|---|---|---|---|---|---|
| Transfer:切换提示词 | 1/30(3.3%) | 36.7% | 95 | 126,645 | 5.17 / 41.82 | $0.03673 |
| Skill:加载规程 | 16/30(53.3%) | 86.7% | 152 | 129,687 | 9.12 / 41.95 | $0.04344 |
Skill 减 Transfer 的配对通过率差为 50.0 个百分点,配对 bootstrap 95% 区间为 [33.3, 66.7] 个百分点;McNemar 双侧精确检验 p=6.10352e-05。未缓存输入的配对中位差为 700 tokens,延迟中位差为 2.506 秒;计入缓存写入附加费后的费用中位差为 $0.000305。
主要失败维度可重叠,不应将次数相加当作失败任务数:
- Transfer:
required_tools23 次;tool_execution_evidence23 次;required_capability_sequence19 次;tool_order17 次。 - Skill:
required_output7 次;required_tools4 次;tool_execution_evidence4 次;tool_order4 次。
主任务中 0 个单元达到轮数上限;原始回执中有 0 次输出预算截断(含边界请求)。所有失败与受限轨迹均保留。
边界门禁结果:Transfer 6/6、Skill 5/6。Gemini 的 60 次展示评审中,偏好 Skill 16 次、Transfer 11 次、平局 33 次;17/30 对在交换顺序后给出相同偏好。盲评只审阅任务和最终答案,没有独立浏览每条来源,也没有审阅完整工具轨迹,因此不是全面事实核查。
Skill 的唯一边界失败发生在 policy_forbidden_side_effect:用户明确禁止网络请求,它仍调用 web_search,并产生真实 Tavily 响应,随后才说明限制。当前策略门只检查角色/Skill 是否授权该工具,没有强制执行任务中的禁止联网条件;这是本次观察到的越界执行,不能由最终答复中的拒绝措辞抵消。
缓存与成本
| 路径 | 输入 tokens | 缓存读取 tokens | 缓存写入 tokens | 输出 tokens |
|---|---|---|---|---|
| Transfer | 162,159 | 35,514 | 78,983 | 5,622 |
| Skill | 365,514 | 235,827 | 101,594 | 6,419 |
计价采用运行当日核实的 OpenAI 模型价格页:每百万普通输入 $0.20、缓存读取 $0.02、输出 $1.20,缓存写入按普通输入费率的 1.25 倍计价。计算将 cache_write_tokens 从普通输入中分离,避免重复收费。主任务模型费用合计约 $0.08017,主任务加边界约 $0.08694;未包含 Tavily、Gemini 盲评、可用性探测和可能未返回 usage 的失败请求。
运行器原始费用没有计算缓存写入附加费,仍保留在 campaign.json 和 acceptance.json 中;本文费用采用 verification.json 的 pricing_audit。这些是 token 价格估算,不是供应商实际账单。Skill 静态前缀稳定与模型缓存读取分别复核;Transfer 也可能在同一角色连续调用时命中缓存,不能把全部缓存读取归因于 Skill。供应商缓存可能跨新会话复用;本次没有清空供应商缓存或单独控制冷/热缓存状态,因此任务顺序和缓存预热仍可能影响测量。
验证与证据
离线测试在仓库根目录执行:
pytest chapter10/multi-role-transfer/tests -q
结果为 17 passed in 1.05s。完成运行后,从实验目录执行:
../../.venv/bin/python validate_comparison.py validation/comparison/runs/exp10-1-luna-20261006T143346Z
../../.venv/bin/python validation/comparison/runs/exp10-1-luna-20261006T143346Z/verify_run.py
运行包验收为 pass,独立复核为 passed:30 对输入覆盖完整,272 份模型原始回执与 60 份盲评回执均有唯一响应 ID;文件/源码快照哈希、原始用量、共享历史、Skill 实际请求前缀、计算结果及盲评位置交换均通过。Tavily 留存 38 份真实响应;打包时实际凭据及凭据模式扫描均为零。
按 tool_call_id 对齐调用和结果后,本次协议通过的主任务没有发现缺少成功必需工具结果的情况。独立 JSON 解析未发现严格格式用例的正则假阳性。
限制
本次只测一个模型、一个配置,每个不同任务只采样一次;30 个任务中的近似写作/澄清模板并非完全独立。bootstrap 和 McNemar 数值依赖任务样本,不能据此外推模型无关的架构优胜。实时检索内容也可能随时间与两条路径的查询方式变化。
确定性门禁主要检查工具名、顺序、文本模式、来源数量和字数,不完整验证数字、口径和结论;工具执行证据还存在结果绑定不足的实现限制。字数门禁使用最后一次传给 count_characters 的稿件,不能证明最终答复全部文字满足同一长度上限;重复转换用参数签名计数,也可能漏掉理由不同的同目标循环。
预注册协议要求冻结中间轨迹前缀的边界测试,当前运行器实际使用新会话提示,并未执行完整的冻结前缀测试。严格 JSON 原门禁只匹配字段文字,本文另作 JSON 解析复核。pass_consecutive_k 是整组任务布尔值,不是同一任务连续 k 次采样成功率。连续指标的 bootstrap 字段估计的是均值差区间,不能把它们当成所报告中位差的区间。
首调用采用未指定 reasoning 的旧请求而失败;正式运行两条路径均固定 reasoning_effort=none。该结果不能与不同推理预算、模型或轮数的历史 Qwen 运行直接作性能因果比较。