聊《一个测试项目改成 AI 流程后,最难的部分完全变了》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。
摘要
之前带过一个做AI客服项目的小团队,Demo阶段测得挺顺,模型回复流畅度也不错。结果一上生产环境,第三天就被打回三次。不是模型不聪明,是权限和日志这两个"不起眼"的地方没兜住。
这次复盘,想聊聊测试工程师怎么真正转入AI质量方向,顺便说说小团队怎么在资源有限的情况下,先把最关键的工程化动作做扎实。
目录
- 测试岗位的新变化
- 真实案例:RAG问答项目的评估体系
- 排查过程:为什么上线第一天崩了
- 关键代码解释
- 失败原因:三类错误的区分方法
- 适用边界
- 总结
测试岗位的新变化

过去做测试,核心能力是写用例、跑自动化、抓bug。现在大模型进来了,需求变了。
AI系统的输出是概率性的,同一个prompt可能每次返回不同答案。这意味着传统的"预期结果=实际结果"的比对逻辑失效了。你没法用固定断言去覆盖所有情况。
我观察到一个趋势:团队在招AI相关测试时,越来越看重两件事——能不能看懂模型输出的合理性,能不能搭建可观测的测试体系。前者偏业务判断,后者偏工程能力。
很多测试朋友卡在第二个环节。他们知道要做AI测试,但不知道从哪里下手,最后要么完全依赖人工review,要么堆了一堆工具却用不起来。
真实案例:RAG问答项目的评估体系

来聊一个具体场景。我接手过一个金融知识库问答项目,团队3个人,没有专职算法同学。模型用的开源Qwen2.5-7B,部署在本地GPU上。
测试目标是验证:用户问"xx产品的收益率是多少",模型能准确从知识库检索到对应文档并生成回答。
输入:100条历史用户问题 + 对应的标准答案
步骤:
1. 搭建RAG流水线(向量库+检索+生成)
2. 写Python脚本批量调用接口,收集输出
3. 用另一个小模型(GPT-4o-mini)做裁判,判断输出是否与标准答案一致
4. 记录每条case的耗时、检索来源、引用文档
可观察结果:
- 准确率从初始的62%提升到89%
- 发现3类高频错误:幻觉回答、引用了过期文档、检索范围过窄
- 平均响应时间从1.8s降到0.9s
这个案例里最有价值的不是提了多少分,而是建立了一套可重复的评估流程。后来换了模型、换了知识库,这套流程直接复用。
排查过程:为什么上线第一天崩了
回到开头那个翻车的项目。现象是:用户反馈"你们这个客服答非所问",但本地测试全绿。
排查链路如下:
第一步,复现问题。把线上错误case导出来,发现主要集中在两类:一是用户问到敏感词时模型直接拒绝回答;二是多轮对话后模型"忘记"了之前的上下文。
第二步,验证假设。先检查prompt配置,没发现问题。然后把日志打开,发现模型确实在第一轮输出了拒绝响应——但这是正常的权限拦截。真正的问题在多轮对话时,系统没有把之前的消息正确传给模型。
第三步,定位根因。查看代码后发现,对话历史是存在内存里的,而线上部署是多个Pod轮流处理请求,每个Pod的内存是独立的。用户第一轮的请求打到了Pod A,第二轮打到了Pod B,Pod B没有历史上下文。
排除结果:
- 不是模型能力问题(本地测试证明模型本身没问题)
- 不是prompt设计问题
- 是分布式部署下的状态管理问题,测试阶段根本没覆盖到这个场景
这个case给我最深的教训是:大模型项目的测试,不能只测模型本身,要测整个系统。权限控制、会话管理、日志追踪,这些工程细节往往比模型调优更容易出线上事故。

关键代码解释
上面提到的评估方案,核心实现是一个基于大模型的自动化裁判器。下面逐段拆解。
构造函数:
class LLMJudge:
def __init__(self, api_key: str, model: str = "gpt-4o-mini"):
self.client = openai.OpenAI(api_key=api_key)
self.model = model
这一步只做一件事:初始化OpenAI兼容的客户端,指定用哪个模型做裁判。默认用gpt-4o-mini是因为便宜、速度快,适合批量跑。如果预算充裕,换成gpt-4o准确率会更高,但成本也上去。
judge方法 - 输入:接收三个参数:question(用户问题)、ground_truth(标准答案)、model_output(模型生成结果)。这三个字段是评估的最小必要信息,缺一不可。
judge方法 - 核心逻辑:关键在prompt的构造。这里用了结构化prompt,要求输出JSON格式,包含三个字段:is_correct(布尔值)、reason(字符串,简要说明原因)、confidence(0-1之间的浮点数,表示置信度)。这种设计的好处是后续可以用程序解析,不需要再做额外NLP处理。temperature=0确保了输出的稳定性,不会因为随机性导致结果抖动。
judge方法 - 输出:返回一个字典,对应JSON解析后的结构。调用方可以直接用result["is_correct"]拿到判断结果,或者进一步用result["confidence"]做加权统计。
异常处理:最后一个关键点是try-except块。这里有一个现实问题:judge模型本身也可能失败,比如API超时、返回格式错误、网络中断等。如果让异常直接抛出去,整个评估流程会中断。所以这里选择了降级处理——返回默认值{"is_correct": False, "reason": f"judge error: {str(e)}", "confidence": 0}。这样即使某条case的裁判出错,其他case依然能正常跑完,只是那条数据会被标记为失败。
生产环境建议在异常分支加上日志记录,方便后续排查哪些case是因为judge自身问题导致的误判。
失败原因:三类错误的区分方法
这个翻车案例暴露了几个典型的失败原因,拆开来聊聊,方便以后踩坑时能快速定位。
常见错误类型一:业务逻辑错误
业务错误的特征是——模型行为符合预期,但业务规则没覆盖到。比如那个敏感词拒绝回答的案例,模型本身没问题,是权限策略配置错了。区分方法是:先看日志里模型有没有正常输出,如果模型输出了但被中间层拦截了,大概率是业务配置问题。
常见错误类型二:配置错误
配置错误是最隐蔽的一类。prompt写错了、温度参数调高了、context window设置小了,都会导致线上表现和本地测试不一致。区分方法是:对比本地和生产环境的配置差异,逐行diff。这个案例里多轮对话的历史丢失,本质上也是配置问题——会话状态应该存在Redis或数据库里,而不是内存。
常见错误类型三:环境问题
环境错误的典型表现是:本地一切正常,线上间歇性出问题。分布式部署、容器调度、网络延迟、资源争抢,都可能导致这个问题。区分方法是:复现问题的特征是否具有随机性,是否在特定节点或时间段集中爆发。Pod内存隔离导致的上下文丢失就是一个标准的环境错误——本地单机部署不存在这个问题,但K8s多副本部署下必然触发。
如何快速区分这三类
一个简单的排查口诀:先看日志确认模型是否正常响应(排除环境错误),再对比配置是否一致(排除配置错误),最后看业务规则是否覆盖(排除业务错误)。这个顺序不能乱,否则容易走弯路。
适用边界
任何方案都有它的limitations,搞清楚适用边界比学会怎么用更重要。
适用场景
这个"小模型生成+大模型裁判"的评估框架,最适合以下情况:
- 团队规模小(3-5人),没有专职算法同学
- 预算有限,无法承担大量GPT-4级别的API调用
- 需要快速验证模型效果,而不是追求极致准确率
- 有明确的标准答案可供比对(如知识库问答、FAQ场景)
限制条件
- 裁判模型的质量直接影响评估结果。如果用弱模型当裁判,可能出现"垃圾进垃圾出"的情况——裁判本身判断不准,评估就失去了意义。
- 需要标准答案。如果是开放域生成任务(如创意写作、代码生成),没有ground truth,这个方法就不适用了。
- 延迟敏感的场景不适合批量评估。每条case都要调一次API,100条就是100次调用,累积延迟不可忽略。
取舍建议
如果你团队有GPU资源且愿意投入,可以考虑自部署一个小模型作为裁判,成本会低一个数量级,但需要维护推理服务。如果你追求评估结果的准确性且预算充足,直接用GPT-4或Claude当裁判更省心。
什么时候不应照搬
以下情况不建议直接套用这个方案:
- 模型输出是连续值或概率分布(如排序、打分),而不是离散的正确/错误
- 评估标准本身存在主观争议,不同人打分不一致
- 需要实时评估(如线上A/B测试),批量离线评估无法满足时效性
- 知识库本身质量差,标准答案就不准确,评估结果会误导优化方向
总结
从Demo到生产,中间隔着一整套工程化能力。权限、日志、会话管理、分布式部署,这些看似和模型无关的细节,往往才是上线翻车的真正元凶。
测试转型AI质量,关键不是学多少新概念,而是把已有的工程能力迁移过来,同时在概率性输出、可观测性、自动化评估这些新领域补齐短板。用真实的case练手,用可复用的流程沉淀,比追热点更有价值。
资料展示
下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。



需要这份AI大模型资料清单的话,在评论区回复「清单」即可;我会根据大家的问题继续补充对应的实战内容。

438



被折叠的 条评论
为什么被折叠?



