请系统阐述大模型智能体(Agent)的基本工作原理,详细说明其核心组成部分(如规划模块、记忆机制、工具调用和执行反馈)的功能与协同机制,并结合实际场景解释各模块如何共同支持Agent的自主决策与任务执行。
Function Calling(函数调用)是 LLM 连接外部世界的核心技术机制。LLM 不直接执行代码,而是通过结构化数据握手——返回一个 JSON 格式的工具调用指令,由后端代码执行真正的 API 调用,再将结果回传给 LLM。这是 Agent 能力的技术基石。Function Calling vs Toolformer:前者通过 SFT 显式训练工具调用格式(工业主流),后者让模型自监督学习何时调用工具(学术探索)。
Function Calling 五步工作流程
Step 1: 开发者定义工具(JSON Schema 格式)tools = [{"name": "search", "description": "搜索互联网",
"parameters": {"query": {"type": "string"}}}]
Step 2: 用户提问
"北京今天天气怎么样?"
Step 3: LLM 意图识别 -> 返回 JSON 格式工具调用(不是自然语言!)
{"name": "get_weather", "arguments": {"city": "北京"}}
Step 4: 后台代码解析 JSON,执行真正的 API 调用
weather_api.call(city="北京") -> "25 C,晴"
Step 5: 将 API 结果回传给 LLM,生成最终回复
LLM 看到结果后生成:「北京今天 25 度,天气不错」
完整代码实现
tools = [{
"name": "search_knowledge_base",
"description": "搜索保险知识库,适用于保险相关问题",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "搜索查询词"}
},
"required": ["query"]
}
}
]
response = client.chat.completions.create(
model="gpt-4", messages=messages, tools=tools, tool_choice="auto"
)
if response.choices[0].message.tool_calls:tool_call = response.choices[0].message.tool_calls[0]
args = json.loads(tool_call.function.arguments)
result = tools_registry[tool_call.function.name](**args)
messages.append({"role": "tool", "content": str(result),
"tool_call_id": tool_call.id})
final = client.chat.completions.create(model="gpt-4", messages=messages)
保障输出格式正确的三种方法
# 方法 1: JSON Schema 约束(最推荐)response_format = {"type": "json_object"}
# 方法 2: Prompt 约束 + Pydantic 后处理校验 from pydantic import BaseModel class ToolCall(BaseModel):tool: str
params: dict
try:result = ToolCall.model_validate_json(llm_output)
except ValidationError:result = retry_with_format_hint(llm_output) # 提示 LLM 重新输出
# 方法 3: 约束解码(Guided Generation) import outlinesgenerator = outlines.generate.json(model, ToolCall)
Function Calling vs Toolformer 对比
| 维度 | Function Calling | Toolformer |
|---|---|---|
| 训练方式 | SFT 微调,显式学习工具调用格式 | 自监督,模型自主学习何时调用 |
| 工具定义 | 外部 JSON Schema 传入,运行时动态 | 训练时嵌入文本中,固定工具集 |
| 可控性 | 强,格式标准 | 弱,调用时机不可控 |
| 工业应用 | OpenAI GPT-4、Qwen、Claude 主流方案 | 学术探索为主 |
auto:LLM 自动决定是否调用工具;required:强制调用;none:禁止调用;指定工具名:强制调用特定工具。生产环境通常用 auto,调试时用 required 验证工具是否正常工作。
OpenAI API 支持 parallel_tool_calls=True,LLM 可以在一次回复中并行调用多个工具(如同时搜索多个关键词),所有工具返回结果后一并处理,大幅提升效率。
description 是 LLM 选择工具的唯一依据。写得模糊导致工具误选。最佳实践:包含「何时用」「输入什么」「返回什么」。例如:「当用户询问实时天气时调用,输入城市名,返回温度和天气状况」。
Toolformer 让模型通过自监督学习自主决定何时在文本中插入工具调用 API token;Function Calling 是显式定义 Schema 后通过 SFT 训练,可控性更强,是工业界主流。
被问Function Calling 的实现原理,不要只说给 LLM 看工具描述然后它会调用。正确答案:Function Calling 本质是结构化数据握手:开发者用 JSON Schema 定义工具接口 -> LLM 做意图识别,输出标准化的 JSON 工具调用指令(不是自然语言,是 {"name": "xxx", "arguments": {...}})-> 后端代码解析 JSON 并执行真正的 API 调用 -> 将结果作为 tool 角色消息追加到对话历史,LLM 再次生成。LLM 自己从来不执行代码。生产环境最大挑战是 JSON 格式不规范,我们用 Pydantic 做 Schema 验证,失败时附带格式提示让 LLM 重试一次。