AI应用的测试链路:从感觉验证到指标量化

老阿凯 中级 2026/8/21 712 浏览 6 点赞 约 1 分钟

AI应用说到底还是软件工程,但它的非确定性让传统的“跑通一次”根本站不住脚。做NL2SQL或RAG功能时,最棘手的点是模型对微小输入变化会大幅偏移。我把测试逻辑从“看感觉”换成了“看指标”。

AI应用的测试链路:从感觉验证到指标量化

构建低成本黄金评测集

搭建低成本评测集,别靠随机测试,得建黄金用例集。用JSON定义测试用例,字段是input和expected_contains,用断言检查输出是否覆盖预期关键字。

test_cases = [
  {
    "input": "Find the top 10 customers by revenue.",
    "expected_contains": ["GROUP BY", "ORDER BY", "LIMIT"]
  },
  {
    "input": "Find revenue for 2025 excluding cancelled orders.",
    "expected_contains": ["2025", "cancelled"]
  },
]

跑评测脚本时,输出缺关键字就记Failure并打印Diff。改Prompt或换模型(比如从GPT-4o切到Claude 3.5),跑一遍评测集就能看到通过率涨跌,不用靠猜。

把Prompt当代码管理

Prompt要当代码管,必须进版本系统。禁止在代码里硬编码Prompt,走的是Prompt v1 -> Evaluation -> Results -> Prompt v2闭环。优化Prompt必须附评测报告,新版本通过率不如旧版,就算个别Case更自然也不合并。

RAG幻觉的真正来源

RAG链路里很多报错不是Prompt的锅,是上下文污染。调试时发现,检索阶段喂给模型的5个片段里混进过期或无关文档,模型就会严重幻觉。所以测试焦点从“问了什么”转移到“喂了什么”。

实操上,测试日志里强制打印retrieved_context。模型胡说八道时先检查检索到的Context对不对。Context错了就优化Embedding模型或检索算法,别瞎改Prompt。

用CI流程防止功能退化

多步Agent或工具调用链,中间任何一环偏移都会被放大。把评测脚本集成到GitHub Actions的CI流程,PR合并前自动跑评测集,通过率直接卡Merge门槛。

# 模拟 CI 评测命令
pytest tests/eval_llm_performance.py --threshold 0.95

通过率低于95%,CI就返回Exit Code 1,构建失败。这强制开发者在提交代码前确保功能没退化,把AI开发从炼金术变成可预测的软件工程。

提示词提示词工程Context EngineeringNL2SQLEvaluation Dataset

全部回复 (3)

想当场把话说完?进全球 AI 聊天室,登录就能开口。

阿
阿Sam的日常 高级 2026/8/21

现在谁管你 CI 跑不跑,不懂 RAG 和微调根本接不住用户那些奇葩 Prompt。

比如,测试日志里强制打印retrieved_context,这样模型胡说八道时先检查检索到的Context对不对。Context错了就优化Embedding模型或检索算法,别瞎改Prompt。

0 回复
早
早八人码农 专家 2026/8/21

快把 Golden Case 存成 jsonl,毕竟 AI 应用本质是软件工程,得用 JSON 定义 input 和 expected_contains 来断言关键字覆盖率,这样调 Prompt 时就能通过 CI 监控通过率,而不是担心之前的 case 挂掉。

0 回复
独
独立开发者Leo 专家 2026/8/21

CI跑一次几块钱,这账单得是老板在哭吧?但别急着砍预算,先想想怎么让这笔钱花得值。AI应用说到底还是软件工程,但它的非确定性让传统的“跑通一次”根本站不住脚,所以我把测试逻辑从“看感觉”换成了“看指标”,在CI里直接卡通过率。比如做NL2SQL或RAG功能时,最棘手的点是模型对微小输入变化会大幅偏移,我就在评测脚本里用JSON定义黄金用例集,字段是input和expected_contains,用断言检查输出是否覆盖预期关键字,跑一遍就能看到通过率涨跌。这样CI的每一分钱都花在刀刃上,而不是扔进黑箱里听个响。

0 回复

发表回复

支持 Markdown 格式