第 14 期:赋予数字之手 — 给 Agent 接入 Tools 工具集
没有工具的 Agent 是残缺的
一个没有 Tools 的 AI Agent 就像一个只有嘴但没有手的人——它能说会道,但无法真正执行任何操作。
graph LR
subgraph "无工具 Agent"
Q1["用户: 15% of 8437 是多少?"] --> A1["🤖 大约是 1265.55
❌ 实际是 1265.55 but 模型可能算错"]
end
subgraph "有工具 Agent"
Q2["用户: 15% of 8437 是多少?"] --> Think["🧠 我需要精确计算"]
Think --> Calc["🔧 Calculator Tool
8437 × 0.15 = 1265.55"]
Calc --> A2["🤖 精确答案: 1265.55 ✅"]
end
style Calc fill:#ff6d5b,stroke:#e55a4e,color:#fff1. Tool 的工作原理 (Function Calling)
sequenceDiagram
participant User as 👤 用户
participant Agent as 🤖 AI Agent
participant LLM as 🧠 GPT-4o
participant Tool as 🔧 Calculator Tool
User->>Agent: "8437 的 15% 是多少?"
Agent->>LLM: 消息 + 可用工具列表
Note over LLM: 我有以下工具可用:
1. calculator(expression)
2. wikipedia(query)
我决定用 calculator
LLM-->>Agent: Tool Call: calculator("8437 * 0.15")
Note over Agent: Agent 拦截 Tool Call
不是直接回答,而是工具调用请求
Agent->>Tool: 执行: 8437 * 0.15
Tool-->>Agent: 结果: 1265.55
Agent->>LLM: Tool 返回结果: 1265.55
Note over LLM: 结合计算结果生成回复
LLM-->>Agent: "8437 的 15% 是 1265.55"
Agent-->>User: "8437 的 15% 是 1265.55"📌 关键理解:LLM 自己不执行工具。它只是告诉 Agent "我想调用 calculator,参数是 8437*0.15"。真正执行计算的是 n8n 的 Tool 节点。LLM 负责"决策",Tool 负责"执行"。
2. n8n 内置 AI 工具大全
graph TB
subgraph "n8n Agent 可用工具集"
Agent[🤖 AI Agent]
Agent --> T1[🧮 Calculator
数学精确计算]
Agent --> T2[📖 Wikipedia
查询百科知识]
Agent --> T3[🌐 Web Search (SerpAPI)
搜索引擎查询]
Agent --> T4[💻 Code Tool
执行自定义代码]
Agent --> T5[🔗 HTTP Request Tool
调用任意 API]
Agent --> T6[📊 Data Tables Tool
查询/写入内置表]
Agent --> T7[🔄 Workflow Tool
调用其他子工作流]
Agent --> T8[🌐 MCP Client Tool
连接 MCP Server]
end
style Agent fill:#ff6d5b,stroke:#e55a4e,color:#fff
style T7 fill:#8b5cf6,stroke:#7c3aed,color:#fff
style T8 fill:#22c55e,stroke:#16a34a,color:#fff| 工具 | 用途 | 配置复杂度 |
|---|---|---|
| Calculator | 精确数学运算 | ⭐ 零配置 |
| Wikipedia | 知识检索 | ⭐ 零配置 |
| SerpAPI Search | Google 搜索 | ⭐⭐ 需 API Key |
| Code Tool | 自定义 JS/Python 逻辑 | ⭐⭐⭐ 需编写代码 |
| HTTP Request Tool | 调用任意 REST API | ⭐⭐ 需配置 URL/Auth |
| Workflow Tool | 调用另一个 n8n 工作流 | ⭐⭐ 需先创建子工作流 |
3. 实战:多工具 Agent
graph TB
CT[💬 Chat Trigger] --> Agent[🤖 AI Agent]
subgraph "Agent 配置"
Agent --> Model[🧠 GPT-4o]
Agent --> Mem[💾 Memory]
Agent --> T1[🧮 Calculator]
Agent --> T2[📖 Wikipedia]
Agent --> T3[🌐 SerpAPI]
end
style Agent fill:#ff6d5b,stroke:#e55a4e,color:#fff// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 多工具场景的对话示例
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 用户: "SpaceX 今年发射了多少次火箭?每次成本大约多少?算一下总花费。"
// Agent 内部思考:
// 1. 这个问题需要最新信息 → 用 SerpAPI 搜索 "SpaceX 2026 launches"
// 2. 搜索结果: 约 80 次发射
// 3. 每次发射成本 → 再搜索或用 Wikipedia "Falcon 9 launch cost"
// 4. Wikipedia 结果: 约 6700 万美元/次
// 5. 计算总花费 → Calculator: 80 * 67000000
// 6. 结果: 53.6 亿美元
// 7. 综合回答给用户
// Agent 在一次对话中可能连续调用 3 个不同的工具!
4. HTTP Request Tool:打造自定义工具
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// HTTP Request Tool 配置
// 让 Agent 能够调用你公司内部的 API
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// Tool Name: "query_inventory" ← Agent 看到的工具名
// Tool Description: ← 🔑 这段描述决定了 Agent 何时会选择此工具!
// "查询公司产品库存数量。输入产品名称(中文),返回当前库存数和仓库位置。
// 仅在用户询问产品库存相关问题时使用此工具。"
// Method: GET
// URL: https://api.your-company.com/inventory
// Query Parameters:
// product: {{ $fromAI('productName') }}
// ↑ $fromAI() 是特殊函数: 让 LLM 自动从对话中提取参数值
// Authentication: Header Auth
// Header: Authorization = Bearer {{ $credentials.internalApiKey }}
// ⚠️ Tool Description 是 Agent 决策的唯一依据!
// 写得模糊 → Agent 可能在不该用时用,或该用时不用
// 写得精确 → Agent 调用准确率大幅提升
5. Tool Description 编写法则
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// ❌ 差的 Tool Description (太模糊)
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// "查询产品信息"
// → Agent 不知道什么时候该用、能返回什么
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// ✅ 好的 Tool Description (明确且限定)
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// "根据产品名称查询实时库存数量和仓库位置信息。
// 输入: 产品名称(中文文本)
// 输出: JSON 格式 {stock: number, warehouse: string}
// 使用场景: 仅当用户明确询问某产品的库存、剩余数量或仓库位置时使用。
// 不要用于: 查询价格、产品详情、订单状态。"
// 📏 法则:
// 1. 一句话说明工具做什么
// 2. 明确输入参数格式
// 3. 明确输出格式
// 4. 明确使用场景 (When to use)
// 5. 明确不适用场景 (When NOT to use)
Agent 多工具决策流程图
graph TB
Input[用户输入] --> Parse[🧠 LLM 分析意图]
Parse --> D1{需要精确计算?}
D1 -->|是| Calc[🧮 Calculator]
Parse --> D2{需要最新信息?}
D2 -->|是| Search[🌐 Web Search]
Parse --> D3{需要内部数据?}
D3 -->|是| API[🔗 HTTP Request]
Parse --> D4{可以直接回答?}
D4 -->|是| Direct[直接生成文本]
Calc --> Combine[🧠 综合所有结果]
Search --> Combine
API --> Combine
Direct --> Combine
Combine --> Reply[📤 最终回复]
style Parse fill:#8b5cf6,stroke:#7c3aed,color:#fff
style Combine fill:#8b5cf6,stroke:#7c3aed,color:#fff下一步
在 Ep 15 中,我们将探索 System Prompt 与 Tool Description 的高级调优技巧——如何精准引导 LLM 在 10+ 个工具中做出最优选择。