--- title: Tool Calling 与 Acting:让模型学会做事 draft: false tags: - Toolformer - ReAct - Tool-Calling - Acting - 大语言模型 --- # Tool Calling 与 Acting:让模型学会做事 --- ## 一、从"说话"到"做事" ### 1.1 语言模型的本质限制 **语言模型的能力**: 给定输入 $x$,生成文本输出 $y$: $$P_\theta(y|x) = \prod_{t=1}^T P_\theta(y_t | x, y_{ 让语言模型不仅能"说话",还能"调用工具"——通过函数/API 调用执行操作,获取外部信息或改变外部状态。 **形式化**: 将语言模型扩展为: $$P_\theta(y|x, \mathcal{T}) = \prod_{t=1}^T P_\theta(y_t | x, y_{ 人类智能是推理和行动的交织:边想边做,边做边想。 **与 Toolformer 的区别**: | 方法 | 工具调用 | 推理方式 | |------|---------|---------| | **Toolformer** | 模型自主决定 | 工具调用穿插在生成中 | | **ReAct** | 每个 step 都显式 | Thought → Action → Observation 循环 | ### 3.2 ReAct 的轨迹格式 **ReAct 的轨迹**由多个步骤组成: ``` 输入:x Step 1: Thought: 模型思考下一步该做什么 Action: 执行的操作(如 search, calculate) Observation: 操作返回的结果 Step 2: Thought: 基于观察继续思考 Action: 继续操作 Observation: 继续观察 ... (重复直到得到答案) ``` **关键特性:双向交互与动态纠错** ReAct 支持环境反馈**反向修正推理逻辑**——可推翻之前错误思路重新规划,而非一条道走到黑。 ``` Step 1: Thought: 我认为应该先搜索"北京天气" Action: search("北京天气") Observation: 结果显示"晴,25°C" Step 2: Thought: 等等,用户问的是"明天"北京的天气, 而搜索结果显示的是"今天"的。 需要重新搜索"北京明天天气" Action: search("北京明天天气") Observation: 结果显示"多云,22°C" ``` **形式化表示**: 设 $s_t$ 是第 $t$ 步的状态,$a_t$ 是行动,$o_t$ 是观察。 $$\text{Traj} = (x, s_0) \xrightarrow{a_0} o_0 \xrightarrow{a_1} o_1 \xrightarrow{a_2} \cdots \tag{3.1}$$ ### 3.3 ReAct 的数学框架 **定义(状态)**: 状态 $s_t$ 包含: - 原始输入 $x$ - 之前的思考 $h_{ Tool Calling 将语言模型从"纯文本生成器"扩展为"能够操纵外部世界的智能体"。ReAct 则进一步将推理和行动交织,使得模型能够在与环境交互中不断调整策略。 **关键挑战**: 1. 工具选择的准确性 2. 工具调用的可靠性 3. 多步规划的效率 4. 循环检测与终止 ### 8.1 主流智能体框架适配 **LangChain 工具调用封装**: ```python from langchain.agents import AgentExecutor, Tool from langchain.llms import OpenAI tools = [ Tool(name="calculator", func=calculate, description="计算数学表达式"), Tool(name="search", func=search_web, description="搜索网页") ] agent = initialize_agent(tools, llm, agent_type="react") agent.run("北京今天天气如何?") ``` **LlamaIndex 工具调用封装**: ```python from llama_index import download_loader from llama_index.agent import ReActAgent agent = ReActAgent.from_tools(tools, verbose=True) response = agent.query("计算 45 + 23 的结果") ``` **AgentScope 工具调用封装**: ```python import agentscope from agentscope.agents import ReActAgent agent = ReActAgent(config={ "tools": [get_weather, calculator], "model": "gpt-4" }) ``` ### 8.2 工程实战落地方案 **调用异常处理**: | 异常类型 | 处理策略 | |---------|---------| | **超时** | 重试3次,间隔2s/4s/8s指数退避 | | **参数错误** | 自动纠错(如类型转换)+ 回退到自然语言回答 | | **工具不可用** | 降级方案:直接基于已有信息回答,或提示用户 | **多轮交互上下文优化**: ``` 问题:用户进行20轮对话后,Context 溢出风险 解决方案: 1. 摘要压缩:每隔5轮用 small LLM 压缩历史 2. 滑动窗口:只保留最近 N 轮对话 3. 重要性筛选:删除与当前任务无关的历史 ``` **微调实战配比**: | 数据类型 | 推荐比例 | 作用 | |---------|---------|------| | **工具调用轨迹数据** | 30% | 专精工具调用能力 | | **自然对话数据** | 70% | 保持通用对话能力 | **冷热方案选型**: | 场景 | 推荐方案 | 说明 | |------|---------|------| | **快速上线验证** | 少样本Prompt | 无需训练,快速迭代 | | **深度业务适配** | SFT微调 | 专属工具调用范式,效果更优 | | **复杂多工具场景** | ReAct + DAG规划 | 推理+行动+环境观察闭环 | --- **延伸阅读**: 1. Schick et al., "Toolformer: Language Models Can Teach Themselves to Use Tools" (ICLR 2023) 2. Yao et al., "ReAct: Synergizing Reasoning and Acting in Language Models" (ICLR 2023) 3. Liu et al., "Tool Learning with Foundation Models" (2023) 4. Zhou et al., "InternLM: A Multilingual Language Model with Progressively Enhanced Capabilities" (2023) 5. Patil et al., "Gorilla: Large Language Models Connect with Tools" (2023)