针对「履约数字人外呼」场景的对话模型指令遵循能力自动评测系统。通过状态机驱动的用户模拟器与被测模型多轮对话,结合 8 类规则匹配器 + LLM Judge 自动评分,输出可解释、可量化的评测报告与可执行的改进建议。支持三维度评分(完成度/鲁棒性/安全)、5 维 Persona 工厂、对抗红队测试、回归对比分析,配套 React + FastAPI 完整可视化平台。
任务列表:4 步进度灯(评测方案 → 模拟用户 → 评测 → 报告)、Rubric/Persona 数量、通过率一览。
任务详情:测试历史 + 对话流程图(节点按 rubric 覆盖着色)+ 模拟用户剧本列表。
跨任务总览:各任务运行数、通过率(阈值 0.6)、三维度平均分对比。
单任务详情:按 Persona 统计表 + Persona x Rubric 热力图(蓝=完成度 / 橙=鲁棒性 / 绿=安全,深浅按得分)+ 按 Rubric 汇总表。
单 case 报告:task_score + 雷达图 + 评分明细 + 对话回放(违规红框高亮 + 探针标记)。
履约数字人(美团骑手通知、课程平台升级通知、保险续保提醒……)是一个多轮、复杂指令、强约束的对话场景:
- 完成度问题:任务有 4-7 步固定流程,模型容易漏说某一步
- 鲁棒性问题:每轮字数限制、口语化、不重复 —— 模型容易啰嗦、重复、太书面
- 安全问题:用户会诱导承诺(优惠/特殊照顾)、编造数字、社工诱导暴露内部信息
- 覆盖问题:用户类型多样(合作型/抵触型/犹豫型/抬杠型/对抗型),需要全部测到
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 用户模拟器 │ ──────> │ 对话 Runner │ ──────> │ 评分器 │
│ 状态机+LLM │ <────── │ trace JSONL │ │ 规则 + LLM │
│ +定向探针 │ │ 可复现可审 │ │ Judge │
└──────────────┘ └──────────────┘ └──────────────┘
- 用户模拟器 = 有限状态机控走向 + LLM 生成话术 + 定向探针强制覆盖关键场景
- trace-first:所有事件落 JSONL,评分基于 trace 可复现可审计
- 评分 = 8 类代码 matcher + LLM Judge(必须返回
evidence_turn_id);三维度(完成度/鲁棒性/安全),safety 做乘子违规即归零
| 能力 | 实现 | |
|---|---|---|
| 1 | 贴一段 prompt,一键生成评测方案 | LLM 抽 task.yaml / flow / rubrics / personas / grader.py |
| 2 | 5 维度独立采样生成模拟用户 | 性格 x MBTI x 性别 x 年龄 x 教育,各自比例独立采样组合 |
| 3 | 一次任务多次测试版本管理 | 每次测试 test_id + agent_version + 跑批参数 + 结果指标(SQLite) |
| 4 | 跑批后自动出报告 + 改进建议 | HTML 报告 + LLM 找弱 rubric + 给「改 prompt 哪几句」 |
| 5 | 自动应用建议 + 备份新版本 | LLM 改写 prompt + unified diff + 接受/拒绝 + 自动版本管理 |
| 6 | 改完后回归对比 | regression 三层 diff(总览 / rubric / persona)+ 显著性阈值 |
| 7 | 安全红队专项 | 3 类对抗 persona(注入 / 社工 / 施压)+ 破防率矩阵 |
| 8 | 模拟用户维度分析 | 每个属性值的通过率 → 找出「最难搞定的用户特征」 |
git clone https://github.com/CHANGJianshuo/agent_eval
cd agent_eval
# 安装 Python 依赖
pip install -e '.[dev,web]'
# 构建前端(需要 Node.js >= 18)
cd web && npm install && npm run build && cd ..
# 启动(API + UI + 报告托管全在 :8000)
PYTHONPATH=src python3 -m claw_eval.cli web --port 8000UI「全局配置」里输入,保存到 ~/.claw_eval/api_keys.yaml(不进 git)。或环境变量:
export DEEPSEEK_API_KEY=...- 能用规则就别用 LLM —— 8 类代码 matcher 优先;LLM Judge 只判语义类
- LLM Judge 必须给 evidence_turn_id —— 评分指向具体对话轮,这是「可解释」的命门
- Safety 做乘子 —— 违反则 task_score x 0,「分高就过」不能掩盖安全问题
- 触发型 rubric 不计分母 —— 该条 trigger 没满足就不参与计分,避免拖分
- Pass^k 多轮采样 —— 同 case 跑 k 次,全过才算稳定通过
- Persona 多维独立采样 —— 5 个维度各自配比例,独立采样组合
- 三模型分离 —— SUT / 模拟器 / Judge 用不同模型,避免「自己评自己」
- trace + run_id 分目录 —— 评测产物按 run_id 子目录归档
固定比例跑批之外,系统支持根据前一批 case 的新增覆盖反馈,自适应选择下一批 用户剧本。每个 wave 内并发运行,wave 之间更新 planner:
dial-agent-eval batch \
--task live_upgrade \
--total 100 \
--strategy coverage-ucb \
--batch-size 4 \
--concurrency 4 \
--coverage-target 0.95 \
--patience 5 \
--label coverage_ucb_seed_1--coverage-target:声明覆盖率达到该值后提前结束,即候选剧本配置声称的 目标已被选到。它不代表对话中真实走到了这些流程。--patience:连续多少个 wave 没有新增实测(observed)证据后结束;0表示禁用。声明覆盖增长不会重置该计数。--batch-size:一个反馈 wave 的 case 数;默认等于并发数。--strategy static:保持原有 uniform / sampling.yaml 静态分配行为。
每个 case 除 trace 和评分结果外,还会生成 .coverage.json。run 目录包含:
traces/<run_id>/
├── manifest.json # 模型、预算、代码与任务制品指纹
├── planner_events.jsonl # 选择原因、新增覆盖、收益与停止原因
├── coverage.json # 整批累计 coverage 快照
├── <case>.jsonl
├── <case>.result.json
└── <case>.coverage.json
Coverage 证据分为两类:
observed:从实际 trace 或 rubric trigger 中确定性提取,例如状态机节点、 状态转移和已注入 probe。declared:v2 场景剧本通过covers_flow_nodes声明的目标路径。由于 v2 trace 目前不输出逐轮 flow node,声明覆盖不会伪装成运行时观测覆盖。
dial-agent-eval batch \
--task live_upgrade \
--total 100 \
--strategy coverage-ucb \
--label coverage_ucb_seed_1 \
--resume每个 wave 在调用模型前写入 wave_planned 预写记录。恢复时复用已经完整落盘的
case,只补跑缺失 case。模型、预算、任务配置、rubric、persona 或运行时代码指纹
发生变化时,恢复会被拒绝;并发数、wave 大小和早停阈值可以调整。
当前
coverage-ucb不与--dimensions或 sampling noise overlay 混用。
claw_eval.experiment 提供 Wilson 通过率区间、固定 seed 的配对 bootstrap 差值
区间和 Benjamini–Hochberg 多重检验校正。报告中的固定分差阈值只能称为工程变化
阈值,不能单独解释为统计显著性。
src/claw_eval/ # Python 业务逻辑
├── cli.py # 16 个 CLI 命令
├── api/ # FastAPI 后端(27 个 endpoints)
├── models/ # Pydantic schema
├── runner/ # 对话主循环 + LLM 客户端 + trace 读写
├── user_simulator/ # 状态机 + 模拟器 + 探针
├── graders/ # 8 matcher + LLM Judge + scoring
├── rubric/ # rubric 抽取 + 人审 gate
├── report/ # 报告生成 + 聚合 + 流程图 + 改进建议 + 回归
├── coverage/ # coverage catalog / 提取 / 累计 / 落盘
├── planners/ # 静态与 coverage-UCB planner、早停和恢复
├── experiment/ # manifest、代码/制品指纹与统计工具
├── task_gen/ # flow/variables/grader 生成器 + 版本管理
├── persona_factory.py # 5 维度独立采样
├── db/ # SQLite 索引
└── adversarial.py # 安全红队
web/src/ # React 前端(Linear/Vercel 风格)
├── pages/ # TaskList / TaskOverview / TestDetail / Settings
├── components/ # NewTestForm / FlowGraph / ScriptList
└── lib/ # api.ts(含 mock fallback)
tasks/ # 各任务配置目录
├── meituan_rider_contract/ # 美团骑手签约外呼
├── meituan_feimaotui/ # 美团飞毛腿外呼
└── live_upgrade/ # 课程平台直播升级
- claw-eval —— LLM-as-agent 评测框架,最贴近的参考项目
- tau-bench / tau2-bench —— Sierra,客服 agent + 用户模拟器
- AgentProcessBench(arXiv 2603.14465)—— 步骤级过程评分
- DeepEval / Ragas —— Python LLM eval 工具
- UC Berkeley RDI 反作弊警示(2026.4)—— 一个自动扫描攻破了全部 8 个主流 agent benchmark
| 成员 | 角色 | 主要负责 |
|---|---|---|
| 常建烁 | 队长 / 主力开发 | 系统架构设计、评测引擎核心(Runner / 评分器 / 状态机模拟器)、Rubric 抽取与分类、报告可视化、React 前端 + FastAPI 后端、CI/CD 部署 |
| 张叔阳 | 核心开发 | 用户模拟器策略优化、对抗探针与安全红队、Persona 维度设计与采样、回归对比分析、测试用例编写与质量保障 |
两人全程紧密协作,代码交叉 review,贡献相当。
MIT




