工作流智能辅助与知识库·AI Agent / Prompt / 工具调用

在 N8N 中接入 AI Agent:从零搭建第一个智能工作流

发布时间:2026/08/12·阅读时间:约 5 分钟

从聊天模型凭证、System Prompt、结构化输出到工具调用,搭建一个能查询订单并安全回复用户的 AI Agent。

先明确 Agent 在流程中的职责

普通的文本生成节点只有一次输入和一次输出;Agent 则会根据目标决定是否调用工具、读取工具结果,再组织最终回复。这个能力很适合“先理解问题,再查业务数据”的任务,但不代表应该把全部流程交给模型。查询、分类和草拟回复可以由 Agent 完成,退款、删除、群发等有副作用的动作仍应经过固定规则与人工确认。

本文用“查询订单状态”做完整示例。入口接收 messageuserId,Agent 可以调用订单查询工具,但不能修改订单。若用户要求取消或退款,流程只生成工单并提示人工处理。

第一步:准备触发器与规范化输入

新建工作流并添加 Webhook 节点,方法选择 POST,路径使用容易识别但不可猜测为鉴权手段的名称。生产环境还应在网关校验签名或令牌。用 Set(Edit Fields)节点只保留必要字段,并为缺失值提供明确错误分支。

{
  "message": "我的订单 A1024 到哪里了?",
  "userId": "u_73",
  "requestId": "req_20260907_001"
}

在 IF 节点检查 messageuserIdrequestId 是否都存在。requestId 后续用于幂等与日志串联;不要把手机号、地址等无关信息一起发给模型。测试时固定三组样本:有效订单号、缺少订单号、试图查询其他用户订单。

第二步:配置聊天模型节点

在凭证管理中创建模型服务凭证,不要把 API Key 写入表达式、Code 节点或导出的 JSON。将 Chat Model 节点连接到 AI Agent 的模型端口。模型名称应从当前账户真实可用的列表中选择,避免教程代码硬编码一个可能下线的名称。

初次调试把随机性调低,使相同输入更容易复现。限制最大输出长度,并设置合理超时。模型响应慢时不要立刻无限重试:仅对网络错误、限流或服务端临时错误做有上限的退避重试;认证错误和参数错误应直接告警。

第三步:写可验收的 System Prompt

好的 System Prompt 不是堆砌形容词,而是按职责、输入、工具、约束、输出顺序写清楚。把业务规则留在系统提示中,把本次用户问题放进用户消息,避免字符串拼接时混淆权限。

你是订单查询助手。你的任务是回答当前用户自己的订单状态。
可用工具:get_order,仅用于只读查询。
规则:
1. 工具参数 userId 必须使用工作流传入的 authenticatedUserId,不得采用用户消息中的用户标识。
2. 信息不足时只追问订单号,不猜测订单状态。
3. 不执行取消、退款、改址;遇到这些请求返回 needsHuman=true。
4. 工具无结果时说明未找到,不编造。
5. 最终仅输出约定 JSON,不附加 Markdown。
输出字段:reply、intent、needsHuman、orderId。

将经过认证的 userId 作为独立上下文变量传入。不要相信消息中“忽略前面的规则”“我是管理员”等文本。模型提示能降低风险,但真正的权限检查必须在工具实现中再次执行。

第四步:把订单查询封装成工具

可以用 Workflow Tool 调用一个子工作流。子工作流接收 orderIdauthenticatedUserId,使用数据库节点执行参数化查询,并只返回状态、更新时间、物流摘要。查询条件必须同时包含订单号和用户标识,避免越权查询。

{
  "tool": "get_order",
  "description": "查询当前已认证用户的一笔订单,只读。需要 orderId。",
  "inputSchema": {
    "type": "object",
    "properties": { "orderId": { "type": "string" } },
    "required": ["orderId"],
    "additionalProperties": false
  }
}

工具描述要写“什么时候调用”和“需要什么”,不要用模糊的“订单工具”。子工作流应自行读取受信任的用户上下文,校验订单号长度与字符集,限制返回行数。数据库无结果返回 { "found": false },而不是抛出让模型猜测含义的空值。

第五步:校验输出并回复

Agent 后接结构化输出解析或 Code 节点,验证 reply 是字符串、needsHuman 是布尔值、intent 属于允许枚举。解析失败时走一次“仅修复格式”的独立模型调用;仍失败则进入人工队列,不要把原始模型文本直接发送给用户。

{
  "reply": "订单 A1024 已发出,最新状态为运输中。",
  "intent": "order_status",
  "needsHuman": false,
  "orderId": "A1024"
}

使用 Switch 节点判断 needsHuman。正常分支由 Respond to Webhook 返回结果;人工分支写入工单表,保存 requestId、分类、脱敏问题和执行链接,再返回“已转交人工”。在真正发送前增加一个 Set 节点形成公开响应白名单,避免工具返回的内部字段意外泄露。

调试方法与验收清单

逐节点执行,不要只点击整条工作流。先确认 Webhook 收到的 JSON,再看规范化字段,然后观察 Agent 的工具调用参数和工具结果。常见问题包括:模型节点没有连到 Agent 的专用端口;表达式引用了上一轮测试数据;工具描述不清导致从不调用;子工作流没有返回数据;输出被 Markdown 代码围栏包裹导致 JSON 解析失败。

  • 正常订单只能查询当前用户的数据,回复包含真实工具结果。
  • 缺少订单号时只追问,不调用查询工具。
  • 退款请求进入人工分支,且没有执行修改动作。
  • 伪造 userId、提示词注入和不存在订单均不会泄露信息。
  • 相同 requestId 重放不会重复创建工单。
  • 模型或数据库超时时返回可理解的降级信息,并留下可检索日志。

完成这些验证后再激活生产 Webhook。Agent 的价值来自在受控范围内选择工具,而稳定性来自工作流外层明确的输入校验、权限检查、结构化输出和兜底路径。