
智能工作流效果评估要看真实任务只抽查少量简单工单无法代表模型在高风险类别上的表现。例如“退款失败且超时”这类复杂工单应单独分层评估。若样本只覆盖简单问答即使整体观感良好也可能掩盖关键类别的错误比例需以标注集测得。传统软件测试有单元测试覆盖率、集成测试断言但到了 AI 工作流许多团队却倒退回了“凭感觉试几句”的原始状态。1. 感觉良好不等于业务正确一次传统工单 AI 化的上线事故那次事故的根本原因在于传统业务工作流对“确定性”有着近乎苛刻的要求。工单系统涉及到退费、赔付、权限变更与用户维权每一条分支都有明确的合规红线。传统代码通过if...else构筑防线测试人员可以通过覆盖分支路径来确保无死角。而 LLM 接入后原本清晰的分支逻辑被打包成了一段模糊的 Prompt。大模型在理解上下文时极易受到无关语境的干扰。例如用户在抱怨中加了一句“以前都能退”LLM 就可能误以为该订单满足例外退款条件。少量抽查难以覆盖退款、赔付、权限变更等风险不同的路径。评估集要说明来源、分层方式和覆盖范围并持续补充线上发现的失败案例。如果不能把 AI 工作流的效果评估量化、自动化AI 赋能就只能是一句空话。2. 重新定义 AI 测试分层静态单测、集成 Hook 与端到端评估要守住业务底线必须把测试拆解为三个互不相干的层级第一层Prompt 模板单元测试L1 Unit Test这一层不需要真实调用大模型。它的目标是验证 Prompt 模板渲染逻辑。比如动态注入的用户历史记录、订单状态、权限列表是否被正确转义是否存在格式破裂是否存在动态变量为 nil 时的穿透问题第二层Tool Calling 结构集成测试L2 Integration Test这一层通过 Mock LLM 返回各种边界 Response重点测试业务系统在收到 AI 的工具调用指令后能否正确校验参数、拦截越权操作并返回预期的业务错误码。第三层端到端语义基准评测L3 E2E Evaluation这一层使用固定的基准数据集Benchmark Dataset定期或在每次 Prompt 修改后触发。通过 Embedding 向量相似度、关键词匹配度以及确定性规则断言计算整体的分类准确率、召回率与红线违规率。3. 自动化 Evaluation 流水线用数据集代替人工刷屏可以将经脱敏、审核后的历史纠纷和边缘工单整理为固定测试集并按风险类型分层。每一个 Case 包含三部分输入上下文原始工单文本、用户画像、订单元数据。期望工具调用必须触发的 API 及其参数边界如trigger_refund的 amount 必须 100。安全禁区绝对不能出现的关键词或动作如对未完成订单执行删除。每次修改提示词或模型版本时自动化流水线应运行固定测试集。高风险违规应直接阻断发布其他指标的门槛则应依据历史基线和业务成本设定。不再需要有人在界面上手动打字测试也不再需要凭感觉猜测“模型是不是变聪明了”。4. Go 语言实现 AI 工作流测试断言框架下面是使用 Go 语言实现的 L2/L3 层自动化测试与断言组件。它通过确定性规则与向量相似度计算对 LLM 输出的工具调用与语义回复进行严格门禁拦截。package evaluation import ( context fmt math strings ) // TestCase 定义标准评估用例 type TestCase struct { ID string json:id InputContext string json:input_context ExpectedTool string json:expected_tool ForbiddenTerms []string json:forbidden_terms MinScore float64 json:min_score } // EvaluationResult 评估结果 type EvaluationResult struct { TestCaseID string json:test_case_id Passed bool json:passed Score float64 json:score Reason string json:reason } // Evaluator AI 效果评估引擎 type Evaluator struct { vectorProvider VectorProvider } type VectorProvider interface { GetEmbedding(ctx context.Context, text string) ([]float32, error) } func NewEvaluator(vp VectorProvider) *Evaluator { return Evaluator{vectorProvider: vp} } // CosineSimilarity 计算向量余弦相似度 func CosineSimilarity(a, b []float32) float64 { if len(a) ! len(b) || len(a) 0 { return 0.0 } var dotProduct, normA, normB float64 for i : 0; i len(a); i { dotProduct float64(a[i]) * float64(b[i]) normA float64(a[i]) * float64(a[i]) normB float64(b[i]) * float64(b[i]) } if normA 0 || normB 0 { return 0.0 } return dotProduct / (math.Sqrt(normA) * math.Sqrt(normB)) } // EvaluateOutput 评估单次 LLM 输出 func (e *Evaluator) EvaluateOutput(ctx context.Context, tc TestCase, actualOutput string, actualTool string) EvaluationResult { // 1. 检查安全红线禁词过滤 for _, term : range tc.ForbiddenTerms { if strings.Contains(actualOutput, term) { return EvaluationResult{ TestCaseID: tc.ID, Passed: false, Score: 0.0, Reason: fmt.Sprintf(触发红线违规包含敏感禁词 %s, term), } } } // 2. 检查结构性工具调用契约 if tc.ExpectedTool ! actualTool ! tc.ExpectedTool { return EvaluationResult{ TestCaseID: tc.ID, Passed: false, Score: 0.0, Reason: fmt.Sprintf(工具调用不匹配期望 %s实际触发 %s, tc.ExpectedTool, actualTool), } } // 3. 语义相似度软评估 if e.vectorProvider ! nil { vecExpected, err1 : e.vectorProvider.GetEmbedding(ctx, tc.InputContext) vecActual, err2 : e.vectorProvider.GetEmbedding(ctx, actualOutput) if err1 nil err2 nil { score : CosineSimilarity(vecExpected, vecActual) if score tc.MinScore { return EvaluationResult{ TestCaseID: tc.ID, Passed: false, Score: score, Reason: fmt.Sprintf(语义相似度不达标得分 %.2f 阈值 %.2f, score, tc.MinScore), } } return EvaluationResult{ TestCaseID: tc.ID, Passed: true, Score: score, Reason: 评估通过, } } } return EvaluationResult{ TestCaseID: tc.ID, Passed: true, Score: 1.0, Reason: 确定性规则拦截通过, } }5. 持续回归集治理把业务误判 Case 自动沉淀为 Regression Test构建评估体系最忌讳的是“一劳永逸”的心态。业务场景在变用户的提问方式也在变。我们在生产环境中建立了一套反馈闭环机制当人工客服接入并纠正了 AI 智能体的处置决策时该工单的完整上下文、AI 的错误输出以及人工的正确处理结果会被自动打标签并脱敏推送到测试集的“待审核队列”。每周一早晨测试负责人只需审核并确认这些新增的错误 Case一键合入主干回归测试集。通过这种方式测试集变成了一个动态生长的知识库。下一次 Prompt 调整时系统绝不会在同一个石头上摔倒两次。用工程化的测试分层代替主观试用AI 赋能传统业务才能真正从“演示 PPT”走向硬核的生产交付。