B 轴(动作空间)的实现技术:Function Calling / Structured Output / MCP 各自解决什么、怎么组合。
建议先读《Agent Loop 与 ReAct》;如果你是跳读,至少先看本章索引与本页 TL;DR。
课程理论地基,用来建立后续所有判断语言。
B 轴(动作空间)的实现技术:Function Calling / Structured Output / MCP 各自解决什么、怎么组合。
先问控制流、动作空间、终止时机,再谈 agent 能力。
课程主线:稳定概念 + 经典论文 + 官方机制。
"LLM 调用了一个工具"是个非常粗糙的说法。逐帧拆开:
tool_calls[]),按 name 找对应的本地函数 / 远程服务,执行,把返回值再包成 tool role 的 message 回灌到下一轮的 prompt。从 LLM 的角度看,整个世界仍然只有"读 token、写 token"这一件事。"调用工具"是runtime 通过协议把模型的某段输出解释成了'动作'。换句话说:tool calling 的能力不是 LLM 的能力,而是 LLM + runtime + 协议 三者合谋的能力。这条直觉在你后面读源码 / 改 middleware / 加权限层时会反复救你。
Function Calling(OpenAI 命名 / Anthropic 称 tool use)解决的是 "在一个闭合的、已注册的动作集合里,让 LLM 挑一个并填好参数" 这个问题。它是 02 章 Agent Loop 里 "Action" 那一段的现代实现。
API 层面通常长这样(不同厂商字段名略有差异,结构等价):
# Request
{
"messages": [/* 历史 */],
"tools": [
{
"name": "search_web",
"description": "Search the web. Use this when the user asks about recent events...",
"parameters": { /* JSON Schema */
"type": "object",
"properties": {"query": {"type": "string"}},
"required": ["query"]
}
}
]
}
# Response (assistant message)
{
"role": "assistant",
"content": "I'll search the web for that.", # 可能为空
"tool_calls": [
{"i