2026-10-02 · 原文发布日
练习排查AI代理工具调用的“假成功”问题
这是n8n生产级AI手册“审计与追踪”章节的配套练习模板,免费:一个客服代理接入OpenRouter模型,配有计算器和模拟订单查询两个工具。重点在第三种测试——查询不存在的订单时工具返回空字符串却照常报成功,代理可能据此编造回复。模板引导你POST三种query对比工具日志与最终答复,可开启OpenTelemetry看每次工具调用的span,并建议把空返回改成明确的“未找到订单”提示。
原文要点
该模板由Elvis Sarvia发布在n8n官方模板库(工作流20346),免费,日期2026-10-02,是n8n生产级AI手册“审计与追踪”章节的练习4。核心事实:通过POST webhook接收自然语言query;Support Agent是一个用OpenRouter聊天模型的AI Agent,自行决定是否调用工具;Calculator Tool处理算术(如47乘89);Order Lookup Tool返回模拟订单记录,订单不存在时返回空字符串却仍报成功;Respond节点把答复返回给调用方。练习要求依次POST三种query,对比工具日志与最终答复找出空查询;可在Settings > OpenTelemetry开启追踪看到每次工具调用的span;建议把空返回改成明确的“未找到订单”提示。订单数据为合成数据。
这次做成什么
完成一次“假成功”排查练习:让客服代理分别处理算术、命中订单、空订单三类请求,观察空字符串仍报成功时代理如何编造答复,再修改工具让它明确返回“未找到订单”并复测。原模板需在n8n.io免费获取,下方测试负载与修复代码为本站独立编写或按作者建议改写。
准备什么
- n8n Cloud账号或自托管n8n实例
- OpenRouter API密钥,且所选模型支持工具调用(tool calling)
- 能向n8n webhook发POST请求的工具,如curl或Postman
具体怎么做
导入模板并绑定OpenRouter凭据
打开n8n.io/workflows/20346免费导入。在OpenRouter - Agent节点绑定OpenRouter API凭据;如更换模型,确认该模型支持工具调用,否则Agent不会调用Calculator和Order Lookup。可选:在Settings > OpenTelemetry开启追踪,之后每次工具调用都有独立span。
跑第一种请求:纯计算
点击Execute workflow,向Webhook Test URL发送POST {"query":"What is 47 times 89?"}。在执行日志里确认Calculator Tool被调用,返回4183,最终答复与工具结果一致。这一步建立“工具正常”的基线。
跑第二种请求:命中订单
发送POST {"query":"How much was order ORD-1001? Use the order lookup."}。确认Order Lookup Tool返回了合成订单记录(含金额),答复中的金额与工具返回一致。记录这个金额作为对照。
跑第三种请求:空订单的假成功
发送POST {"query":"How much was order ORD-8888? Tell the customer the amount."}。ORD-8888不在模拟数据里,工具返回空字符串但节点显示成功。重点观察:Agent是否在没有数据的情况下编造了一个金额或含糊其辞。把工具日志的空返回与最终答复并排截图对比,这就是本练习要定位的问题。
修改工具并复测
按作者建议修改Order Lookup Tool:查不到订单时不要返回空字符串,返回明确文字如"No order found for order ORD-8888"。下方材料给出n8n Code节点的改写示例。保存后重发第三种请求,确认Agent这次如实告知订单不存在而不是编数字。
可直接复制的材料
三种测试POST负载
与作者练习一致的三条负载,逐行发送到Webhook Test URL;ORD-1001为模拟数据中的订单,ORD-8888为不存在的订单。
{"query":"What is 47 times 89?"}
{"query":"How much was order ORD-1001? Use the order lookup."}
{"query":"How much was order ORD-8888? Tell the customer the amount."}模拟订单数据(练习用)
本站虚构订单,仅当原模板内嵌数据不可见时用于理解结构;优先以导入模板内的合成数据为准。
[
{"order_id":"ORD-1001","customer":"Demo Customer A","amount":129.50,"currency":"USD","status":"shipped"},
{"order_id":"ORD-1002","customer":"Demo Customer B","amount":58.00,"currency":"USD","status":"processing"}
]订单查询工具修复示例(n8n Code节点JS)
本站按作者建议独立撰写的示例:查不到时返回明确文字而非空字符串。请与原模板内Order Lookup Tool的实际实现对照后改写,不要直接覆盖未备份的节点。
const orders = [
{ order_id: "ORD-1001", amount: 129.5, currency: "USD" },
{ order_id: "ORD-1002", amount: 58.0, currency: "USD" }
];
const id = ($json.order_id || "").trim().toUpperCase();
const hit = orders.find(o => o.order_id === id);
if (!hit) {
return [{ json: { result: `No order found for order ${id || "(missing id)"}` } }];
}
return [{ json: { result: `Order ${hit.order_id}: ${hit.currency} ${hit.amount}` } }];输入与输出示例
本站虚构演示,用于说明预期差异,并非对模板的真实运行记录。
输入
POST {"query":"How much was order ORD-8888? Tell the customer the amount."},ORD-8888不在模拟订单数据中。对应输出
修复前:工具日志显示Order Lookup返回空字符串但执行状态为成功,Agent答复可能写成“订单ORD-8888的金额为99.99美元”这类编造内容。
修复后:工具返回"No order found for order ORD-8888",Agent答复“抱歉,我们没有找到订单ORD-8888,请核对订单号后重试”。做完检查这些
- 47×89的请求由Calculator处理且答复为4183,与工具结果一致
- ORD-1001请求答复中的金额与Order Lookup返回的模拟记录一致
- ORD-8888请求在修复前能观察到工具空返回但节点报成功的日志证据
- 修复后重发ORD-8888,答复明确说订单不存在且不再出现编造金额
容易卡住的地方
- 模型不支持工具调用时Agent会直接回答而不调工具,练习无法进行,先确认OpenRouter所选模型能力
- 自托管n8n默认未开OpenTelemetry,需要在设置里启用后才能看到工具调用span
- 测试webhook URL只在监听状态有效,执行窗口关闭后POST会404
- 修复代码若仍返回空字符串或null,Agent仍可能编造,必须返回可读的自然语言文字
- 不同模型对空结果的反应不同,有的会直接说查不到,练习重点是看日志而非只看答复
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Debug AI agent tool calls with OpenRouter, calculator and webhook
- 原作者
- Elvis Sarvia
- 原始发布日期
- 2026-10-02T15:21:18.130Z
- 来源
- https://n8n.io/workflows/20346