AI 应用测试
问题
AI 应用如何做质量保证?Prompt 测试、集成测试、评估流水线如何设计?
答案
一、AI 测试金字塔
二、Prompt 测试与评估
评估数据集
interface EvalCase {
input: string;
expectedOutput?: string; // 期望输出(精确匹配场景)
criteria: string[]; // 评估标准
tags: string[]; // 用于分类统计
}
const evalCases: EvalCase[] = [
{
input: "什么是 React?",
criteria: ["提到组件化", "提到虚拟 DOM", "准确性"],
tags: ["基础概念"],
},
{
input: "解释闭包",
criteria: ["定义准确", "有代码示例", "提到应用场景"],
tags: ["JavaScript"],
},
];
自动化评估
import { generateText } from "ai";
import { openai } from "@ai-sdk/openai";
async function evaluateResponse(input: string, output: string, criteria: string[]) {
// 用 LLM 做评判(LLM-as-Judge)
const { text } = await generateText({
model: openai("gpt-4o"),
prompt: `评估以下 AI 回答的质量。
问题:${input}
回答:${output}
评估标准:
${criteria.map((c, i) => `${i + 1}. ${c}`).join("\n")}
请对每个标准打分(1-5)并给出整体评分。输出 JSON 格式。`,
});
return JSON.parse(text); // { scores: [4, 5, 3], overall: 4.0 }
}
三、集成测试
import { describe, it, expect, vi } from "vitest";
// Mock LLM 调用
vi.mock("ai", () => ({
streamText: vi.fn().mockReturnValue({
toDataStreamResponse: () => new Response("mocked response"),
text: Promise.resolve("这是一个 Mock 回答"),
}),
}));
describe("Chat API", () => {
it("应该返回流式响应", async () => {
const response = await fetch("/api/chat", {
method: "POST",
body: JSON.stringify({
messages: [{ role: "user", content: "你好" }],
}),
});
expect(response.status).toBe(200);
expect(response.headers.get("content-type")).toContain("text/event-stream");
});
it("未认证应返回 401", async () => {
// 移除认证 Mock
const response = await fetch("/api/chat", {
method: "POST",
body: JSON.stringify({ messages: [] }),
});
expect(response.status).toBe(401);
});
});
四、评估流水线
.github/workflows/eval.yml
name: AI Evaluation
on:
pull_request:
paths: ["src/prompts/**"]
jobs:
evaluate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: pnpm install
- run: pnpm run eval
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
- name: Check scores
run: |
score=$(cat eval-results.json | jq '.overall')
if (( $(echo "$score < 4.0" | bc -l) )); then
echo "Evaluation score $score is below threshold 4.0"
exit 1
fi
五、常用评估指标
| 指标 | 适用场景 | 说明 |
|---|---|---|
| 准确率 | 分类、问答 | 答案是否正确 |
| Faithfulness | RAG | 回答是否基于检索内容 |
| Relevancy | RAG | 回答是否与问题相关 |
| Toxicity | 安全 | 是否有害内容 |
| Latency | 性能 | TTFT、TPS |
| LLM-as-Judge | 通用 | 用 GPT-4 评判质量 |
常见面试问题
Q1: AI 应用如何做回归测试?
答案:
- 构建评估数据集:从真实用户问题中精选 100-500 个 case
- 自动化评估:每次修改 prompt 或模型后自动运行评估
- LLM-as-Judge:用强模型(GPT-4o)评判弱模型输出的质量
- 阈值门控:CI 中设置分数阈值,低于阈值阻止合并
- 版本对比:每次改动前后的分数对比
Q2: LLM-as-Judge 准确吗?
答案:
- 与人类评判的一致率在 80-90%,对大多数场景足够
- 局限:对主观问题、幽默、文化相关内容判断不准
- 改进:使用多个 Judge 模型取平均、提供评分标准和 few-shot 示例