测试、评测与可观测性
本节目标
你将学会把“Agent 看起来能工作”改写成可重复的验收条件:先用确定性测试覆盖数据、工具、Task 和 Flow,再用多次模型运行评估非确定性质量,最后用事件和版本信息解释失败发生在哪里。
动态资料边界
PyPI 在 2026-07-21 的最新稳定观察为
crewai==1.15.5,而本课程 Layer B 的经测试基线仍是1.15.4。官方测试命令、默认模型和提供商限制都可能变化。运行真实项目时,先查看锁定版本的crewai test --help,不要从本笔记推断未来 CLI 行为。
为什么一次成功演示不算验收
LLM 输出会受模型版本、采样、上下文、工具返回和网络状态影响。一个示例成功,只能说明“这一轮没有暴露问题”,不能证明:
- 失败输入能安全停止;
- 工具不会越权或重复产生副作用;
- 引用真的支持结论;
- Flow 在第二次尝试后会终止;
- 依赖或 Prompt 更新后没有回归;
- 成本和延迟满足生产预算。
因此需要把确定性业务控制和概率性内容质量分开验证。
四层测试与评测
第一层:纯函数与 schema 单元测试
不调用模型,覆盖最稳定也最便宜的部分:
- 输入字段、类型、长度和未知字段拒绝;
- Tool 参数白名单与权限检查;
- Task 输出 schema 和来源 ID;
- Flow 状态迁移、尝试上限和终态;
- 幂等发布、重复恢复与不同内容拒绝覆盖;
- 错误分类和哪些错误可以重试。
这些测试应在普通 Python 和 python -O 下都有效,不要把关键校验写在 assert 中,因为优化模式会移除普通断言。本课程 Layer A 的 39 个测试就是这一层的示例;Layer B 另有 9 项真实 CrewAI runtime 测试,两组结果不能合并成一个模糊数字。
第二层:Agent 或 Task 离线评测
为单个 Task 固定输入和判定器,检查:
- 是否生成可解析的结构化输出;
- 是否只使用允许来源;
- 缺证据时是否表达未知;
- 是否出现禁止内容或越权工具意图;
- 同一输入多次运行的通过率和主要失败类型。
模型桩适合验证控制逻辑,但不能代表真实模型质量。录制响应可以降低成本,却可能掩盖模型升级后的变化;需要明确标注录制时间、模型和 SDK 版本。
第三层:Crew 轨迹评测
检查协作过程,而不只看最终答案:
- Task 是否按允许顺序执行;
- 每个 Agent 是否只使用自己的工具;
- 失败是否路由到修订或人工接管;
- 工具调用次数、总步骤、令牌和时间是否在预算内;
- 每条关键结论能否追溯到来源和中间产物。
多 Agent 之间“聊得很热闹”不是质量指标;轨迹应证明分工真的带来独立产物或校验价值。
第四层:小规模真实集成与在线评测
在锁定模型、依赖和数据版本后,用受控凭据运行少量端到端样本。逐步增加并发和真实数据,记录质量、成本、延迟与安全。高风险写操作先用预览或沙箱替代,达到发布门槛后才开放。
评测集如何设计
一个有效评测集至少包含:
- 正常输入;
- 边界值和空值;
- 缺少来源或无法回答;
- 外部文档中的提示注入;
- 工具超时、限流和权限拒绝;
- 重复运行与检查点恢复;
- 人工拒绝;
- 不同租户或权限的数据隔离;
- 极长上下文;
- 旧 schema、旧知识版本或不兼容状态。
每条样本至少记录:样本 ID、输入版本、期望终态、允许工具、禁止行为、必须引用、最大尝试次数和判定方式。需要主观判断时,先写评分 rubric,并用人工样本校准判定器。
指标与发布门槛
| 维度 | 指标示例 | 门槛设计要点 |
|---|---|---|
| 任务 | 任务成功率、终态正确率 | 分场景报告,不只看总体平均值 |
| 事实 | 引用支持率、未知项识别率 | 关键结论必须逐条可追溯 |
| 工具 | 工具选择准确率、参数通过率 | 越权调用应单独计为严重失败 |
| 可靠性 | 重试后成功率、重复副作用率 | 重复副作用通常必须为 0 |
| 安全 | 注入成功率、秘密泄露率 | 高风险违规不能被平均质量分抵消 |
| 运行 | P50/P95 延迟、步骤和成本 | 同时给出样本规模和版本 |
| 人工 | 接管率、误拒率、审核耗时 | 接管本身可能是正确终态 |
先定义红线,再定义平均质量。例如“引用支持率 ≥ 某阈值”不能抵消一次真实凭据泄露。阈值必须来自具体业务风险和基线,而不是照抄别人的数字。
CrewAI 自带测试能力如何定位
官方 Testing 页面提供 crewai test 作为 Crew 测试入口。2026-07-21 页面仍描述了默认迭代、默认模型及当前提供商限制;这些是易变实现事实。本课程没有真实密钥,也没有执行该命令。采用它时应:
# 在真实项目的已激活 venv 中先确认当前 CLI
crewai test --help # 查看锁定版本实际提供的参数、默认行为和可用测试入口。
# 确认成本、模型和样本后再运行
crewai test # 执行框架级 Crew 测试;仍需用应用测试覆盖安全与业务合同。框架命令可以补充真实 Crew 评测,但不能替代你的 schema、权限、幂等性和 Flow 路由单测。
可观测性:为失败保留可解释证据
每次运行生成唯一 run_id,事件至少记录:
- 事件序号、类型和时间;
- Crew、Agent、Task 与 Tool 的稳定 ID;
- 输入输出的 schema 版本和安全摘要;
- 工具成功、错误类别、重试与耗时;
- 路由决定、审批人或人工接管原因;
- 依赖、模型、Prompt、工具 schema、Knowledge 和评测集版本;
- 最终状态、成本与关键质量判定。
不要把完整 Prompt、密钥、个人数据或工具原始响应无差别写入日志。可观测性系统自身也是一个数据接收端,需要最小权限、脱敏、保留期限和访问审计。
CrewAI 的内置 tracing 与匿名 telemetry 是不同通道。当前官方 tracing 页面说明启用 tracing 后可看到 Agent 决策、Tool 使用以及 LLM 调用的 prompts/responses;因此“为了排障打开 tracing”本身是一项数据外发与访问控制决策。Layer B 仅在锁定版本的 fixture 上以 tracing=False 验证运行时控制面,且没有做网络抓包;它不能证明真实部署、插件或 exporter 没有额外数据出口。把 trace 目的地、字段最小化、访问角色、保留期和抽样策略纳入发布前测试。
官方 Event Listeners 页面提供基于事件总线的监听机制,并以 BaseEventListener 等概念展示如何订阅 CrewAI 事件。事件类型与导入路径可能随版本变化;真实接入前要在锁定版本做最小导入测试。监听器失败也不应悄悄改变核心业务语义。
一次回归如何定位
- 确认样本、依赖、模型、Prompt、工具 schema 和知识索引的版本;
- 找到首次出现失败的事件与 Task;
- 区分模型输出错误、工具错误、路由错误和判定器错误;
- 用固定输入重放最小失败单元;
- 一次只改变一个主要变量;
- 新增能重现问题的测试,再验证修复没有破坏其他场景。
如果观测数据不足以定位,就应明确写“当前无法证明原因”,而不是根据最终文本猜测。
动手实践
以研究简报 Crew 为例,设计 12 条评测样本:4 条正常、3 条缺证据、2 条工具故障、2 条提示注入、1 条重复恢复。为每条样本写出:
- 期望终态;
- 允许调用的工具;
- 必须出现的来源 ID;
- 最大尝试次数;
- 一个自动判定和一个人工抽查项。
然后运行 离线研究简报 Flow 的三种测试模式,解释为什么普通模式、-O 和 warnings-as-errors 各自提供不同证据。
掌握检查
- 能区分确定性测试、模型评测、轨迹评测与在线评测。
- 能为每条评测样本指定期望终态和禁止行为。
- 能同时报告质量、可靠性、安全、成本与延迟。
- 能用运行事件和版本信息复现一次失败。
- 知道
crewai test不能替代业务控制和安全测试。
下一步
测试暴露问题后,还需要决定系统如何安全停止、恢复和上线:安全、失败恢复与生产边界。
主要参考资料
资料获取日期:2026-07-21。