iomgaa
|
f277197071
|
feat(soak): GovDoc 形态的场景——JSON 工具调用、按次收窄、提交型完成
这条路径至今零真实负载,而它和 AppWorld 那路压的东西完全不同:动作是 JSON 工具调用而
不是代码,完成由 agent 自报(带完成标记的提交工具)而不是环境报告,工具集按阶段收窄。
一个任务拆成三次运行(plan / execute / summarize),因为「按次收窄工具集」在这个库里
只能这么表达——治理单位是一次运行,一次运行只有一个工具注册表,阶段之间靠工作区传状态。
语料是真实公文,但先脱敏再用,且原文与脱敏文本都只在内存里,一个字节不落盘、不入库。
机构名、电话、信用代码、邮箱、联系人姓名换成明显是假的稳定假名(同一原名整份文档换成
同一假名,否则模型会以为是不同主体);金额、项目编号、日期原样保留,它们是审核判断的
依据,换掉任务就没得判了。脱敏后必须过一遍独立的检出校验,有残留就拒绝启动——把未脱敏
的第三方真实信息发给外部模型服务是不可逆的,而漏一处的表现是「压测正常跑完」。
实测:主招标文件 17.5 万字符,校验函数对原文报 61 处、对脱敏后放行,六份语料全过,
40 个金额与全部日期无误伤。
write_note 与 submit_finding 声明为绝不重放,每次调用在工作区留一行审计——那份审计是
环境侧的实际执行次数证据,故障注入要验的「绝不重放的动作没有被执行两次」数的就是它。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-08-11 08:36:58 -04:00 |
|
iomgaa
|
292a936d42
|
feat(soak): 记分板——十一条不变量逐条判定,任一被击穿整批失败
判定分三档:通过 / 击穿 / 无法判定。第三档不许折算成通过——缺文件、缺字段导致判不了,
和判过了是两回事,混起来会让一次什么都没验的跑看起来全绿。退出码 1 是击穿,2 是只有
无法判定,--allow-undetermined 只放行后者。
守的东西:日志读得回来、跨进程的结果与内存里逐字段相等、步号连续、意图都有归宿(至多
一条悬空且必须在末尾,那正是崩溃点)、动作结果与步记录说同一件事、提示词字符数单调不
减、事件条数等于本进程走完的步数、投递失败计数对得上、并发之间不串台、停止原因与轨迹
自洽。
报告里不出现模型原文、观察、工具名与文档片段——压测语料里有第三方的真实文档,而报告
是要贴给人看的。有四条测试拿哨兵字符串验它确实漏不出去,其中一条是拿恶意工具名试出来
的:原本打算按字符白名单放行工具名,白名单恰好把哨兵放了过去。
每条不变量都配一个「构造出违反它的日志、验它确实报击穿」的用例——一个永远返回通过的
判定器比没有判定器更糟。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-08-11 08:27:09 -04:00 |
|
iomgaa
|
21a9a30ee9
|
feat(soak): AppWorld 场景适配器——代码围栏解释器与容器执行器
复刻 dissect 的动作协议当压测负载:两条正则、first_only 策略、五条纠错说明逐字照抄,
提示词模板连同出处一起收进 tools/soak/prompts/。有两处刻意不同,都写在代码注释里——
未闭合围栏那一支不补回三反引号(公共契约要求回填历史的文本不长于模型原文),空围栏
那一支不截断。
执行器在 execute 内部顺带问一次 is_done 填 env_reported_completion,并把环境自己数的
执行次数透出来。那个数字是故障注入的判据来源:验「声明绝不重放的动作没有被执行两次」
必须数环境侧,数库自己的计数器等于我们和我们自己对账。
端到端真跑过一道题(82e2fac_1):8 步 task_completed,环境判分通过,事件数与步数与
环境执行次数三者相等,耗时 30 秒。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-08-11 08:16:31 -04:00 |
|