你是否遇到过这样的困境?你精心设计了一个AI工作流,但不确定它在各种场景下是否都能可靠地工作。生产环境中某些边界情况可能会导致意想不到的错误,而你却无从知晓。
n8n的评估(Evaluation)功能正是为了解决这个问题。它让你能够像测试代码一样测试AI工作流,通过数据集反复验证工作流的质量,从而建立对工作流性能的信心。
评估是通过运行测试数据集来检验AI工作流可靠性的技术。它的基础是准备多个测试用例,将输入数据输入工作流,然后检查输出结果。
传统代码是确定性的——给定相同的输入,总是返回相同的输出。但大语言模型(LLM)不同:
n8n提供了两种评估模式,适应工作流的不同阶段:
| 特性 | 轻量级评估(开发阶段) | 基于指标的评估(生产阶段) |
|---|---|---|
| 适用计划 | 社区版、付费版 | Pro/企业版 |
| 数据集规模 | 小(5-10个测试用例) | 大(数十到数百个测试用例) |
| 验证方式 | 视觉对比结果 | 自动计算数值指标(0-5分) |
| 何时使用 | 工作流开发迭代阶段 | 生产部署后持续监控 |
| 时间投入 | 低(快速查看结果) | 中等(设置指标计算) |
| 最佳场景 | 快速原型和优化 | 质量追踪和回归测试 |
用于开发阶段。你准备5-10个代表性的测试用例,一个一个运行通过工作流,手动查看输出结果,与预期结果进行视觉对比。这种方式快速、直观,适合快速迭代。
用于生产阶段。当你的数据集变大时(可能来自实际生产执行),手工检查每个结果变得不现实。此时,你可以定义一些自动评分指标(比如"输出类别是否与预期匹配"),让系统自动计算每个测试用例的得分。
轻量级评估是最容易入门的方式。让我们通过一个支持工单分类的例子来学习。
首先,创建一个包含测试用例的数据源。你可以使用:
在数据源中创建三列:
| ticket_text(输入) | expected_category(预期输出) | ai_response(实际输出 - 初始为空) |
|---|---|---|
| "我无法登录我的账户" | "Technical" | |
| "请更新我的计费地址" | "Billing" | |
| "我想要暗黑模式功能" | "Feature Request" | |
| "如何重置我的密码?" | "General Inquiry" |
重点:ai_response列初始时是空的。评估运行完毕后,n8n会自动填充这一列。
每次"Evaluate All"运行时,这个触发器会逐行输出数据集中的每一条数据。
{{ $json.ticket_text }}示例提示词:
你是一个支持工单分类专家。分析以下工单,并分配合适的类别。
工单内容:{{ $json.ticket_text }}
类别选项:Technical(技术问题)、Billing(计费问题)、Feature Request(功能请求)、General Inquiry(常见问题)
用JSON格式回复,包含"category"字段。ai_response列配置示例:
From Field: message(AI节点的输出字段)
To Field: ai_response(数据集中用于存储结果的列)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提供了几种预定义指标:
你也可以通过代码节点自定义指标:
// 自定义示例:评估文本长度是否在合理范围内
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%权重)指标结果示例:
数据集综合评分:
- 分类匹配准确率:0.92(92%)
- 平均响应有用性:4.3 / 5.0
- 字符串相似度:0.87
问题用例:
- 用例 #7:分类错误(标注为"Technical",实际预期为"Billing")
- 用例 #12:响应有用性较低(评分3/5)当你的工作流同时支持聊天界面和评估时,可能会出现问题——评估的最后节点输出与聊天期望的数据格式不符。
解决方案:创建一个额外的分支
如果你的工作流既有Evaluation Trigger,又有其他触发器(如Webhook、定时触发等),数据格式可能不一致。
解决方案:统一数据格式
某些AI基指标(如Correctness)需要调用LLM,这会增加成本和延迟。
解决方案:条件执行指标计算
LLM输出具有随机性,同样的输入可能在不同时间产生不同结果。这导致指标评分也会波动。
解决方案:增加测试用例重复
n8n每个工作流只能有一个Evaluation Trigger(即一个评估设置)。
解决方案:使用子工作流
这是一个可以直接导入n8n的完整工作流JSON,展示如何实现支持工单的轻量级评估。
工作流名称:Support Ticket Evaluation - Light Evaluation Example
功能:
{
"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"
}
}ticket_text:工单内容expected_category:预期类别expected_priority:预期优先级ai_response:AI回复(初始为空)ai_response列是否有了结果ai_response与expected_category和expected_priority✅ 评估是必需的:AI工作流无法通过代码推理验证,必须通过测试数据
✅ 从轻量开始:轻量级评估是快速迭代的好方式,无需复杂设置
✅ 逐步升级:当数据集增长时,升级到基于指标的评估以实现自动评分
✅ 持续改进:基于评估结果迭代改进你的提示词、模型选择和工作流逻辑
✅ 生产监控:部署后继续运行评估,及早发现新的边界用例
[1] 官方文档: https://docs.n8n.io/advanced-ai/evaluations/overview/
[2] n8n系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#