教程
AI Agent 是什么?2026 AI Agent 工作原理、Tool Calling、Function Calling 与 JSON 完整指南
聊天窗口只会回话。Agent 会选工具、填参数、看结果、再决定下一步。贯穿全程的不是魔法,是一份份 JSON:工具定义、arguments、执行结果。
2026 年「AI Agent」出现在产品发布、招聘 JD 和架构评审里,含义却经常对不上。有人把带插件的聊天窗口叫 Agent,有人把定时跑的工作流叫 Agent,有人把接了 MCP 的 IDE 助手叫 Agent。本文用工程定义收束:Agent 是一个由模型驱动、可循环调用工具、用结构化数据(几乎总是 JSON)交接状态的运行时。它不是更会聊天的模型,而是「模型 + 工具运行时 + 契约」的组合。下面按工作原理拆开 Tool Calling、Function Calling 与 JSON 各管哪一层,并接到站内 Structured Output、MCP Schema 与 A2A 对照文。
AI Agent 是什么:和聊天、工作流差在哪
最小定义只需要三件事:目标(用户要完成什么)、感知(当前上下文与工具回执)、行动(调用哪一个工具、填什么参数,或给出最终答复)。大模型负责在每一步选择行动;运行时负责执行工具并把观察写回上下文。没有循环、没有工具、没有可校验的参数形状,只是聊天。
和聊天机器人的差别不在模型商标,而在停止条件。聊天一轮问答就可以结束。Agent 在拿到工具结果之前,通常不应宣称任务完成——它可能先查发票、再汇总、再问你确认。和传统工作流的差别在于边是谁画的:n8n / Temporal 的下一跳由人预先连好;Agent 的下一跳由模型根据当前这份 JSON 观察决定。工作流可预期、可回放;Agent 更灵活,也把「参数填错」变成一等故障。
2026 年常见形态包括:编码 Agent(编辑器里读文件、跑测试、改补丁)、客服与内部运营 Agent(查订单、开工单)、以及多 Agent 编排(一个规划者把任务交给专长 Agent)。形态不同,契约相同:工具边界用 JSON Schema 写清,arguments 与 result 都是可 parse 的 JSON。Apple 把同一函数同时暴露给 App Intent 与模型工具,见Apple AI Agent 与 JSON。
2026 工作原理:观察 → 决策 → 调工具 → 再观察
把演示视频里的「智能」拆开,一条典型 Agent 循环只有五步:
- 用户目标进入上下文(自然语言 + 可选系统约束)。
- 运行时注入工具清单:每个工具有 name、description 和一份 JSON Schema(parameters / inputSchema)。
- 模型返回 tool_calls(要调哪个函数、arguments 是什么)或最终文本 / Structured Output。
- 运行时 JSON.parse arguments,执行本地函数、HTTP 或 MCP tools/call,把 result JSON 写回消息列表。
- 模型再看结果,决定下一工具或结束。超过 maxSteps、用户取消或 Schema 失败则停。
循环的形状本身也可以写成配置,而不是埋在框架魔法里。下面这份 JSON 只描述 hops 与停止条件,不包含任何业务字段——业务字段属于各工具自己的 Schema。
{
"loop": "agent",
"maxSteps": 8,
"stopWhen": ["final_answer", "max_steps", "user_cancel", "schema_fail"],
"hops": [
{ "kind": "model", "emits": "tool_calls | text" },
{ "kind": "runtime", "emits": "tool_result JSON" },
{ "kind": "model", "emits": "next_tool | final JSON" }
]
}
故障几乎总发生在第 3→4 步:arguments 是字符串却被当成对象、数字写成字符串、漏 required、或工具名与缓存的清单不一致。模型「够聪明」解决不了契约漂移。无状态 MCP 下每次请求自带协议元数据,但 arguments 形状仍取决于你喂给模型的那份 Schema。
Tool Calling 与 Function Calling:同一件事的两套名字
工程上它们是同一机制:模型不直接碰数据库,而是发出一份「请调用某某函数、参数如下」的结构化请求,由运行时执行。产品名词在 2023–2026 年间换了几轮,对照如下:
| 概念 | Function Calling | Tool Calling |
|---|---|---|
| 出处 | OpenAI 2023 起的 function_call / functions[] | 2024–2026 业界统称,覆盖各家 API 与 MCP |
| 模型发出的载荷 | function.name + arguments(多为 JSON 字符串) | OpenAI tools[]、Anthropic tool_use、Gemini functionCall |
| Schema 放哪 | function.parameters | tools[].function.parameters 或 MCP inputSchema |
| 和 Structured Output 的关系 | 不管最终答复形状,只管这一跳工具入参 | 同样:工具 hop 与最终答复 hop 必须分文件 |
OpenAI 后来把 functions 收进 tools,并加上 strict。Anthropic 叫 tool_use / input_schema。Gemini 叫 function declarations。MCP 用 JSON-RPC tools/call。名字不同,arguments 都是 JSON object。把「Function Calling 过时了」写成迁移理由通常是错的——过时的是旧字段名,不是机制。
同一份发票搜索工具,OpenAI strict tool 的写法如下。注意 strict 下所有 properties 必须列入 required,否则模型可以合法地省略你以为有默认值的字段:
{
"type": "function",
"function": {
"name": "searchInvoices",
"description": "Search invoices by date range and status",
"strict": true,
"parameters": {
"type": "object",
"properties": {
"startDate": { "type": "string", "format": "date" },
"endDate": { "type": "string", "format": "date" },
"status": {
"type": "string",
"enum": ["draft", "sent", "paid", "void"]
}
},
"required": ["startDate", "endDate", "status"],
"additionalProperties": false
}
}
}
模型若决定调用,典型 tool_calls 项长这样。arguments 仍是字符串,运行时必须先 parse 再校验,不要直接 JSON.parse 失败就当模型故障——先分清是语法坏了还是 Schema 不合。分类法见AI 生成 JSON 错误指南。
{
"id": "call_8f3a",
"type": "function",
"function": {
"name": "searchInvoices",
"arguments": "{\"startDate\":\"2026-01-01\",\"endDate\":\"2026-01-31\",\"status\":\"paid\"}"
}
}
JSON 为什么是 Agent 的契约语言
一条 Agent 流水线里至少有三份 JSON,形状应来自同一份 canonical Schema:
- 工具定义:name / description / parameters(或 MCP inputSchema)。
- 模型 arguments:选中的键值,常以字符串形式出现在 tool_calls 里。
- 工具结果:运行时写回的 ok / result 或错误信封,供模型决定下一跳。
还可以有第四份:模型最终答复的 Structured Output。它描述「给用户或下游系统的答案长什么样」,不是「调用 searchInvoices 要什么」。两份 Schema 语法相同、语义不同,应分文件、分版本。详见AI Structured Output 教程。
工具执行成功后,回执建议固定信封,而不是把下游 HTTP 原文原样丢给模型。下面的 result 只暴露业务需要的字段;原始响应进日志。模型看到稳定形状,重试与汇总才可预期:
{
"toolCallId": "call_8f3a",
"name": "searchInvoices",
"ok": true,
"result": {
"count": 2,
"items": [
{ "id": "INV-1042", "total": 1280.5, "currency": "USD" },
{ "id": "INV-1048", "total": 640.0, "currency": "USD" }
]
}
}
2026 各栈:OpenAI、Anthropic、Gemini、MCP
没有「一个 Schema 走天下」,但 Tool Calling 的数据结构在收敛:arguments 是 JSON object,契约基于 JSON Schema 子集。
| 栈 / 协议 | 工具怎么声明 | 调用怎么发出 |
|---|---|---|
| OpenAI Chat / Responses | tools[].function.parameters,可选 strict | tool_calls[].function.arguments 字符串 |
| Anthropic Messages | tools[].input_schema | tool_use 块里的 input 对象 |
| Gemini | function_declarations.parameters | functionCall.args;最终 JSON 另走 responseSchema |
| MCP 2026-07-28 | Tool.inputSchema(协议不替你校验) | JSON-RPC tools/call 的 params.arguments |
MCP 是发现与传输,不是类型系统。inputSchema 声明形状,Server 仍要本地 parse + Schema 校验。字段对照与一份 Schema 三处复用,见MCP 与 JSON Schema。多 Agent 互调走 A2A 的 message/send,技能清单里同样挂 Schema——那是 Agent 对 Agent,不是模型对工具。对照A2A vs MCP。
无状态 MCP 去掉 Session 之后更适合水平扩展,但不会自动修好 arguments。缓存了旧 tools/list,就会把错误形状写进调用。协议细节见Stateless MCP 解析。
落地校验与 JSONVue 实操
每个 hop 固定三步:parse → Schema → 业务规则。模型再聪明,也不替代这三步。
- arguments 字符串:JSON.parse;失败则记下 raw 与 tool_call id,返回可重试的错误信封。
- 对照 parameters / inputSchema 做 Draft 2020-12 校验,输出 path 与 keyword。
- 业务门:日期范围合法、枚举与权限匹配、外键存在。通过后再打下游 API。
联调时把三份 JSON 并排:模型吐出的 arguments、你发给 MCP 或 HTTP 的 body、Server 实际使用的对象。形状不一致,问题几乎总在适配层。浏览器里:JSON 格式化确认 parse;JSON Schema 校验对 arguments 与 Schema 文件;JSON Diff对比模型 arguments 与下游 body。固定 fixture:valid、missing-field、wrong-enum,CI 与手工排查共用。
延伸阅读:MCP 与 JSON Schema、Structured Output、AI JSON 错误指南、A2A vs MCP。
常见问题 FAQ
Agent 和 RAG 是一回事吗?
不是。RAG 把检索到的文档塞进上下文,模型据此生成答案;它可以是 Agent 的一个工具(例如 searchDocs),本身没有「选工具—执行—再观察」的循环。没有工具边界的 RAG 仍是增强版问答。
Function Calling 过时了,应该只说 Tool Calling 吗?
文档和 SDK 标题在变,机制没有变。OpenAI 仍用 type: function 的 tool;Anthropic / Gemini / MCP 用各自字段名。对内维护一份 canonical Schema,对外生成各家外壳即可,不必为改名重写业务。
已经开了 Structured Output,还要校验工具 arguments 吗?
要。Structured Output 约束最终答复;arguments 是另一跳。常见事故是「答复 Schema 过了,tools/call 仍缺键」。两份 Schema 分文件,每 hop 都 parse + 校验。
没有 MCP 能不能做 Agent?
能。MCP 是工具发现与远程调用的一种协议,不是 Agent 的定义。本地函数、OpenAPI、自建 HTTP 都能当工具,只要 arguments 与 result 是可校验的 JSON。MCP 的价值是清单与传输标准化,尤其是远程、多客户端时。
总结与下一步
AI Agent 在 2026 年可以概括成:模型在循环里选择行动,运行时执行工具,JSON Schema 描述每一跳的形状。Tool Calling 与 Function Calling 是同一机制的产品名词;MCP、A2A、Structured Output 管的是不同 hop,不要共用一份文件硬套。
下一步:列出你系统里的三份 JSON(定义、arguments、result),确认它们是否同源 Schema;用 JSONVue 跑通一条 valid / 缺字段 / 错误枚举。协议细节读 MCP 文,最终答复形状读 Structured Output,失败分层读 JSON 错误指南。