你是否遇到过这样的困境?你精心设计了一个AI工作流,但不确定它在各种场景下是否都能可靠地工作。生产环境中某些边界情况可能会导致意想不到的错误,而你却无从知晓。
n8n的评估(Evaluation)功能正是为了解决这个问题。它让你能够像测试代码一样测试AI工作流,通过数据集反复验证工作流的质量,从而建立对工作流性能的信心。
点击获取最新AI资讯、n8n工作流、开发经验分享
核心概念
评估是通过运行测试数据集来检验AI工作流可靠性的技术。它的基础是准备多个测试用例,将输入数据输入工作流,然后检查输出结果。
为什么AI工作流需要评估?
传统代码是确定性的——给定相同的输入,总是返回相同的输出。但大语言模型(LLM)不同:
- LLM是“黑盒子”:你无法通过代码推理来理解它的行为
- 输出可能不稳定:相同的提示在不同时刻可能产生不同结果
- 需要通过测试来验证:唯一的方式是运行数据通过工作流,观察实际输出
评估能为你做什么?
- ✅ 测试多种输入场景:验证工作流在边界情况和异常情况下的表现
- ✅ 放心进行改进:修改提示或模型时,用整个数据集回归测试,确保改进没有破坏其他部分
- ✅ 对比不同方案:轻松比较不同AI模型或提示词的性能差异
n8n提供了两种评估模式,适应工作流的不同阶段:
轻量级评估
用于开发阶段。你准备5-10个代表性的测试用例,一个一个运行通过工作流,手动查看输出结果,与预期结果进行视觉对比。这种方式快速、直观,适合快速迭代。
基于指标的评估
用于生产阶段。当你的数据集变大时(可能来自实际生产执行),手工检查每个结果变得不现实。此时,你可以定义一些自动评分指标(比如”输出类别是否与预期匹配”),让系统自动计算每个测试用例的得分。
轻量级评估是最容易入门的方式。让我们通过一个支持工单分类的例子来学习。
第一步:准备测试数据集
首先,创建一个包含测试用例的数据源。你可以使用:
- n8n的数据表格(Data Table)
- Google Sheets
在数据源中创建三列:
重点:ai_response列初始时是空的。评估运行完毕后,n8n会自动填充这一列。
第二步:在工作流中插入评估触发器
- 打开你的n8n工作流编辑器
- 在工作流中添加一个“Evaluation Trigger”节点
- 配置数据源:
- 选择数据表或Google Sheets
- 指定包含测试数据的范围
每次”Evaluate All”运行时,这个触发器会逐行输出数据集中的每一条数据。
第三步:连接你的AI工作流逻辑
- 从Evaluation Trigger连接到你的AI节点(比如OpenAI Chat、Gemini等)
- 使用表达式引用输入数据:
{{ $json.ticket_text }} - 确保AI节点能接收并处理这个输入
示例提示词:
你是一个支持工单分类专家。分析以下工单,并分配合适的类别。
工单内容:{{ $json.ticket_text }}
类别选项:Technical(技术问题)、Billing(计费问题)、Feature Request(功能请求)、General Inquiry(常见问题)
用JSON格式回复,包含“category”字段。
第四步:将输出写回数据集
- 在AI节点后添加“Set Outputs”节点(Evaluation操作)
- 配置映射关系:将AI节点的输出映射到数据集的
ai_response列 - 这样,每个测试用例的结果都会被记录下来
配置示例:
From Field: message(AI节点的输出字段) To Field: ai_response(数据集中用于存储结果的列)
第五步:运行评估并查看结果
- 点击Evaluation Trigger节点旁边的“Evaluate All”按钮
- n8n会依次运行每个测试用例,并将结果写入数据集
- 打开数据集(数据表或Google Sheets),查看
ai_response列是否有了结果 - 手动对比每个结果与
expected_category,看是否符合预期
示例结果:
ticket_text: “我无法登录我的账户” expected_category: “Technical” ai_response: {“category”: “Technical”} ✅ 正确
ticket_text: “请更新我的计费地址” expected_category: “Billing” ai_response: {“category”: “Billing”} ✅ 正确
当你的数据集成长为数十甚至数百个测试用例时,手工检查变得不可行。此时,使用指标来自动评分就显得尤为重要。
第一步:基于轻量级评估进行设置
首先完成轻量级评估的所有步骤。基于指标的评估建立在它的基础之上。
第二步:添加指标计算
在”Set Outputs”节点之后,添加一个“Set Metrics”节点(Evaluation操作)。
n8n提供了几种预定义指标:
1. 正确性(Correctness)- 基于AI
- 检查AI输出的含义是否与参考输出一致
- 返回1-5的评分(5最好)
- 适用于:答案的准确性评估
2. 有用性(Helpfulness)- 基于AI
- 评估响应是否有效回答了问题
- 返回1-5的评分
- 适用于:文本生成、摘要质量
3. 字符串相似度(String Similarity)
- 计算输出与参考输出的相似程度(编辑距离)
- 返回0-1的分数
- 适用于:精确匹配度高的场景
4. 分类匹配(Categorization)
- 检查输出类别是否与参考完全匹配
- 返回0(不匹配)或1(匹配)
- 适用于:分类任务、是/否判断
5. 工具使用(Tools Used)
- 判断工作流是否使用了特定工具
- 返回0-1的分数
- 适用于:Agent工作流评估
自定义指标
你也可以通过代码节点自定义指标:
// 自定义示例:评估文本长度是否在合理范围内 const responseLength = $json.ai_response.length; return { length_in_range: responseLength > 50 && responseLength < 500 ? 1 : 0, confidencescore: ”>Math.min(responseLength / 500, 1) };
第三步:配置指标
在”Set Metrics”节点中:
- 选择要使用的指标类型
- 指定参考输出的字段(如果需要)
- 配置指标名称和权重
配置示例(支持工单分类):
指标1:分类匹配 - 比较字段:ai_response.category
- 参考字段:expected_category - 权重:0.7(70%权重)
指标2:自定义 - 响应时间 - 检查是否在规定时间内完成 - 权重:0.3(30%权重)
第四步:运行评估并分析结果
- 在评估标签页点击“Run Evaluation”
- n8n自动运行所有测试用例,计算所有指标
- 查看汇总分数:整个数据集的平均指标值
- 点击具体测试用例,查看详细执行日志
指标结果示例:
数据集综合评分: - 分类匹配准确率:0.92(92%) - 平均响应有用性:4.3 / 5.0 - 字符串相似度:0.87
问题用例: - 用例 #7:分类错误(标注为”Technical”,实际预期为”Billing”) - 用例 #12:响应有用性较低(评分3/5)
问题1:评估与聊天功能冲突
当你的工作流同时支持聊天界面和评估时,可能会出现问题——评估的最后节点输出与聊天期望的数据格式不符。
解决方案:创建一个额外的分支
- 在”Set Outputs”评估节点后,添加一个分支
- 使用No-op节点将聊天节点的原始输出通过
- 确保No-op节点在所有其他节点之后执行(通过布局调整)
问题2:多个触发器的数据格式不一致
如果你的工作流既有Evaluation Trigger,又有其他触发器(如Webhook、定时触发等),数据格式可能不一致。
解决方案:统一数据格式
- 获取其他触发器的JSON格式
- 在Evaluation Trigger后添加一个Edit Fields (Set)节点
- 用JSON模式重新整形数据,使其与其他触发器一致
问题3:指标计算引入延迟和成本
某些AI基指标(如Correctness)需要调用LLM,这会增加成本和延迟。
解决方案:条件执行指标计算
- 在指标计算前添加“Check if evaluating”操作
- 仅在评估模式下执行指标计算
- 生产执行时跳过指标计算,减少成本
问题4:评估结果不稳定,波动较大
LLM输出具有随机性,同样的输入可能在不同时间产生不同结果。这导致指标评分也会波动。
解决方案:增加测试用例重复
- 在数据集中复制某些测试行,使每个测试案例出现多次
- 这样多次运行同一输入时会平滑噪声
- 最终的平均分数会更稳定和可靠
问题5:单工作流限制
n8n每个工作流只能有一个Evaluation Trigger(即一个评估设置)。
解决方案:使用子工作流
- 将工作流的不同部分提取为独立的子工作流
- 在子工作流上分别设置评估
- 在主工作流中调用这些子工作流
这是一个可以直接导入n8n的完整工作流JSON,展示如何实现支持工单的轻量级评估。
工作流结构
工作流名称:Support Ticket Evaluation - Light Evaluation Example
功能:
- 从Google Sheets读取支持工单数据
- 使用OpenAI GPT分类工单(类别和优先级)
- 将分类结果写回Google Sheets
- 可视化对比预期结果和实际结果
工作流JSON代码
{ “name”: “Support Ticket Evaluation - Light Evaluation Example”, “description”: “这是一个演示如何使用 n8n light evaluation 的简单支持票证分类工作流”, “nodes”: [
{ "parameters": { "dataSource": "googleSheets", "sheetId": "YOUR_SHEET_ID", "documentId": "YOUR_DOCUMENT_ID", "range": "Sheet1" }, "id": "evaluation-trigger", "name": "Evaluation Trigger", "type": "n8n-nodes-base.evaluationTrigger", "typeVersion": 1, "position": [250, 300] }, }
Respond in JSON format with ‘category’ and ‘priority’ fields.”
}, "model": "gpt-4-mini", "options": {} }, { "id": "openai-chat", "name": "OpenAI Chat", "type": "n8n-nodes-base.openaiChat", "typeVersion": 3, "position": [450, 300], "credentials": { "openAIApi": "openAI_API" } }, ] } }, "id": "set-outputs", "name": "Set Outputs", "type": "n8n-nodes-base.evaluationSetOutputs", "typeVersion": 1, "position": [650, 300] }
], “connections”: {
"evaluation-trigger": [ { "node": "openai-chat", "type": "main", "index": 0 } ], "openai-chat": [ ]
}, “active”: false, “settings”: {
"saveDataErrorExecution": "all", "saveDataSuccessExecution": "all"
} }
使用步骤
- 准备Google Sheet
- 创建一个包含以下列的Google Sheet:
ticket_text:工单内容expected_category:预期类别expected_priority:预期优先级ai_response:AI回复(初始为空)
- 创建一个包含以下列的Google Sheet:
- 导入工作流
- 在n8n中点击”Import from URL”或”Import from File”
- 粘贴上面的JSON
- 点击”Import”
- 配置凭证
- 点击OpenAI Chat节点,配置你的OpenAI API密钥
- 配置Google Sheets凭证(需要授权访问你的Google账户)
- 配置数据源
- 点击Evaluation Trigger节点
- 在参数中填入你的Google Sheet ID和Document ID
- 指定数据范围(如”Sheet1!A1:D100”)
- 运行评估
- 点击Evaluation Trigger旁的”Execute node”测试单个记录
- 确认工作正常后,点击”Evaluate All”运行所有测试用例
- 打开Google Sheet查看
ai_response列是否有了结果
- 分析结果
- 对比
ai_response与expected_category和expected_priority - 识别分类错误的用例
- 调整提示词或模型参数,重新运行评估
- 对比
优化建议
- 提示词调优:如果准确率低于80%,尝试改进提示词的清晰度
- 模型选择:考虑升级到GPT-4以获得更高准确率
- 数据扩展:随着时间推移,不断向数据集添加边界用例
- 指标升级:一旦稳定,升级到基于指标的评估以获得自动评分
✅ 评估是必需的:AI工作流无法通过代码推理验证,必须通过测试数据
✅ 从轻量开始:轻量级评估是快速迭代的好方式,无需复杂设置
✅ 逐步升级:当数据集增长时,升级到基于指标的评估以实现自动评分
✅ 持续改进:基于评估结果迭代改进你的提示词、模型选择和工作流逻辑
✅ 生产监控:部署后继续运行评估,及早发现新的边界用例
官方文档
n8n系列教程
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/273825.html