工具调用(Tool Use)和Function Calling是LLM Agent的核心能力。大模型通过工具调用,可以获取模型权重中不存在的实时信息,执行计算,调用外部API,从而完成原本无法完成的任务。
Function Calling是大语言模型的一种能力,允许模型生成结构化输出,用来调用开发者定义的外部函数/工具。模型能够根据用户问题,判断是否需要调用工具、调用哪个工具、传入什么参数。
Function Calling让大模型具备:
复杂任务需要多次调用不同工具,前一次调用结果作为后一次调用的输入:
用户问题 → LLM → 调用工具1 → 结果1 → LLM → 调用工具2 → 结果2 → LLM → 最终回答Thought → Action → Observation 的循环。ReAct(Reasoning + Acting)将推理和动作整合在一起,让模型一边推理一边调用工具:
Question: 问题
Thought: 我应该做什么下一步思考
Action:
```json
{
"action": "工具名称",
"action_input": 输入参数
}Observation: 工具返回结果 ... (重复多次) Thought: 我现在知道答案了 Final Answer: 最终回答
**优点**:将推理过程显式化,可解释性强,在知识密集型任务和决策任务上表现优于单一动作模式。
### 工具选择策略
当有多个工具可用时,LLM需要判断:
1. 是否需要调用工具?
2. 如果需要,应该调用哪个工具?
3. 参数如何填写?
常见做法:
1. **分类法**:构造选择题让大模型选择合适工具:
```python
multi_choice_prompt = """请针对 >>> 和 <<< 中间的用户问题,选择一个适合的工具去回答他的问题,只要用A、B、C的选项字母告诉我答案。如果你觉得都不适合,就选D。
你能使用的工具如下:
A. 一个能够查询商品信息为用户进行商品导购的工具
B. 一个能够查询最近下单的订单信息,获得最新的订单情况的工具
C. 一个能够查询商家退换货政策、运费的工具
D. 都不适合
请按以下格式回答:`A`、`B`、`C`、`D`。
>>> {question} <<<
"""OpenAI官方Function Calling API格式示例:
1[
2 {
3 "type": "function",
4 "function": {
5 "name": "get_weather",
6 "description": "获取指定城市的当前天气",
7 "parameters": {
8 "type": "object",
9 "properties": {
10 "city": {
11 "type": "string",
12 "description": "城市名称,例如:北京"
13 },
14 "unit": {
15 "type": "string",
16 "enum": ["celsius", "fahrenheit"],
17 "description": "温度单位"
18 }
19 },
20 "required": ["city"]
21 }
22 }
23 }
24]调用OpenAI API:
1import openai
2
3response = openai.chat.completions.create(
4 model="gpt-3.5-turbo",
5 messages=messages,
6 tools=tools,
7 tool_choice="auto"
8)模型返回会包含工具调用信息:
1response.choices[0].message.tool_calls一个典型的LLM Agent由三个核心组件组成:
| 组件 | 作用 |
|---|---|
| 规划 (Planning) | 将复杂任务拆解为子目标,自我反思优化 |
| 记忆 (Memory) | 存储对话历史和知识,短期+长期记忆 |
| 工具使用 (Tool Use) | 调用外部工具获取额外信息和执行动作 |
任务分解
自我反思
问题1:模型输出不符合格式要求,夹杂自然语言
1pattern = re.compile(r"^.*?`{3}(?:json)?\n(.*?)`{3}.*?$", re.DOTALL)
2found = pattern.search(text)
3action = found.group(1)
4response = json.loads(action.strip())问题2:模型幻觉,编造不存在的工具名
问题3:参数填写错误
经典的zero-shot ReAct prompt模板:
1agent_prompt = """Answer the following questions as best you can. You have access to the following tools:
2
3Search Order: 一个能够查询订单信息,获得最新的订单情况的工具,参数是输入订单id
4Recommend product: 一个能够基于商品及用户信息为用户进行商品推荐导购的工具,参数是输入要推荐的商品类型
5
6The way you use the tools is by specifying a json blob.
7Specifically, this json should have a `action` key (with the name of the tool to use)
8and a `action_input` key (with the input to the tool going here).
9
10The only values that are in the "action" field are: Search Order, Recommend product
11
12Example of a valid JSON blob:{{ "action": "Tool Name", "action_input": "输入" }}
ALWAYS use the following format:
Question: the input question you must answer
Thought: you should always think about what to do
Action:
```json
$JSON_BLOBObservation: the result of the action ... (this Thought/Action/Observation can repeat N times) Thought: I now know the final answer Final Answer: the final answer to the original input question
Final Answer when responding.{question} """
## 给LLM注入领域知识的两种方式
1. **检索增强生成 (RAG)**:先用问题在领域知识库检索相关候选内容,把检索结果作为上下文输入给LLM,LLM再加工生成答案。不需要训练,更新知识方便。
2. **SFT微调**:把领域知识构建成问答数据集,用监督微调让LLM学习这部分知识。回答速度快,效果好,但更新知识需要重新微调。
## 常见LLM Agent框架
- **AutoGPT**:最早的自主Agent,支持多工具自主完成任务
- **AutoGen**:微软开源,多Agent协作框架,支持多个Agent对话解决问题
- **ChatDev**:基于LLM的软件开发协作Agent
- **XAgent**:开源自主Agent,支持复杂任务规划
- **GPT-engineer**:根据需求生成整个代码项目的Agent
## 面试常见问题
1. ****什么是Function Calling?它解决了什么问题?**
- Function Calling是大语言模型调用外部函数的能力,模型生成结构化的工具调用请求
- 解决了大模型本身的几个局限:无法获取实时信息、无法执行计算、无法访问外部数据和系统,让大模型能借助工具完成更多任务
2. ****LLM Agent的三个核心组件是什么?各自作用?**
- 规划:将复杂任务拆解为子目标,支持自我反省改进,常用方法有CoT、ToT、ReAct、Reflexion等
- 记忆:存储对话历史和知识,分为短期记忆(上下文窗口)和长期记忆(外部向量库)
- 工具使用:调用外部API/函数获取模型权重之外的信息,执行计算和操作
3. ****ReAct框架的原理是什么?**
- ReAct = Reasoning + Acting,将推理过程和工具调用动作整合在一起
- 遵循Thought → Action → Observation的循环模式,模型先思考,然后调用工具,获得观察结果,再继续思考,直到得出答案
- 在知识密集型任务和决策任务上表现更好,可解释性更强
4. ****工具调用时,模型输出格式不对怎么办?**
- 实践中常用正则表达式提取JSON部分,容错解析;如果解析失败,可以让模型重试
- 在prompt中明确格式要求,给示例,能减少格式错误
5. ****如何给大模型注入领域知识?常见两种方式**
- RAG检索增强:先检索领域知识库,把相关内容给LLM回答,优点是更新知识方便,不需要训练
- SFT微调:用领域问答数据集微调模型,优点是回答流畅速度快,缺点是更新知识需要重训
6. ****什么时候需要调用工具,什么时候大模型可以直接回答?**
- 需要实时信息(天气、股价、新闻)、需要计算、需要访问外部数据/API时,应该调用工具
- 问题是通用知识,模型已经具备相关知识,不需要外部信息,直接回答即可
7. ****什么情况下需要多次链式调用工具?**
- 复杂问题需要多步推理,前一步的结果是后一步的输入,比如先搜索A,再用A的结果搜索B,最后综合回答
- ReAct框架就是典型的链式工具调用模式,支持多轮Thought-Action-Observation循环