## 新增功能 - 文件管理模块:分类树 + 文件上传/下载/删除 - 文件上传支持拖拽(Dragger)+ 手动上传(customRequest 模式) ## 页面布局统一(参照评测执行页) - 仪表盘/评测对象/评测场景/评测报告 全部改为全高 flex 布局 - 统一内联页头样式(h2 + 竖线分隔 + 描述) - 表格撑满高度、overflow 处理 - 每页添加刷新按钮 ## Bug 修复 - 分类树操作按钮 hover 不可见(CSS 规则缺失) - 文件上传失败(multipart boundary 缺失) - LLM API 响应 content blocks 数组格式支持(_extract_content_from_api_response) - response_time_max_ms 被静默忽略(隐式规则传空 params) - 空 messages 导致 IndexError 崩溃 - poll_reply 异常中止整个 run(缺 try/catch) - engine finally 未关闭 session - 3 个页面 UTC 时间戳解析偏差 8 小时 ## 后端 - EvalEngine: poll_reply 异常保护、空 dialog 保护、session 关闭 - LLM API 响应解析支持 content-block-array 格式 - 隐式 response_time 规则正确传递 max_ms 参数 ## 前端 - api.ts: 移除手动 Content-Type(让浏览器自动添加 boundary) - Files.tsx: customRequest 替代 beforeUpload、布局优化 - index.css: 分类树 hover 规则 - Targets/Scenarios/Home/Reports: 全高布局改造 - 3 个页面时间戳改用 formatDateTime()(修复 UTC 偏差) Co-Authored-By: Claude <noreply@anthropic.com>
224 lines
7.0 KiB
Markdown
224 lines
7.0 KiB
Markdown
# 使用 OpenClaw + AgentEvalTool 进行 AI 评测的流程
|
||
|
||
## 整体架构
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ AgentEvalTool 管理后台 │
|
||
│ http://192.168.8.145:8001 │
|
||
│ │
|
||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
|
||
│ │ 评测对象 │ │ 评测场景 │ │ 评测执行 │ │ AI 助手(OpenClaw)│ │
|
||
│ │ (Target) │ │(Scenario)│ │ (Run) │ │ │ │
|
||
│ └──────────┘ └──────────┘ └──────────┘ └──────────────────┘ │
|
||
└──────────────┬───────────────────────────────┬──────────────────┘
|
||
│ HTTP API + 轮询 │ iframe 嵌入
|
||
▼ ▼
|
||
┌──────────────┐ ┌──────────────┐
|
||
│ tutu-api │ │ OpenClaw │
|
||
│ (被评测对象) │ │ 容器 │
|
||
│ AI 客服 │ │ doubao- │
|
||
└──────────────┘ │ seed-2.0 │
|
||
└──────────────┘
|
||
```
|
||
|
||
**角色说明:**
|
||
|
||
| 组件 | 角色 | 说明 |
|
||
|------|------|------|
|
||
| AgentEvalTool | 评测引擎 | 发送消息、收集回复、执行评测规则、生成报告 |
|
||
| tutu-api | 被评测对象 | AI 数字员工 / AI 助手,通过 tutu 聊天 API 收发消息 |
|
||
| OpenClaw | AI 助手 + 编排者 | 可通过对话触发评测,也可直接在管理后台使用 |
|
||
|
||
---
|
||
|
||
## 第一步:配置评测对象(Target)
|
||
|
||
评测对象是你要测试的 AI 系统。在管理后台「评测对象」页面新增。
|
||
|
||
### 配置信息
|
||
|
||
```json
|
||
{
|
||
"base_url": "https://tutu-gateway.lovebenefits.com/tutu-api",
|
||
"token": "Bearer JWT Token",
|
||
"tenant": "sx-jczs",
|
||
"chat_channel_id": "0qlox3lg",
|
||
"chat_contact_id": "vooddlwv"
|
||
}
|
||
```
|
||
|
||
| 字段 | 说明 |
|
||
|------|------|
|
||
| `base_url` | tutu-api 网关地址 |
|
||
| `token` | 鉴权 JWT Token |
|
||
| `tenant` | 租户标识 |
|
||
| `chat_channel_id` | 聊天频道 ID |
|
||
| `chat_contact_id` | 聊天联系人 ID(模拟用户身份发消息) |
|
||
|
||
### 验证连通性
|
||
|
||
配置完成后点击「测试」按钮,系统会调用 `GET /api/{tenant}/v1/chat/message` 验证连通性。
|
||
|
||
---
|
||
|
||
## 第二步:创建评测场景(Scenario)
|
||
|
||
评测场景包含一组测试用例,每个用例定义要发送的消息和评测规则。
|
||
|
||
### 场景 JSON 格式
|
||
|
||
```json
|
||
[
|
||
{
|
||
"id": "case-001",
|
||
"type": "single",
|
||
"messages": [
|
||
"你好,我想问下你们那边是否有做三伏灸"
|
||
],
|
||
"expectations": {
|
||
"response_time_max_ms": 30000,
|
||
"keywords_include": ["三伏灸"]
|
||
},
|
||
"eval_rules": [
|
||
{
|
||
"type": "keyword_match",
|
||
"params": { "keywords": ["三伏灸"] }
|
||
},
|
||
{
|
||
"type": "response_time",
|
||
"params": { "max_ms": 30000 }
|
||
}
|
||
]
|
||
}
|
||
]
|
||
```
|
||
|
||
### 多轮对话用例
|
||
|
||
```json
|
||
{
|
||
"id": "case-002",
|
||
"type": "multi_turn",
|
||
"messages": [
|
||
"你们医院在哪里",
|
||
"周末可以看诊吗"
|
||
],
|
||
"eval_rules": [
|
||
{
|
||
"type": "response_time",
|
||
"params": { "max_ms": 30000 }
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### 字段说明
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `id` | string | 用例唯一标识 |
|
||
| `type` | `single` / `multi_turn` | 单轮 / 多轮对话 |
|
||
| `messages` | string[] | 依次发送给被评测对象的消息列表 |
|
||
| `eval_rules` | object[] | 评测规则列表(见下方) |
|
||
| `expectations` | object | 预期结果(可自动推导规则) |
|
||
|
||
### 评测规则
|
||
|
||
| 规则类型 | 说明 | 参数 |
|
||
|----------|------|------|
|
||
| `keyword_match` | 检查回复是否包含/不包含指定关键词 | `keywords`: 必须包含的关键词列表 |
|
||
| `response_time` | 检查回复延迟是否在阈值内 | `max_ms`: 最大允许延迟(毫秒) |
|
||
| `llm_score` | 调用 LLM 对回复质量打分 | `api_url`, `api_key`, `model`, `criteria`, `min_score` |
|
||
|
||
> **提示**:如果不写 `eval_rules`,系统会根据 `expectations` 自动推导规则。
|
||
|
||
---
|
||
|
||
## 第三步:启动评测(Run)
|
||
|
||
### 方式一:Web 管理后台
|
||
|
||
1. 打开「评测执行」页面
|
||
2. 选择评测对象和评测场景
|
||
3. 点击「启动评测」
|
||
4. 右侧抽屉实时显示 WebSocket 推送的执行日志
|
||
|
||
### 方式二:CLI 命令
|
||
|
||
```bash
|
||
agenteval run start --target-id <target_id> --scenario-id <scenario_id>
|
||
```
|
||
|
||
### 方式三:OpenClaw AI 助手
|
||
|
||
在管理后台的「AI 助手」页面,通过对话让 OpenClaw 帮你触发评测:
|
||
|
||
```
|
||
请帮我执行一次评测,评测对象是社区医院AI客服,场景是社区医院基础服务评测
|
||
```
|
||
|
||
OpenClaw 会通过插件调用 `agenteval run start` CLI 命令,并返回评测报告。
|
||
|
||
---
|
||
|
||
## 第四步:查看评测结果
|
||
|
||
### 执行过程(实时)
|
||
|
||
评测启动后,系统对每个用例依次执行:
|
||
|
||
```
|
||
发送消息 → 轮询等待回复(最长30秒)→ 记录对话 → 执行评测规则 → 输出结果
|
||
```
|
||
|
||
WebSocket 实时推送以下事件:
|
||
|
||
| 事件 | 说明 |
|
||
|------|------|
|
||
| `case_start` | 开始执行某个用例 |
|
||
| `turn_end` | 一轮对话完成(含用户消息 + AI 回复 + 延迟) |
|
||
| `rule_result` | 一条评测规则的判定结果 |
|
||
| `turn_error` | 消息发送或回复超时 |
|
||
|
||
### 评测报告
|
||
|
||
评测完成后,在「评测报告」页面查看:
|
||
|
||
- **统计数据**:总用例数、通过数、失败数、通过率
|
||
- **元信息**:评测对象、场景、开始/完成时间
|
||
- **用例明细**:每个用例的逐轮对话内容 + 规则判定结果
|
||
|
||
也可以导出 HTML 报告。
|
||
|
||
---
|
||
|
||
## 当前已配置的资源
|
||
|
||
### 评测对象
|
||
|
||
| 名称 | 平台 | 通道 | 状态 |
|
||
|------|------|------|------|
|
||
| 社区医院AI客服 | AI 数字员工 | tutu-api | active |
|
||
|
||
### 评测场景
|
||
|
||
| 名称 | 用例数 | 标签 |
|
||
|------|--------|------|
|
||
| 社区医院基础服务评测 | 2 | health, basic-service |
|
||
| 科室导航与挂号咨询 | 3 | health, department, navigation |
|
||
|
||
### 历史评测记录
|
||
|
||
已执行 8 次评测,全部通过(pass_rate 100%),平均响应时间约 11 秒。
|
||
|
||
---
|
||
|
||
## 快速上手 Checklist
|
||
|
||
- [ ] 确认评测对象连通性(管理后台 → 评测对象 → 测试)
|
||
- [ ] 创建或选择评测场景
|
||
- [ ] 启动评测(Web UI / CLI / OpenClaw 对话)
|
||
- [ ] 查看实时执行日志
|
||
- [ ] 查看评测报告和用例明细
|