公司动态
FunctionCalling 完整原理(大模型工具调用)
目录一、核心定义二、底层核心原理拆解1. 前置给模型注入函数元数据系统提示 函数描述 JSON2. 阶段 1推理判断 —— 模型自主决策要不要调用工具3. 阶段 2结构化输出 —— 强制生成标准函数调用 JSON方案 APrompt 约束通用开源方案如 Llama、Qwen方案 B预训练 格式约束闭源模型GPT、Claude、文心一言4. 阶段 3本地程序拦截、解析、执行函数最关键模型不执行代码5. 阶段 4工具结果回灌上下文模型生成最终回答6. 多轮循环调用复杂场景三、两种主流实现架构1. 云端厂商原生 Function CallingGPT4、通义千问、文心一言2. 开源模型本地实现Qwen、Llama、GLM四、底层技术细节为什么模型能精准生成参数五、完整端到端流程时序图六、典型应用场景七、常见误区澄清一、核心定义Function Calling函数调用 / 工具调用是大语言模型与外部工具打通的能力 LLM 本身只会生成文本无法联网、查数据库、执行代码、调用接口通过 Function Calling模型能识别用户需求 → 生成结构化函数调用参数 → 交给程序执行工具 → 把工具结果丢回模型 → 模型整理自然语言回答。本质让大模型具备调用外部能力弥补纯文本模型无实时数据、无计算、无操作能力的短板。二、底层核心原理拆解1. 前置给模型注入函数元数据系统提示 函数描述 JSON调用前开发者需要把可用工具列表以标准 JSON 格式传给大模型上下文包含函数名称name功能描述description模型靠这段文字理解什么时候该用这个函数入参定义parameters参数名、类型、说明、是否必填、枚举值示例元数据片段json{ name: get_weather, description: 查询指定城市实时天气, parameters: { type: object, properties: { city: {type: string, description: 城市名称} }, required: [city] } }同时在系统 Prompt 告知模型规则你可以调用下面工具需要查询外部信息时不要直接回答输出固定 JSON 格式函数调用禁止编造数据。2. 阶段 1推理判断 —— 模型自主决策要不要调用工具模型读取用户问题 函数列表做逻辑判断问题仅靠自身知识库能回答 → 直接输出自然语言不走函数调用问题需要实时 / 外部数据天气、日期、数据库、计算器、联网搜索→ 进入函数生成逻辑。关键点判断逻辑完全由 LLM 自身推理完成不需要额外分类模型。3. 阶段 2结构化输出 —— 强制生成标准函数调用 JSON普通对话模型输出自由文本Function Calling 通过两种方案约束输出结构化参数方案 APrompt 约束通用开源方案如 Llama、Qwen依靠强指令引导模型只输出指定 JSON靠提示词规范格式有概率输出错乱文本需要做格式校验重试。方案 B预训练 格式约束闭源模型GPT、Claude、文心一言厂商在微调阶段专门学习工具调用 JSON 格式同时底层加格式校验层推理时限制 token 输出空间只能生成合法 JSON大幅减少格式错误。模型输出的标准调用报文示例json{ name: get_weather, arguments: {city: 深圳} }4. 阶段 3本地程序拦截、解析、执行函数最关键模型不执行代码大模型只会生成调用指令不会真正执行工具完整流程必须依赖上层业务程序业务代码接收模型返回内容正则 / JSON 解析识别出函数调用校验函数名、参数合法性分发到对应本地函数 / HTTP 接口 / 数据库 / 搜索工具执行获取工具返回结果天气数据、计算结果、网页内容。举个链路 用户问「深圳今天多少度」 模型输出{name:get_weather,city:深圳}业务代码调用天气 API → 返回{temp:32,weather:晴}5. 阶段 4工具结果回灌上下文模型生成最终回答把原始用户问题 刚刚的函数调用记录 工具返回数据拼接成完整上下文再次丢给大模型二次推理 此时模型拥有真实外部数据不再需要调用工具直接整理成通顺自然语言回复用户。上下文示例结构用户深圳今天多少度模型输出工具调用调用 get_weather (深圳)工具返回温度 32 度晴天传入全部历史模型生成回答深圳今日晴天气温 32 摄氏度6. 多轮循环调用复杂场景如果一次工具调用拿不到完整信息模型会连续多次调用函数 例「对比深圳和北京今日气温计算温差」调用 get_weather (深圳)调用 get_weather (北京)调用 calc (a32,b28)汇总数据回答温差 4 度三、两种主流实现架构1. 云端厂商原生 Function CallingGPT4、通义千问、文心一言厂商底层内置工具调用微调 格式强制解码器开箱即用API 专门区分message.roletool_call、message.roletool标准消息结构无需自己强约束 Prompt稳定性高。2. 开源模型本地实现Qwen、Llama、GLM无原生支持纯 Prompt 工程实现系统 Prompt 写明所有函数定义 输出格式推理后代码捕获输出捕获 JSON 失败则重试对话手动封装工具执行逻辑回传结果二次生成。四、底层技术细节为什么模型能精准生成参数上下文学习 ICL函数描述、参数说明作为上下文示例模型通过类比理解入参对应关系微调优化闭源标配厂商用百万级「用户问题 - 函数调用」样本微调学习映射关系输出约束Constrained Decoding推理阶段限制可生成 token 集合只能输出 JSON 合法字符杜绝乱码、自由文本。五、完整端到端流程时序图用户提问业务层组装系统提示词 函数定义列表 用户问题 → 请求 LLMLLM 推理输出工具调用 JSON业务代码解析 JSON执行对应外部工具拿到工具返回数据构造 tool 消息存入对话历史再次请求 LLM带上全部对话 工具结果LLM 基于真实数据输出自然语言答案返回给用户六、典型应用场景联网搜索调用搜索引擎获取实时新闻、资料代码 / 计算器数学运算、数据统计数据库查询SQL 生成并查询业务库第三方接口天气、快递、股票、地图智能 Agent自动多工具循环完成复杂任务七、常见误区澄清❌ 大模型会执行函数 ✅ 模型只生成调用文本执行永远是本地业务代码❌ Function Calling 就是简单字符串匹配 ✅ 是模型语义推理能自动抽取问题隐含参数❌ 所有大模型原生支持 ✅ 开源基础模型无原生能力需要 Prompt / 微调改造。