【n8n教程】:掌握工作流评估(Evaluation),让你的AI自动化更可靠
你是否遇到过这样的困境?你精心设计了一个AI工作流,但不确定它在各种场景下是否都能可靠地工作。生产环境中某些边界情况可能会导致意想不到的错误,而你却无从知晓。
n8n的评估(Evaluation)功能正是为了解决这个问题。它让你能够像测试代码一样测试AI工作流,通过数据集反复验证工作流的质量,从而建立对工作流性能的信心。
点击获取最新AI资讯、n8n工作流、开发经验分享
🎯 评估是什么?为什么需要它?
核心概念
评估是通过运行测试数据集来检验AI工作流可靠性的技术。它的基础是准备多个测试用例,将输入数据输入工作流,然后检查输出结果。
为什么AI工作流需要评估?
传统代码是确定性的——给定相同的输入,总是返回相同的输出。但大语言模型(LLM)不同:
- LLM是**“黑盒子”**:你无法通过代码推理来理解它的行为
- 输出可能不稳定:相同的提示在不同时刻可能产生不同结果
- 需要通过测试来验证:唯一的方式是运行数据通过工作流,观察实际输出
评估能为你做什么?
- ✅ 测试多种输入场景:验证工作流在边界情况和异常情况下的表现
- ✅ 放心进行改进:修改提示或模型时,用整个数据集回归测试,确保改进没有破坏其他部分
- ✅ 对比不同方案:轻松比较不同AI模型或提示词的性能差异
📊 两种评估模式对比
n8n提供了两种评估模式,适应工作流的不同阶段:
| 特性 | 轻量级评估(开发阶段) | 基于指标的评估(生产阶段) |
|---|---|---|
| 适用计划 | 社区版、付费版 | Pro/企业版 |
| 数据集规模 | 小(5-10个测试用例) | 大(数十到数百个测试用例) |
| 验证方式 | 视觉对比结果 | 自动计算数值指标(0-5分) |
| 何时使用 | 工作流开发迭代阶段 | 生产部署后持续监控 |
| 时间投入 | 低(快速查看结果) | 中等(设置指标计算) |
| 最佳场景 | 快速原型和优化 | 质量追踪和回归测试 |
轻量级评估
用于开发阶段。你准备5-10个代表性的测试用例,一个一个运行通过工作流,手动查看输出结果,与预期结果进行视觉对比。这种方式快速、直观,适合快速迭代。
基于指标的评估
用于生产阶段。当你的数据集变大时(可能来自实际生产执行),手工检查每个结果变得不现实。此时,你可以定义一些自动评分指标(比如"输出类别是否与预期匹配"),让系统自动计算每个测试用例的得分。
🚀 轻量级评估:快速上手指南
轻量级评估是最容易入门的方式。让我们通过一个支持工单分类的例子来学习。
第一步:准备测试数据集
首先,创建一个包含测试用例的数据源。你可以使用:
- n8n的数据表格(Data Table)
- Google Sheets
在数据源中创建三列:
| ticket_text(输入) | expected_category(预期输出) | ai_response(实际输出 - 初始为空) |
|---|---|---|
| “我无法登录我的账户” | “Technical” | |
| “请更新我的计费地址” | “Billing” | |
| “我想要暗黑模式功能” | “Feature Request” | |
| “如何重置我的密码?” | “General Inquiry” |
重点: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,
confidence_score: 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]
},
{
"parameters": {
"text": "=You are a support ticket classification expert. Analyze the following support ticket and assign:\n1. A category: Billing, Technical, Feature Request, or General Inquiry\n2. A priority: Low, Medium, or High\n\nTicket: {{ $json.ticket_text }}\n\nRespond 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"
}
},
{
"parameters": {
"operation": "setOutputs",
"outputs": {
"mappings": [
{
"fromField": "message",
"toField": "ai_response"
}
]
}
},
"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": [
{
"node": "set-outputs",
"type": "main",
"index": 0
}
]
},
"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工作流无法通过代码推理验证,必须通过测试数据
✅ 从轻量开始:轻量级评估是快速迭代的好方式,无需复杂设置
✅ 逐步升级:当数据集增长时,升级到基于指标的评估以实现自动评分
✅ 持续改进:基于评估结果迭代改进你的提示词、模型选择和工作流逻辑
✅ 生产监控:部署后继续运行评估,及早发现新的边界用例
616

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



