吴师兄大模型
实战项目 · 面试解析

请从零开始设计一个大模型智能体(Agent),详细说明其核心组件(如规划、记忆、工具调用、执行等)、工作流程(如任务理解、分解、决策、反馈循环),并阐述关键设计决策背后的考虑因素,包括如何与RAG系统结合以增强知识获取能力。

Agent 智能体进阶
← 返回列表
核心概念

Function Calling(函数调用)是 LLM 连接外部世界的核心技术机制。LLM 不直接执行代码,而是通过结构化数据握手——返回一个 JSON 格式的工具调用指令,由后端代码执行真正的 API 调用,再将结果回传给 LLM。这是 Agent 能力的技术基石。Function Calling vs Toolformer:前者通过 SFT 显式训练工具调用格式(工业主流),后者让模型自监督学习何时调用工具(学术探索)。

面试答题思路
4步拆解
1
先说「LLM 如何调用工具」的基本问题
LLM 只懂文字,不能直接执行代码。Function Calling 的答案:LLM 返回 JSON 指令,后端代码执行真正的调用,这是「结构化数据握手」。
2
说清五步工作流程
定义工具 -> 用户提问 -> LLM 返回 JSON -> 后台执行 API -> 回传结果 -> LLM 生成最终回复。能画出序列图最好。
3
说格式保障的三种方法
JSON Schema 约束(最推荐)、Pydantic 后处理校验、约束解码(Guided Generation)。各有适用场景。
4
和 Toolformer 对比
体现你了解工具学习的不同范式,Function Calling 是工业主流(可控、动态扩展),Toolformer 是学术探索(自主学习)。
详细解析

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 度,天气不错」

完整代码实现

python
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)

保障输出格式正确的三种方法

python
# 方法 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 outlines

generator = outlines.generate.json(model, ToolCall)

Function Calling vs Toolformer 对比

维度Function CallingToolformer
训练方式SFT 微调,显式学习工具调用格式自监督,模型自主学习何时调用
工具定义外部 JSON Schema 传入,运行时动态训练时嵌入文本中,固定工具集
可控性强,格式标准弱,调用时机不可控
工业应用OpenAI GPT-4、Qwen、Claude 主流方案学术探索为主
重点提示
Function Calling 的本质是「结构化数据握手」:LLM 不执行代码,只负责意图识别和参数提取,返回 JSON 指令;后端代码负责真正的执行。这种解耦设计让 LLM 可以「调用」任何外部工具而无需了解其实现细节。
最大工程挑战:LLM 返回的 JSON 格式不一定规范(字段缺失、类型不符、JSON 语法错误)。生产环境必须加 Pydantic 校验,解析失败时给 LLM 一次重试机会,同时提供格式错误的具体提示(而不是让 LLM 盲目重试)。
知识卡片
4个知识点
tool_choice 参数

auto:LLM 自动决定是否调用工具;required:强制调用;none:禁止调用;指定工具名:强制调用特定工具。生产环境通常用 auto,调试时用 required 验证工具是否正常工作。

parallel_tool_calls

OpenAI API 支持 parallel_tool_calls=True,LLM 可以在一次回复中并行调用多个工具(如同时搜索多个关键词),所有工具返回结果后一并处理,大幅提升效率。

工具 description 的重要性

description 是 LLM 选择工具的唯一依据。写得模糊导致工具误选。最佳实践:包含「何时用」「输入什么」「返回什么」。例如:「当用户询问实时天气时调用,输入城市名,返回温度和天气状况」。

Toolformer vs FC 的根本区别

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 重试一次。