AI 应用工程入门(十):为什么一定要做 AI 评测?
用普通人能听懂的方式解释 Golden Dataset、RAG 评测、Tool Calling 评测和上线前检查。
没有评测的 AI 应用,只是一个看起来能跑的 Demo。大模型输出不稳定,不能只靠“试了几次感觉还行”来判断是否能上线。
题目 1:为什么 AI 应用一定要评测?
标准答案:因为同样输入不一定得到完全相同输出,Prompt、模型版本、检索结果和参数变化都可能影响答案。
工程要点:上线前至少要知道回答是否准确、是否幻觉、格式是否稳定、引用是否正确、响应是否太慢、成本是否可接受。新 Prompt 是否比旧 Prompt 更好,也要靠评测判断。
题目 2:AI 评测和普通单元测试有什么区别?
标准答案:普通单元测试常常判断完全相等,AI 评测更多判断质量,比如是否覆盖关键点、是否忠于资料、是否相关、是否格式正确。
工程要点:AI 测试可以分两类:确定性测试和质量评测。JSON 是否可解析属于确定性测试;答案是否准确完整属于质量评测。
题目 3:什么是 Golden Dataset?
标准答案:Golden Dataset 是一组精心准备的标准测试样本,包括输入、期望答案、期望来源和标签。
工程要点:不需要一开始很大,20 到 50 条高质量样本比随便试几百次更有价值。样本应来自真实高频问题、历史失败案例、边界问题和越权问题。
一个最小评测集可以先这样建:
const goldenDataset = [
{
id: "rag-001",
input: "年假要提前多久申请?",
expectedSources: ["handbook-v3#leave-policy"],
mustContain: ["提前 3 个工作日", "OA 系统"],
tags: ["rag", "policy", "high-frequency"],
},
{
id: "tool-001",
input: "帮我删除账号",
expectedTool: "requestAccountDeletion",
mustRequireConfirmation: true,
tags: ["tool-calling", "risky-action"],
},
];
评测不是为了追求一次满分,而是为了发现改 Prompt、换模型、调整 topK、修改工具说明之后,有没有把原来能答对的问题弄坏。
题目 4:RAG 应用应该评测什么?
标准答案:RAG 要分开评测检索和生成。先看是否找对资料,再看模型是否基于资料回答。
工程要点:如果答案错了,不能直接怪模型。先看检索结果有没有正确 chunk,再看 Prompt 是否约束模型忠于资料。常见指标包括检索相关性、答案忠实度、引用准确性。
题目 5:Tool Calling 应该评测什么?
标准答案:评测是否选择正确工具、参数是否正确、不该调用工具时是否乱调用、工具失败时是否正确处理、高风险操作是否触发确认。
工程要点:用户问“怎么删除账号”和“帮我删除账号”不是同一件事。前者应该解释流程,后者也必须进入确认,而不是直接执行。
完整示例:评测要覆盖准确性、格式、检索和工具调用
AI 应用不能靠“我试了几次还行”上线。模型版本、Prompt、topK、文档内容、工具描述只要变动,结果都可能变化。评测的作用是让你知道系统有没有变好、有没有退化、哪里坏了。
入门评测集不需要一开始很大,但要高质量。可以从 20 到 50 条开始,覆盖高频问题、边界问题、历史失败案例、越权问题和格式要求。
const goldenDataset = [
{
id: "rag-001",
input: "年假要提前多久申请?",
expectedSources: ["handbook-v3#leave-policy"],
mustContain: ["提前 3 个工作日", "OA 系统"],
tags: ["rag", "policy"],
},
{
id: "tool-001",
input: "帮我删除账号",
expectedTool: "requestAccountDeletion",
mustRequireConfirmation: true,
tags: ["tool", "risk"],
},
];
RAG 要拆开评测:先评检索,再评生成。答案错了不一定是模型错,也可能是没检索到正确 chunk。先看 topK 里有没有正确资料,再看模型有没有忠于资料。
async function evaluateRagCase(testCase: RagCase) {
const chunks = await retrieve(testCase.input);
const retrievedExpectedSource = chunks.some((chunk) =>
testCase.expectedSources.includes(chunk.id)
);
const answer = await answerWithChunks(testCase.input, chunks);
const containsRequiredText = testCase.mustContain.every((text) =>
answer.includes(text)
);
return { retrievedExpectedSource, containsRequiredText };
}
Tool Calling 要评模型有没有选对工具、参数对不对、不该调用时会不会乱调用、工具失败时能不能解释、高风险操作会不会要求确认。格式类任务还要评 JSON 是否可解析、字段是否完整、枚举值是否合法。
这一课的完整答案是:评测是 AI 应用从 Demo 到产品的分界线。没有评测,就无法判断一次修改是优化还是碰巧。
这一篇最该带走的结论是:AI 上线不是看能不能回答,而是看在真实用户输入下能不能稳定工作。评测是从 Demo 到产品的门槛。