第 12 期:专属对话机器人诞生 — Chat Trigger 与 AI Agent 节点详解

⏱ 预计阅读 12 分钟 更新于 2026/4/9

AI Agent 节点的内部架构

AI Agent 节点是 n8n 中所有智能行为的核心。它不是简单地"调用一次 API",而是一个自主决策循环 (Agentic Loop)

graph TB
    subgraph "AI Agent 节点内部执行循环"
        Input[📥 用户输入] --> Think[🧠 LLM 思考
分析意图] Think --> Decision{需要使用工具吗?} Decision -->|"不需要 → 直接回答"| Answer[📤 生成回复] Decision -->|"需要 → 选择工具"| ToolCall[🔧 调用 Tool] ToolCall --> ToolResult[📋 获取工具结果] ToolResult --> Think2[🧠 再次思考
结合工具结果] Think2 --> Decision2{还需要其他工具?} Decision2 -->|"是"| ToolCall Decision2 -->|"否 → 汇总作答"| Answer end style Think fill:#8b5cf6,stroke:#7c3aed,color:#fff style Think2 fill:#8b5cf6,stroke:#7c3aed,color:#fff style ToolCall fill:#ff6d5b,stroke:#e55a4e,color:#fff

📌 核心理解:AI Agent ≠ 单次 API 调用。它是一个多轮内循环——LLM 可能"想了想觉得自己需要查一下天气",调完天气 API 后"又想了想觉得还需要查查汇率",最终综合所有信息给你一个完整的回答。


1. Chat Trigger 节点

Chat Trigger 是 AI 对话工作流的专属入口,它提供了一个内置的 Web 聊天界面。

sequenceDiagram
    participant User as 👤 用户
    participant Chat as 💬 n8n 内置聊天 UI
    participant Trigger as 🔔 Chat Trigger
    participant Agent as 🤖 AI Agent
    
    User->>Chat: 打开 n8n 聊天窗口
    User->>Chat: 输入 "帮我查一下北京今天的天气"
    Chat->>Trigger: 传递消息 + sessionId
    
    Note over Trigger: 输出 Item:
{chatInput: "帮我查...",
sessionId: "sess_abc123"} Trigger->>Agent: 传递用户消息 Agent->>Agent: LLM 思考 → 调用工具 → 生成回复 Agent-->>Chat: 返回 "北京今天晴,28°C..." Chat-->>User: 显示 AI 回复
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// Chat Trigger 输出的 Item 结构
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
{
  "json": {
    "chatInput": "帮我查一下北京今天的天气",  // 用户的原始输入
    "sessionId": "sess_abc123",                // 会话 ID (用于记忆管理)
    "action": "sendMessage"                    // 动作类型
  }
}

// Chat Trigger 的配置选项:
// - Authentication: 无 / Basic Auth / n8n User Auth
//   ⚠️ 生产环境务必开启认证!否则任何人都能与你的 Agent 对话
// - Allowed Origins: 限制嵌入来源 (CORS)
// - Initial Message: 设置 AI 的开场白
//   例: "你好!我是 AI 助手,有什么可以帮你的?"

2. 构建完整的 AI 对话机器人

工作流拓扑

graph TB
    CT[💬 Chat Trigger
接收用户消息] --> Agent[🤖 AI Agent] subgraph "Agent 子节点 (嵌入式)" Agent --> Model[🧠 OpenAI Chat Model
gpt-4o] Agent --> Mem[💾 Window Buffer Memory
记住最近 10 轮对话] end style CT fill:#0088cc,stroke:#006699,color:#fff style Agent fill:#ff6d5b,stroke:#e55a4e,color:#fff style Model fill:#8b5cf6,stroke:#7c3aed,color:#fff style Mem fill:#22c55e,stroke:#16a34a,color:#fff

AI Agent 节点配置

// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// AI Agent 节点核心配置
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

// 📝 System Message (系统提示词):
// """
// 你是 AgentUpdate.ai 的专属客服助手。
// 
// 行为准则:
// 1. 始终使用中文回复
// 2. 回答字数控制在 200 字以内
// 3. 如果用户问题超出你的知识范围,如实告知
// 4. 禁止讨论政治、宗教等敏感话题
// 5. 在回答末尾附上一个相关的 emoji
// """

// 🧠 Chat Model (子节点):
// - Provider: OpenAI
// - Model: gpt-4o-mini      // 性价比最高
// - Temperature: 0.5         // 客服需要准确但灵活

// 💾 Memory (子节点):
// - Type: Window Buffer Memory
// - Window Size: 10          // 记住最近 10 条消息 (5 轮对话)
// - Session ID: {{ $json.sessionId }}  // 关联 Chat Trigger 的 sessionId
//   ⚠️ 这个关联是关键!没有它,每次对话都是全新的

// 📤 输出:
// AI Agent 自动将最终回复返回给 Chat Trigger
// Chat Trigger 负责将回复显示在用户的聊天界面上

3. System Prompt 设计原则

graph TB
    subgraph "System Prompt 的四层结构"
        L1["🎭 Layer 1: 角色定义
你是谁?为谁服务?"] L2["📏 Layer 2: 行为规范
回答长度、语气、语言"] L3["🚫 Layer 3: 禁区定义
不准做什么?哪些话题禁止?"] L4["📋 Layer 4: 输出格式
JSON?Markdown?纯文本?"] end L1 --> L2 --> L3 --> L4
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 一个生产级 System Prompt 示例
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

const systemPrompt = `
## 角色 (Role)
你是"小智",AgentUpdate.ai 平台的 AI 技术支持助手。

## 知识范围 (Scope)
- 你可以回答关于 n8n 工作流、AI Agent 配置、API 集成的问题
- 你熟悉 Docker、Node.js、Python 等技术栈
- 对于非技术问题,礼貌地引导用户去人工客服

## 行为规范 (Rules)
1. 使用中文回答,技术术语保留英文
2. 每次回答不超过 300 字
3. 关键代码用 \`\`\`代码块\`\`\` 包裹
4. 如果不确定答案,说"让我帮你转接人工客服"
5. 禁止生成任何与平台无关的内容

## 输出格式 (Format)
- 先用一句话直接回答问题
- 然后展开解释或给出步骤
- 最后附上一个相关链接(如果有的话)
`;

4. 对话流转的完整时序

sequenceDiagram
    participant User as 👤 用户
    participant CT as 💬 Chat Trigger
    participant Agent as 🤖 AI Agent
    participant Mem as 💾 Memory
    participant LLM as 🧠 GPT-4o
    
    Note over User,LLM: === 第一轮对话 ===
    User->>CT: "你好,你能做什么?"
    CT->>Agent: {chatInput: "你好...", sessionId: "s1"}
    Agent->>Mem: 读取 sessionId="s1" 的历史 → 空
    Agent->>LLM: [System Prompt] + [用户消息]
    LLM-->>Agent: "你好!我是小智,可以帮你..."
    Agent->>Mem: 保存对话: [用户问, AI 答]
    Agent-->>CT: 返回回复
    CT-->>User: "你好!我是小智..."
    
    Note over User,LLM: === 第二轮对话 ===
    User->>CT: "如何配置 Webhook?"
    CT->>Agent: {chatInput: "如何配置...", sessionId: "s1"}
    Agent->>Mem: 读取历史 → [第一轮完整对话]
    Agent->>LLM: [System] + [历史] + [新消息]
    Note over LLM: 模型看到完整上下文
知道用户刚打过招呼 LLM-->>Agent: "配置 Webhook 的步骤如下..." Agent->>Mem: 追加保存第二轮 Agent-->>CT: 返回回复

常见问题

问题 原因 解决
每次对话都忘记之前说的 没有连接 Memory 节点 添加 Window Buffer Memory 子节点
Memory 在不同用户间混淆 sessionId 写死了固定值 使用 {{ $json.sessionId }} 动态引用
回复太长导致超时 没设 Max Tokens 在 Chat Model 中限制 maxTokens: 500
Agent 回答跑题 System Prompt 太宽泛 加入明确的禁区定义与格式约束

下一步

Ep 13 将深入 Memory 节点的内部机制——Window Buffer、Token Buffer 以及跨 Session 的长期记忆管理。