函数调用:让大模型调用外部工具
大语言模型擅长语言理解与生成,但它有两道硬边界:一是知识停留在训练时刻,无法获取实时天气、股价、订单状态;二是它本身不能”做事”,无法发消息、改数据库、调用 API。函数调用(Function Calling,也称工具调用 Tool Calling)正是为突破这两道边界而生:让模型在需要时输出”我想调用哪个函数、参数是什么”,由宿主程序真正执行,再把结果回灌给模型继续生成。
机制:模型出意图,宿主出动作
函数调用不是让模型直接运行代码,而是一次”协商”。典型流程如下:
- 宿主把用户问题与一份工具清单(functions 或 tools)一起发给模型。
- 模型判断是否需要调用工具。若需要,返回一个结构化调用意图(如 tool_calls),包含函数名与参数;若不需要,直接给出自然语言回答。
- 宿主解析调用意图,真正执行函数,拿到结果。
- 宿主把”函数结果”作为新消息回灌模型,模型据此生成最终答复。
用户: 上海今天天气如何?
模型: 调用 get_weather(city="上海")
宿主: 执行 get_weather 返回 {temp: 22, cond: "多云"}
模型: 上海今天多云,气温 22 摄氏度。
关键在于:执行权限始终在宿主,模型只负责”决策调用什么、填什么参数”。
工具 schema 描述规范
每个工具用一份 schema 描述,主流格式贴近 JSON Schema。三要素最关键:
- name:简短、唯一的英文函数名,模型据此选择。
- description:用自然语言说明”这个工具做什么、何时该用”,描述越清楚,模型选错的概率越低。
- parameters:用 JSON Schema 描述入参的类型、是否必填与说明。
{
"name": "get_weather",
"description": "查询指定城市的当前天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名,如 上海"},
"unit": {"type": "string", "enum": ["c", "f"]}
},
"required": ["city"]
}
}
经验上,参数定义要收口(枚举、必填明确),描述要讲清触发条件,能显著降低模型填错参或乱调用。
与 ReAct 和 Agent 的关系
ReAct(Reason and Act,Yao 等人 2022,arXiv:2210.03629,【已核验】)是最早把”推理轨迹与动作”交替写进提示的范式:模型先思考,再决定动作,再观察结果。函数调用可以看作是 ReAct 思想的工程化落地——把”动作”标准化为结构化 tool_calls,由框架可靠解析,而非靠模型在自由文本里抠出命令。
因此,函数调用是构建 Agent 的基石:一个 Agent 往往就是”模型 + 一批工具 + 循环执行”的组合。区别在于,单轮函数调用偏”补数据”,多轮循环调用加状态管理才构成自主 Agent。
并行调用与错误处理
现代接口支持一次返回多个 tool_calls(并行调用),适合彼此无依赖的查询,能显著降低延迟。宿主应并行执行并汇总结果。
错误处理要前置:工具可能超时、返回异常或参数非法。建议把错误也当作”观测”回灌模型,让它重试、换参数或向用户说明,而不是让整条链路崩掉。对可重试操作加重试与超时上限,对不可逆操作必须人工确认。
安全:权限最小化与人工确认
工具一旦能改现实,就不再是纯文本游戏。三项底线:
- 权限最小化:每个工具只给完成任务所需的最小权限,数据库只读优先于读写。
- 人工确认:发邮件、转账、删除等高风险动作,落地前必须显式获得用户确认。
- 输入边界:对模型生成的参数做校验与白名单,防止 Prompt Injection 借工具越权。
函数调用把”语言模型”变成”能办事的助手”,但执行权与责任始终在宿主一方。
小结
函数调用让大模型突破”知识时效”与”不能执行动作”两道边界:模型只输出结构化调用意图(函数名与参数),由宿主真正执行并把结果回灌,最终生成答复。规范好工具的 name、description 与 parameters(JSON Schema)是准确率的关键;它与 ReAct 一脉相承,是构建 Agent 的基石。并行调用能降延迟,但须配重试与超时;安全上坚持权限最小化、高风险动作人工确认、对参数做校验,才能让”能调用工具”既好用又可控。
参考与延伸阅读
- OpenAI Function Calling 文档(2023 年 6 月发布,【已核验】):https://platform.openai.com/docs/guides/function-calling
- ReAct 论文(Yao 等人,arXiv:2210.03629,【已核验】):https://arxiv.org/abs/2210.03629
- JSON Schema 规范:https://json-schema.org/
- Anthropic Tool Use 文档(【已核验】):https://docs.anthropic.com/en/docs/build-with-claude/tool-use
- LangChain 工具调用文档:https://python.langchain.com/docs/concepts/tool_calling/