目标:在保留完整共享轨迹的条件下,比较替换系统提示词与角色工具集的 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_tools 23 次;tool_execution_evidence 23 次;required_capability_sequence 19 次;tool_order 17 次。
  • Skill:required_output 7 次;required_tools 4 次;tool_execution_evidence 4 次;tool_order 4 次。

主任务中 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 运行直接作性能因果比较。