Files
2026-07-13 21:35:56 +08:00

86 lines
6.2 KiB
Markdown

# 步骤 5:运行 `pixie test` 并修复机械问题
**为什么需要这一步**:运行 `pixie test` 并修复 QA 组件中的机械问题——数据集格式问题、可运行实现中的 bug 以及自定义评估器错误——直到每一条记录都产生真实评分。这一步**不**涉及评估结果质量或修复应用程序本身。
---
## 5a. 运行测试
```bash
uv run pixie test
```
如需包含每条用例评分和评估器推理的详细输出:
```bash
uv run pixie test -v
```
`pixie test` 在运行测试前会自动加载 `.env` 文件。
评估框架的执行流程如下:
1. 从数据集的 `runnable` 字段解析出 `Runnable`
2. 调用 `Runnable.create()` 构造实例,然后调用一次 `setup()`
3. 以**并发**方式运行所有数据集条目(最多 4 个并行):
a. 从条目中读取 `input_data``eval_input`
b. 用 `eval_input` 数据填充 wrap 输入注册表
c. 初始化捕获注册表
d. 将 `input_data` 校验为 Pydantic 模型,然后调用 `Runnable.run(args)`
e. 应用中的 `wrap(purpose="input")` 调用返回注册表中的值,而不是调用外部服务
f. `wrap(purpose="output"/"state")` 调用捕获评估所需的数据
g. 从捕获的数据构建 `Evaluable`
h. 运行评估器
4. 调用一次 `Runnable.teardown()`
由于条目是并发运行的,Runnable 的 `run()` 方法必须是并发安全的。如果看到 `sqlite3.OperationalError``"database is locked"` 或类似错误,请为 Runnable 添加一个 `Semaphore(1)`(参见步骤 2 参考文档中的并发章节)。
## 5b. 仅修复机械问题
这一步严格限于修复你在前面步骤中构建的内容——数据集、runnable 以及任何自定义评估器。你修复的是阻止流水线运行的机械问题,而非评估或改进应用程序的输出质量。
**哪些属于机械问题**(需要修复):
| 错误 | 原因 | 修复方法 |
| ------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| `WrapRegistryMissError: name='<key>'` | 数据集条目缺少 `eval_input` 项,其中 `name` 与应用中 `wrap(purpose="input", name="<key>")` 所期望的名称不匹配 | 在每个受影响的条目的 `eval_input` 中添加缺失的 `{"name": "<key>", "value": ...}` |
| `WrapTypeMismatchError` | 反序列化的类型与应用的期望不匹配 | 修复数据集中的值 |
| Runnable 解析失败 | `runnable` 路径或类名错误,或该类未实现 `Runnable` 协议 | 修复数据集中的 `filepath:ClassName`;确保该类包含 `create()``run()` 方法 |
| 导入错误 | 模块路径错误或 runnable/evaluator 中存在语法错误 | 修复引用的文件 |
| `ModuleNotFoundError: pixie_qa` | `pixie_qa/` 目录缺少 `__init__.py` | 运行 `pixie init` 重新创建 |
| `TypeError: ... is not callable` | 评估器名称指向一个不可调用的属性 | 评估器必须是函数、类或可调用实例 |
| `sqlite3.OperationalError` | 并发 `run()` 调用共享同一个 SQLite 连接 | 为 Runnable 添加 `asyncio.Semaphore(1)`(参见步骤 2 的并发章节) |
| 自定义评估器崩溃 | 自定义评估器实现中存在 bug | 修复评估器代码 |
**哪些不属于机械问题**(此处不要修复):
- 应用程序输出错误或质量低下 → 属于应用程序行为,在步骤 6 中分析
- 评估器评分低 → 属于质量信号,在步骤 6 中分析
- 应用内部的 LLM 调用失败 → 在步骤 6 中报告,不要模拟或绕过
- 评估器评分在不同运行之间波动 → 正常的 LLM 非确定性,不是 bug
反复迭代——修复错误,重新运行,修复下一个错误——直到 `pixie test` 成功运行完毕,所有条目都产生真实的评估器评分。
## 输出
`pixie test` 成功完成后,结果会存储在按条目组织的目录结构中:
```
{PIXIE_ROOT}/results/<test_id>/
meta.json # 测试运行元数据
dataset-{idx}/
metadata.json # 数据集名称、路径、runnable
entry-{idx}/
config.json # 评估器、描述、预期结果
eval-input.jsonl # 提供给评估器的输入数据
eval-output.jsonl # 从应用捕获的输出数据
evaluations.jsonl # 评估结果(已评分 + 待评分)
trace.jsonl # LLM 调用追踪记录(如果已捕获)
```
`<test_id>` 会打印在控制台输出中。你将在步骤 6 中引用该目录。
---
> **如果在运行测试时遇到意外错误**(参数名称错误、导入失败、API 不匹配),请在猜测修复方法之前先阅读 `wrap-api.md`、`evaluators.md` 或 `testing-api.md` 获取权威 API 参考。