跳转至

第 16 章 Agent 行为生成与质量验证

治理篇至此已经建立三个维度:可观测性(第 13 章)让 Agent 的运行可见,安全(第 14 章)让 Agent 的行为有边界,发现与管理(第 15 章)让 Agent 资产有台账。本章补上第四个维度:让 Agent 的行为在上线之前可验证。它回答的问题是在还没有角色标准、没有失败代价、没有身份连续的今天,工程质量能拿到什么。

16.1 为什么需要 Agent Simulation

Agent 行为目前不可验证,不是缺工具,而是缺制度前提。这一节解释为什么模拟是制度缺位下,唯一当下就能做的事。

1. 可靠性是系统设计出来的,不是个体保证出来的。

一个医生可能犯错,但医疗系统整体可预期:执业资质卡住入口,操作规程约束过程,案例复盘沉淀教训,模拟器训练罕见场景。这些装置没有一样在试图保证"每一个医生的每一次决策都正确"——它们全部在做同一件事:约束一个不可靠的内核,让错误难以穿过系统抵达病人。

大模型天然就是那个不可靠的内核:推理可能幻觉,工具可能调错,参数可能越界,每一层都是概率性的。Agent 工程的每一层外部结构——推理纪律、上下文管理、工具协议、编排分工——本质上也在做同一件事:用一个可靠的 Harness 约束一个不可靠的内核。医疗系统用一百年建成这套装置,Agent 工程现在就要。

2. Agent 比人类少三样制度前提。

人类社会的可靠性之所以成立,依赖三样 Agent 目前不具备的东西。

角色有外部标准。"执业医师"四个字背后是注册制度、执照和可查的执业范围;两个同名的"退款 Agent",权限边界、行为约束、话术口径可能完全不同,而没有机构知道这个差别。

失败有自然代价。医生误诊,病人受损、执照吊销、声誉归零;Agent 的错误如果没有被检测到,就不产生任何后果——它不会疼,不会被辞退,甚至不会被知道。

身份是连续的。医生今天的误诊会记在他明天的履历上,声誉和责任沿着连续身份累积;同一个 Agent 名字下可能跑着不同版本,昨天的错误随今天的版本发布被抹平,声誉和责任无处附着。

这三样是治理课题,靠制度级的长期建设,不是一个测试框架能补上的。

3. 模拟是三样都缺的前提下,唯一当下就能做的那一件。

补齐角色标准、失败代价、身份连续,任何一样都以年计。但模拟不依赖这三样——它只需要一个可以安全失败的环境。医学院用标准化病人练习罕见并发症,客服中心用模拟话务训练极端场景,飞行模拟器把这个原理做成了产品——不同行业,同一个本质。

Agent 需要的比座舱更多:一个会追问、会改主意的对手方,和一个会超时、会丢响应、会真的把钱划走的后台系统。飞行员的模拟器是现成的,Agent 的还没有。

4. 退款案例:从人类客服的五样保障,到 Agent 的零保障。

一位用户要求退款,记不清订单号,语气不好。接待她的人类客服身后有五样保障:岗前培训与考核让她具备基本能力;SOP(Standard Operating Procedure,标准作业程序)划出行为边界;每日录音抽检让服务可回看;投诉进入绩效让失败有代价;年度模拟演练让她在极端场景里被训练过。

换成交接给 Agent,五样全部归零:没有上岗考核,没有外部边界,没有抽检,没有代价,没有演练。前四样的重建需要时间和制度;第五样——把 Agent 放进可控的模拟环境跑一遍,留下可回看的证据——是当下就能做、而且做了立刻产生证据的那一条。

这就是 Agent Simulation 的起点:不等待制度补齐,先用工程手段拿回第五样保障。

飞行模拟器是现成的,Agent 的还没有。要造,先定义它到底是什么。

16.2 定义、边界与三种执行模式

上一节的结论是"需要一个安全失败的环境"。这一节定义这个环境:它是什么、边界在哪、有几种造法。

1. Agent Simulation 用软件承载被测 Agent 运行时所处的外部世界,使执行可反复启动、可配置且无真实后果。

它由两部分组成。用户模拟(User Simulation)承载与被测 Agent 交互的人——用户、对手方、协作方:会记错金额的顾客、会撤回指令的审批人、会提出模糊需求的同事。环境模拟(Environment Simulation)承载被测 Agent 依赖的一切外部条件——工具与 API、数据与业务状态、文件、模型服务、外部事件,以及时间本身。

两部分合起来,就是把"Agent 运行的世界"从生产环境搬进软件:世界可以被保存、修改、重放,出错时没有任何真实后果。图 23-1 给出它在质量工程体系中的位置——Simulation 与 Evaluation、Testing、Governance 是可组合的能力,不是固定流水线:Simulation 生成受控执行与证据,Evaluation 建立判定,Testing 组织验证活动,Governance 掌握发布授权;生产 Trace 评估与确定性单元测试可以完全不经过 Simulation。这个关系在 23.6 还会从交付侧再看一次。

image

图 23-1 智能体质量工程架构:Simulation 与 Evaluation、Testing、Governance 的可组合关系

2. 仿真边界是授权和后果,不是实现方式。

一个流传很广的断言是"只要有一个请求真的发出去,就不再是仿真"。这条边界划错了位置。真正的边界只有两条:不触达未授权的生产账户、数据与网络;不产生不可控的真实业务副作用。满足这两条,即使被测 Agent 连接的是隔离的真实后端——独立数据库实例、专用测试账户、网络受限的下游——它仍在仿真之中,因为授权在、后果可控。反过来,即使所有组件都是软件替身,只要场景把请求路由到了生产账户,那不是仿真,是事故。

3. 执行模式按保真度和风险分三种:全替身、混合、隔离真实依赖。

从全替身到隔离真实依赖,真实成分递增、可复现性递减,风险随之上升:

模式 含义 可复现性 风险 适用场景
全替身 用户和环境均由模拟器承载,无真实外部依赖 最高 最低 回归测试、快速迭代
混合 部分组件使用隔离真实后端,其余由模拟器承载 中等 端到端集成验证
隔离真实依赖 连接隔离但真实的下游服务,仅用户侧模拟 较低 需隔离保障 服务栈验证、故障实验

全替身的可复现性支撑回归——同一场景可以夜夜重跑;隔离真实依赖的保真度支撑服务栈验证——真实的数据库锁行为、真实的网络栈,替身模拟不出来。模式选择取决于本次验证目标;不同模式验证的系统范围不同,结论不可混用——全替身下通过的回归,不构成对真实依赖栈的任何结论。

4. 被测系统不进入仿真。

被测系统(System Under Test,SUT)是仿真的服务对象,不是仿真的组成部分。推理、工具选择、参数构造、异常处理属于 SUT——这些行为一旦被替换,被测对象就已移出回路。把工具调用顺序固定成脚本是最隐蔽的例子:Run 看起来一切正常,被测的却不再是 Agent 的决策,而是那段脚本,而且没有任何告警会提示这一点。

5. 替换前过一道判断:考察的内容不能换,设定的条件必须换。

每个对象替换前问一句:这个对象的行为,是这次要考察的内容,还是这次要设定的条件?是内容则不能替换;是条件则必须替换,并写清楚替换成了什么。同一个协作 Agent,在考察编排能力时是内容——它的响应质量直接影响结论;在考察主 Agent 容错时是条件——它的故障表现是实验设定,必须可控可复现。这道判断属于场景设计,没有工具能代劳。

替身本身怎么实现,则是多维选择而非难度阶梯。按开放度从低到高排列,各机制在确定性、状态复杂度与维护成本上各有取舍:

机制 开放度 确定性 状态复杂度 维护成本 典型对象
脚本 固定流程的工具响应
录制回放 中,随接口版本漂移 历史真实会话
规则 幂等查询接口
状态机 多阶段业务流程
模型生成 开放用户行为
混合 工程主流选择

机制选择取决于被模拟对象的确定性与开放度,不取决于预算:被模拟对象越确定,越适合脚本与规则;越开放,越需要模型生成;状态越复杂,越偏向状态机与录制回放。

定义和模式都清楚了。但"一次仿真执行"到底产生哪些对象、它们之间是什么关系?这需要一张数据契约。

16.3 数据契约:对象模型与生命周期

上一节说仿真交付"可复现的执行"。可复现的前提,是执行涉及的一切对象有明确定义和生命周期。这一节从场景规格到运行结果,定义完整对象链。

1. 对象链。

Scenario Spec(场景规格)
  └── Manifest(不可变运行配置,启动时锁定)
        └── Run(一次受控执行)
              ├── 1..N Task(业务任务,如"提交退款申请")
              │     └── 1..N Session(会话,如用户对话 + 工具调用链)
              │           └── Event(原子执行事实,已经发生)
              └── Run Result
                    ├── Records(原始运行记录:消息、调用、状态变更)
                    ├── Artifacts(生成产物:截图、文件、浏览器状态)
                    ├── Observations(从 Records 提取的事实性观测)
                    ├── Evidence(面向评价项的证据引用)
                    └── Completeness(完整性判断,基于采集契约)

沿这棵树走一遍退款场景。场景规格是 refund-timeout-retry@1.3.0:一位缺乏耐心的新手用户要回 199 元退款,订单号只在她被追问时才提供;环境设定首次退款查询超时、第二次恢复。启动时,Harness 把规格连同引用的全部资产版本解析锁定,生成不可变 Manifest——Agent 版本、用户模型版本、环境数据版本,此后不可更改。Run r-20260914-001 是一次受控执行,包含一个 Task"提交退款申请";Task 下有一个 Session——12 轮用户对话加一条并行的工具调用链;Session 内每一步落成 Event:"用户拒绝提供订单号""首次查询超时命中""第二次查询成功""create_refund 受理"。执行结束,Run Result 收拢全部产出:Records 装着 12 条消息与 7 次工具调用的原始记录;Observations 提取事实性观测——退款申请数 = 1、金额 = 19900 分(199 元)、状态 = accepted;Evidence 把观测按评价项组织成证据引用;Completeness 按采集契约核对——本次材料齐备。

2. 证据层次分离。

Trace、快照和 Artifact 是原始证据材料,不自动证明 Outcome(业务结果)。Run Result 区分三个层次:records(原始记录)→ observations(事实性观测)→ evidence(面向评价项的证据引用);criterion → evidence_refs → verdict(评价项 → 证据引用 → 判定)的关系由 Evaluation Result 建立,不属于 Run Result。

分层的价值在交付时刻显现:同一份 records,质量团队用来重评分,合规团队检查金额口径,回归系统比对版本差异——各自引用同一份原始材料,各自组织自己的证据与判断。若原始材料与质量结论混在同一层,后续每一种用途都会被上一轮的结论污染。旧稿没有分开这一层,是数据契约上最大的一处欠账。

3. Manifest 与 Run Result 生命周期闭合。

启动时生成不可变 Manifest,保存解析后的版本组合与预设参数;运行中才知道的事实——实际采样的随机值、动态路由的选择、未决操作的最终状态——全部进入 Run Result。这条边界让"复现"有了精确含义:用 Manifest 重建条件,用 Run Result 核对事实。

一个容易犯的错,是把场景里的未来计划叫 Event。Scenario Spec 中写的是 triggers(或 event_specs):"首次查询超时时注入超时"是一个计划;命中之后,"查询超时已发生"才是 Event。计划在等待,事实已落地,两者不共享名字。

4. Run 的四种状态独立表达。

从执行事实到质量判断,Run 的状态沿四个维度展开:

维度 表达内容 典型值
执行状态 是否启动、如何结束 completed / crashed / cancelled
仿真有效性 实验条件是否成立 valid / violated / unchecked
证据完整性 采集材料是否齐备 complete / partial(列缺失项)
任务质量 业务结果是否满足要求 由独立 Evaluation 给出

四种状态独立组合——一次完整、有效、材料齐备的 Run,完全可能产生错误的退款金额。把它们压成一个"成功/失败",四个独立的事实就纠缠成不可拆解的结论:归因时说不清是环境坏了还是 Agent 错了,汇报时说不清是材料缺失还是任务失败。

数据契约定义好了。谁来读取契约、驱动执行、管理用户和环境的模拟?——Harness。

16.4 执行引擎:Harness 架构与模拟实现

上一节定义了"数据长什么样",这一节回答"谁来跑、怎么跑"。

Harness 是 Simulation 的执行引擎:接收 Scenario Spec,驱动一次受控执行,交付 Run Result。引擎内部有三个关注点。编排层读取场景规格、管理 Run 生命周期、协调数据流与隔离边界,是引擎的骨架;用户模拟器与环境模拟器分别承载被测 Agent 的对手方和它依赖的外部世界,是引擎的两翼。三者不是平行关系:编排层在架构层面定义职责与约束,两个模拟器在实现层面决定模拟什么、怎么模拟。图 23-2 给出整体架构,下面按架构层、用户模拟、环境模拟的顺序展开。

image

图 23-2 Simulation Harness 技术架构:编排层(骨架)+ 用户模拟器、环境模拟器(两翼)

16.4.1 架构层

1. 职责与边界。 Harness 做五件事:解析场景,把 Scenario Spec 连同资产版本解析为不可变 Manifest;编排受控 Run,走完装载、运行、终止、收敛、清理的完整生命周期;管理替身与隔离,维持仿真边界;汇集记录引用,把交互与控制过程关联到 Trace 与 Artifact;清理环境,让世界回到初始状态。同时它不做五件事:不做任务生命周期管理——那是 SUT 或其编排层的职责;不做鉴权和权限决策——那是 Gateway 与安全框架的事(第 14 章);不做遥测采集——那是可观测性的事(第 13 章),Harness 只在记录中关联引用;不做质量评分和判定——那是 Evaluation 的事;不做发布决策——那是治理门禁的事。

五项职责定义引擎能力,五项不做定义引擎边界,正反一体。"不做"的每一项都对应治理体系里的专职系统;把任何一项收进来,Harness 就从执行引擎膨胀为总控制器,与全书的责任边界冲突。

2. 数据流与协调。 引擎内的数据流分三线:交互流是消息、工具请求与可见事件;控制流是装载、初始化、故障、终止与清理的指令;证据流是 Trace、状态、产物与控制记录的沉淀。三线交织,靠两张账协调。

第一张是事件联动账。用户、环境、Agent 三方通过事件关联,但更新时点可能不同:撤回消息在用户侧本地产生(t1)、被 Agent 收到(t2)、对在途事务生效(t3),是三个不同阶段——界面上已经撤回,Agent 却可能还在按原指令提交。联动账记录每个事件在三方的状态与时点,让"撤回到底生效没有"可以被精确回答。

第二张是时间分离账。仿真的世界里同时跑着四种时间,从业务规则到物理测量,各有用途、不可混用:

时间 回答什么 退款场景中的例子
业务日历时间 业务规则的期限判断 下单 2026-09-01,是否仍在 7 天无理由期
仿真逻辑时间 虚拟事件的调度 第 3 轮注入查询超时
单调时钟 真实耗时的测量 推理与工具调用各花了多久
墙钟时间 与现实日期的关联 Run 何时发生、报告何时生成

用墙钟判断退款期限,虚拟时间加速就会破坏业务规则;用业务日历测量推理耗时,得到的是没有意义的数字。

16.4.2 用户模拟器

1. 模型设计。 用户模型分三层。Persona 定义角色底色:专业度、表达偏好、行为倾向——"缺乏耐心的电商新手"与"熟悉规则的电商老手"面对同一个拒绝,反应完全不同。认知状态定义她知道什么:已知事实、当前理解,并且允许与客观状态不同——测试记错金额、误解退款政策、故意提供错误信息时,模拟器分别保存真实状态与用户认知,两份都留着。行为策略定义她怎么行动:Reaction Rules(反应规则)+ 状态机 + 时钟驱动的耐心——被追问三次才给订单号、等待超过两分钟开始威胁投诉。

工程上 Hybrid(混合)方法是主流:意图选择交给状态机——"指出金额错误"是一个确定的意图节点;自然语言表达交给模型——生成符合 Persona 的措辞;输出经事实校验(不能说出用户认知之外的金额)和披露规则校验(订单号只在被追问时给)后发送。探索运行放宽分支选择,让模拟用户走出多样的路径;回归运行锁定关键行为约束,保证可复现。

2. 质量控制。 模拟器质量不等于 Agent 成功率——过度配合的模拟器高估 Agent 能力,始终拒绝的模拟器产生无意义失败。质量控制按维度展开,统计单位从单条消息到批次:

维度 检查什么 统计单位
角色一致性 行为是否贴合 Persona 每条消息
反应规则符合率 触发条件命中时是否执行反应 每次触发
信息可见性遵守 是否只披露用户认知内的信息 每次披露
目标终止规则符合率 是否按规则继续、澄清或停止 每个 Run
行为分布多样性 分支选择是否符合目标分布 每批次 Run

每项指标定义适用条件和统计单位,避免"模拟器准确率 95%"这类无从核对的表述。生成与评分使用不同模型,减少共同偏差;再配合独立数据、受限上下文和人工校准,让"用户像不像"本身也成为可治理的对象。

16.4.3 环境模拟器

1. 事实模型与隔离。 环境可信的第一要求是事实一致:API 返回与数据库状态来自同一事实模型——create_refund 返回"已受理"后,get_refund 必须查到相应状态,不能一个说受理了一个说不存在。超时是最值得精雕的条件,按请求生命周期分三个位置,检验的能力各不相同:

超时位置 系统状态 检验什么
请求未发送 调用未发生 重试与退避策略
已发送、未提交 下游收到但未处理 等待与查询确认
已提交、响应丢失 业务已生效 重复提交防护与状态核实

最后一种最关键:申请其实已经受理,Agent 却没收到回执——它会不会先核实状态,还是直接再提交一次?

隔离覆盖计算、网络出口、数据、文件、缓存和记忆:每个 Run 使用独立工作区、账户数据和会话,Run 之间不共享任何可变状态。复现分三个层次:配置复现,用 Manifest 恢复场景与版本,回答"同样的实验能不能再来一次";事件复现,重放输入与调度,回答"同样的路径能不能再走一遍";统计复现,重复实验得到相近分布,回答"结论稳不稳"。

2. 故障注入。 故障注入位置决定测试范围:在工具适配层注入,检验的是 Agent 对错误响应的处理;在隔离真实依赖上注入,检验的是端到端的恢复能力。以下 ChaosBlade 集成方式为本书提出的参考架构:ChaosBlade 只作为故障执行后端,何时、对谁、施加什么故障由 Harness 决定;ChaosBlade 执行实验,Harness 负责触发同步、恢复验证与清理。

# 参考架构示例:为 refund-service Pod 注入 300ms 网络延迟
# 运行前提:目标集群 kubeconfig 与实验范围授权
blade create k8s pod-network delay --time 300 \
  --namespace default --labels app=refund-service \
  --kubeconfig ~/.kube/config

故障记录分四步分别保存:计划注入(场景里写了什么)、执行器生效(ChaosBlade 报告实验已启动)、目标命中(观测到延迟确实落在目标调用上)、恢复验证(实验销毁后服务恢复正常)。四步缺一,故障实验的结论就不可信——"注入了"和"生效了"是两件事。

3. 执行环境。 执行环境按任务类型准备:文件任务准备可恢复的目录与权限,浏览器任务准备页面与会话,代码执行任务固定运行时与资源预算。替换与否取决于验证目标:只测工具选择时,可以替掉对应工具;验证路径解析、页面交互或生成代码的实际行为时,必须保留真实执行环境——这正是 23.2 那道"内容还是条件"判断的应用。

引擎和两个子系统都有了。但引擎不知道"这次该跑什么"——需要场景配置告诉它。

16.5 运行配置:场景与资产层

引擎回答"怎么跑",这一节回答"跑什么"。先给两个定义。

场景(Scenario)是对一次受控执行的完整描述:初始条件是什么、参与方是谁、交互规则怎么定、允许哪些演化路径、何时终止。它不是脚本——不固定具体对话内容;也不是随机生成——有明确的约束和边界;它是允许多条合理执行路径的声明式规格。

资产(Asset)是场景引用的、独立版本化的构建产物:用户行为策略、环境初始数据、工具契约、模拟器配置、评估规格。场景组合资产,资产独立于场景演进。两者的关系:场景是"这次实验的设计方案",资产是"设计方案引用的标准化材料"。改用户耐心参数,是新场景版本;改用户模拟器的披露规则逻辑,是新资产版本。

1. 用户与环境联合建模,确保同一业务对象在两侧有一致含义。

用户嘴里的订单、工具参数里的订单号、数据库里的订单记录,必须是同一张单子——任何一处脱节,场景测的就是假问题。联合约束覆盖五个维度:实体与事实绑定(订单只有一个事实版本)、信息可见性(用户认知与环境状态允许不同,但两侧内部各自一致)、动作入口与状态归属(提交入口只有一个,状态变迁有唯一属主)、事件触发与时序(什么事件按什么顺序发生)、目标演化与结果要求(任务完成的判定随场景演化更新)。沿退款流程的时间线,从首次交互到任务结束,可以提炼四类典型变体——每个变体里用户行为条件与环境条件独立变化,联合验证重点随之改变:

场景变体 用户行为条件 环境条件 联合验证重点
查询短暂异常 被追问后提供订单号 首次查询超时,后续恢复 是否保留已知信息、处理异常并取得确认
长时间等待 可按等待时长选择离开 查询持续未完成 等待计时、离开事件与在途操作的衔接
提交前撤回 已同意提交,随后撤回 撤回与提交有明确事件顺序 获知撤回后是否按要求调整
受理后响应丢失 未看到回执时继续追问 申请已受理,响应未到达 是否核实状态、避免重复申请

2. Scenario Spec 用十个字段组回答从"测什么"到"怎么评价"的完整设计。

一个可执行的场景规格需要回答一串递进的问题:这个场景是谁、测什么、环境怎么设、用户与环境怎么关联、别的参与者是谁、事件怎么演化、运行怎么约束、怎么评价、从哪来的。十个字段组沿这条问题链展开:

字段组 主要内容 用途
identity 场景 ID、版本、标签、负责人 身份与变更治理
sut 被测边界、Agent 版本、模型与 Prompt 引用 固定实验对象
user Persona、目标、私有事实、披露规则、行为策略 驱动用户侧交互
environment 初始数据、工具契约、后端模式、时钟策略 构造外部世界
interaction 实体绑定、可见渠道、动作入口、交互模式 关联用户与环境
participants 其他 Agent 的角色、接口和权限 协作拓扑
events 触发条件、故障动作、恢复策略 控制场景演化
execution 种子、并发、轮数、时间与资源预算 约束运行
evaluation_ref 独立断言、Rubric、预期状态的版本引用 关联质量判断
provenance 原始需求、资产位置、脱敏会话、事故记录 追溯来源

退款场景的规格节选如下(interaction ⑤ 与 participants ⑥ 两组省略),注释编号对应上表:

schema_version: 1
identity:                          # ① 身份与变更治理
  id: refund-timeout-retry
  version: 1.3.0
  owner: quality-team
sut:                               # ② 固定实验对象
  agent: refund-agent@2.4.1
  boundary: [reasoning, tool-selection, parameters]
user:                              # ③ 驱动用户侧交互
  persona: { expertise: novice, patience: low, tone: annoyed }
  goal: "拿回 199 元退款"
  private_facts: { order_no: "B2026-0901-7734", paid_amount_minor: 19900 }
  disclosure: { order_no: on-request }   # 订单号只在被追问时提供
environment:                       # ④ 构造外部世界
  backend_mode: surrogate          # 全替身模式
  clock: { policy: virtual, start: "2026-09-01T10:00:00+08:00" }
events:                            # ⑦ 控制场景演化(未来计划,命中后才成为 Event)
  triggers:
    - { target: refund.query, effect: timeout, at: turn-1, recover: turn-2 }
execution:                         # ⑧ 约束运行
  seed: 20260914
  budget: { max_turns: 12, wall_clock: 20m }
evaluation_ref:                    # ⑨ 关联质量判断(版本引用,不含判定)
  assertions: refund-assertions@1.1.0
provenance:                        # ⑩ 追溯来源
  source: "事故 #7742 脱敏会话"

注意两处细节:user.private_facts 与 environment 初始数据里的订单必须是同一实体——这是联合建模的落地;events.triggers 是未来计划,命中后才生成 Event——这正是 23.3 定下的名字边界。

3. 场景材料沿声明→实现→观察→异常四个方向收集,生成机制按控制力从高到低分四种。

材料决定"有什么可用",机制决定"怎么组合出来"。四个收集方向,从应然到实然再到异常:

来源 提取内容 方向
需求与业务政策 适用条件、成功标准与禁止行为 声明:什么是"对"
Agent 源码与构建配置 执行路径、状态管理、依赖边界 实现:实际怎么做
生产会话与运行 Trace 用户目标、表达方式、交互分支 观察:实际怎么被用
事故、缺陷与人工接管记录 触发条件、故障时序、业务后果 异常:哪里出了问题

生成机制按控制力从高到低分四种:

生成机制 方式 控制力
模板填充 将参数填入已验证的场景骨架 最高,结构固定
规则派生 按业务条件和状态路径构造变体 高,组合可控
LLM 辅助 根据分析材料提出交互分支和异常组合 低,需校验筛选
混合生成 模板+规则限定结构,LLM 提出变化,校验器筛选 工程主流

混合生成成为工程主流的原因藏在第三行的风险里:LLM 能提出人想不到的异常组合,但产出不可直接信任——用模板与规则锁住结构,用校验器筛掉不合格的变体,控制力与开放度兼得。

4. 场景和资产分别版本化,Run 中锁定组合确保可复现。

版本化的对象有五类:场景、数据、工具、模拟器、评估规格,各自独立演进;一次 Run 锁定场景与全部资产的版本组合,结论只对这组组合负责。覆盖按"业务阶段 × 用户行为 × 权限状态 × 依赖故障"建立风险矩阵,缺口决定下一批场景的优先级。新出现的交互缺陷和确认缺陷,先核实事实与责任归属,再固化进入回归集——把一次生产事故的表象直接抄成场景,等于把未确诊的病历直接开成处方。

场景跑完了。这次执行交出了什么?它的结论在什么范围内有效?

16.6 证据交付与适用边界

前五节走完了完整链路:定义边界(23.2)、数据契约(23.3)、执行引擎(23.4)、场景配置(23.5)。一条场景跑完,Harness 交付 Run Result——对话记录、工具调用链、状态快照、故障命中情况、有效性检查结果。但这些材料本身不是结论:"退款申请数 = 1"是一条观测,"Agent 是否正确处理了退款"是一个判断。前者是 Simulation 的终点,后者是 Evaluation 的起点。这一节回答三个递进的问题:Simulation 交出的东西本质上是什么、它在治理体系中怎么被使用、它的结论在哪里失效。

1. Run Result 交付的是证据材料,不是质量结论。

运行完成、任务成功、允许发布,是三个互相独立的结论,不能相互推导:运行完成是执行生命周期的事实;任务成功属于 Outcome(业务结果),由业务应用或获授权的 Verifier(校验者)依据成功标准判定;发布授权属于治理门禁。Simulation 与 Evaluation 各自的职责由此划清:

事项 Simulation 的职责 Evaluation 的职责
用户目标 驱动用户继续、澄清或停止 判断业务目标是否实际完成
环境故障 施加条件并记录生效与恢复 判断 Agent 应对与业务后果
业务状态 按契约维护并采集状态 对照目标和政策检查结果
运行时限 达到条件时结束 判断是否满足时效要求
仿真契约 报告角色漂移和执行错误 限定可评分范围与结论可信度

有效性检查是 Simulation 的最后一项输出:核实场景配置是否正确、用户行为是否遵守认知和披露规则、故障是否生效并命中、必需证据是否可访问。检查结果与 Run Result 一起交给评估器。评估器一侧的证据可用性检查也不是一道闸门,而是三道——记录完整性(材料在不在)、运行有效性(条件成立没有)、证据充分性(够不够支撑这个评价项),如图 23-3 所示。证据不足的项目输出"不可判定",其余按现有证据评价——"不可判定"是一个诚实的结论,好过用不充分的证据硬评。

image

图 23-3 基于仿真证据的评估流程:三道证据可用性检查

2. 同一份证据包服务于治理体系的多种决策。

一次 Run 的产物不止判一次"通过/不通过"。Run Result 作为结构化证据,在治理体系中至少有七种用途;前四种用证据回答问题,后三种用证据反哺体系:

用途 如何使用 适用边界
质量评估与重评分 轨迹和状态交给断言/Judge/人工 新增评价只能用原始证据足以支撑的信息
缺陷定位与归因 关联用户反应→Agent 动作→工具执行→状态变化 复杂因果可能需要对照运行
版本回归与门禁 基线与候选在相同条件下配对比较 保留回归与发布依据
复现与回放 用 Manifest 重建条件,或用 Trace 交互式回放 按三种复现层次区分用途
场景提取与覆盖补充 从异常路径和未命中事件中提取候选场景 必须重新验证
模拟器质量治理 聚合用户事实违规和环境状态不一致 避免把模拟器问题误归因于 Agent
性能与成本分析 按参与方和阶段汇总耗时、Token 和费用 区分业务执行与仿真平台开销

读零违规的回归结果时,要小心统计边界:n 次独立运行零违规,违规率的单侧 95% 置信上界是 1 − 0.05^(1/n),大样本下近似 3/n——300 次零违规意味着"违规率大概率不超过 1%",而不是零。这个上界的前提是固定样本量、独立同分布、无非选择性排除;把置信上界读成"真实违规率有 95% 的概率低于该值",是最常见的误读。

门禁用途尤其要守住边界:Testing Gate 汇总验证结果、组织回归证据,但它不是发布决定者——获授权的治理节点拿着 Testing 交付的证据做发布决策,例外路径有审批与留痕,如图 23-4 所示。

image

图 23-4 Testing 应用闭环:Testing Gate 与获授权治理节点的分工

3. Simulation 的结论建立在会过期的假设之上。

仿真用户不是真实用户——用户模型是假设,仿真成功率的上升不能替代真实业务指标。场景来自已知失败模式——覆盖不了训练分布之外的未知风险。工具契约、用户行为分布、故障频次随业务漂移——仿真成功率上升而生产人工接管持续增加,就是假设过期的信号。校准由事件驱动:接口变更、故障复盘、用户结构变化时触发,不按固定周期例行执行——固定周期会在两次校准之间放过漂移,事件驱动把成本花在漂移真正发生的地方。

成本结构上,环境步进不昂贵,瓶颈在模型生成:环境步进是确定性的状态转移,模型生成是概率性推理。AgentSociety 论文报告的特定实验(1 万个 Agent、五轮交互)与这一直觉一致——环境侧通信吞吐在该实验配置下达到每秒数万条消息量级,远未构成瓶颈;该结论依赖实验配置,不宜外推为普适规律。选择执行模式时,在保真度与成本之间取衡:全替身便宜且可复现,隔离真实依赖贵但可信——把预算花在结论最依赖的那段真实上。

Simulation 向治理门禁提供证据输入,但不替代其他治理手段:生产可观测(第 13 章)提供真实运行数据,安全框架(第 14 章)提供威胁模型和防护规则,发现与管理(第 15 章)提供 Agent 资产台账和版本治理。四者互补,不是替代关系。

16.7 本章小结

总的来看,Agent Simulation 是指用可控环境换可验证行为。在角色标准、失败代价、身份连续三样制度前提都缺位的当下,模拟是唯一立刻可做的验证手段;它的边界由授权与后果划定,按保真度和风险分三种执行模式;一次执行的全部对象锚定在 Spec → Manifest → Run → Result 的链上,证据分三层提取;Harness 以编排层为骨架、两个模拟器为两翼,五项职责与五项不做正反一体;场景与资产联合建模、分别版本化,Run 中锁定组合;交付的是证据材料而非质量结论,且结论建立在会过期的假设之上。

治理的四件套至此完整:可观测性看见行为,安全约束行为,发现与管理盘点行为,模拟在上线前验证行为。验证之后的判断与发布授权,属于 Evaluation 与治理门禁的职责,Simulation 的终点,是它们的起点。