第 12 期:专属对话机器人诞生 — Chat Trigger 与 AI Agent 节点详解
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:#fffAI 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 的长期记忆管理。