一、FunctionCalling——大模型的外部能力接口,实现工具调用与任务执行

张开发
2026/4/10 13:24:04 15 分钟阅读

分享文章

一、FunctionCalling——大模型的外部能力接口,实现工具调用与任务执行
Function Calling函数调用是LLM 工程化、AI 智能体的核心基石。如果大模型是大脑那 Function Calling 就是让大脑「指挥手脚干活」的标准协议——它规定了大模型如何描述工具、如何输出调用指令、程序如何执行、如何回传结果。一、Function Calling 是什么一句话定义Function Calling 是一套固定的 JSON 数据协议让大模型以结构化格式告诉程序我需要调用哪个函数、传什么参数。它的核心分工LLM理解意图 → 生成规范的调用格式程序解析格式 → 执行函数 → 返回结果LLM整合结果 → 生成最终回答二、Function Calling 标准格式拆解Function Calling两套核心格式工具定义格式告诉 LLM 有什么函数可用模型返回格式LLM 告诉程序要调用什么2.1 格式1工具定义格式传给大模型的格式描述函数的名字、功能、参数。完整标准结构[ { type: function, function: { name: 函数名称英文程序中真实存在, description: 函数功能描述LLM靠这个判断是否调用, parameters: { type: object, properties: { 参数1: { type: 参数类型string/number/boolean, description: 参数说明 }, 参数2: { type: string, description: 参数说明 } }, required: [必填参数1] } } } ]字段作用必须name函数名程序与模型的唯一对应标识✅ 必须description功能描述LLM 调用的依据✅ 必须写不清楚就调用失败parameters参数定义容器✅ 必须properties所有参数的详细描述✅ 必须required声明哪些参数必填✅ 推荐2.2 格式2模型返回格式LLM 接收到工具描述后需要调用时会返回固定 JSON 格式{ role: assistant, content: null, tool_calls: [ { function: { name: 调用的函数名, arguments: {\参数1\:\值1\,\参数2\:\值2\} } } ] }关键字段name模型选择的函数arguments模型生成的参数JSON 字符串三、Function Calling 怎么用5 步法定义工具函数写业务代码计算器/查天气/查数据库封装为标准 FC 格式上文的工具格式传给 LLM让模型知道可用工具LLM 返回调用指令程序解析并执行函数把结果回传给 LLM生成最终答案四、JSON 工具封装1. 手动封装 JSON步骤 1定义原始函数# 原始业务函数 def calculator(num1: float, num2: float, operator: str) - str: if operator : return f结果{num1num2} if operator -: return f结果{num1-num2} if operator *: return f结果{num1*num2} if operator /: return f结果{num1/num2} return 无效运算符步骤 2严格按照标准封装 JSON# 手动封装计算器工具 JSON tool_json [ { type: function, function: { name: calculator, # 对应函数名 description: 计算器工具支持加减乘除计算, # 功能描述 parameters: { type: object, properties: { num1: { type: number, description: 第一个计算数字 }, num2: { type: number, description: 第二个计算数字 }, operator: { type: string, description: 运算符支持 - * / } }, required: [num1, num2, operator] # 必填参数 } } } ]步骤 3多工具合并封装如果有多个工具直接放在数组里即可# 双工具封装计算器 天气查询 tools_json [ # 计算器工具 { type: function, function: {name: calculator, ...: ...} }, # 天气查询工具 { type: function, function: {name: weather_query, ...: ...} } ]步骤 4原生调用验证无框架直接把 JSON 传给模型完成调用。4.2 LangChain 自动封装核心原理函数与JSON 映射关系Python 函数元素自动封装为 JSON 字段函数名function.name函数注释docstringfunction.description参数类型注解properties.type参数说明properties.description查看 LangChain 自动生成的 JSON这是最直观的验证方式运行代码就能看到封装结果from langchain.tools import tool # 1. 定义工具函数 tool def calculator(num1: float, num2: float, operator: str) - str: 计算器工具支持加减乘除计算 if operator : return f结果{num1num2} return 计算失败 # 2. 打印自动封装的 JSON 格式 print( LangChain 自动封装的工具 JSON ) print(calculator.args_schema.model_json_schema()) LangChain 自动封装的工具 JSON {description: 计算器工具支持加减乘除计算, properties: {num1: {title: Num1, type: number}, num2: {title: Num2, type: number}, operator: {title: Operator, type: string}}, required: [num1, num2, operator], title: calculator, type: object}五、实战代码可直接运行用双工具计算器天气查询完整演示框架使用 LangChain自动处理格式无需手写 JSON。1. 完整可执行代码from langchain_openai import ChatOpenAI from langchain.tools import tool from langchain.agents import create_tool_calling_agent, AgentExecutor from langchain.prompts import ChatPromptTemplate import os from dotenv import load_dotenv # 加载配置 load_dotenv() # 1. 初始化模型 llm ChatOpenAI( modelqwen3.5-flash, api_keyos.getenv(DASHSCOPE_API_KEY), base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1, temperature0.1, ) # 2. 定义工具自动封装FC格式 # 工具1计算器 tool def calculator(num1: float, num2: float, operator: str) - str: 计算器工具执行加减乘除 参数 num1: 数字1 num2: 数字2 operator: 运算符( - * /) if operator : return f结果{num1num2} if operator -: return f结果{num1-num2} if operator *: return f结果{num1*num2} if operator /: return f结果{num1/num2} return 无效运算符 # 工具2天气查询 tool def weather_query(city: str) - str: 查询城市天气 city: 城市名称 data {北京:晴 25℃,上海:多云 28℃,广州:小雨 26℃} return data.get(city, 暂无数据) # 工具列表 tools [calculator, weather_query] # 3. 构建调用流程 prompt ChatPromptTemplate.from_messages([ (system, 你是工具调用助手必须严格按格式调用工具), (human, {input}), (placeholder, {agent_scratchpad}), ]) # 创建智能体自动处理FC格式 agent create_tool_calling_agent(llm, tools, prompt) executor AgentExecutor( agentagent, toolstools, verboseTrue, # 打印完整格式日志 max_iterations3 ) # 4. 执行测试 if __name__ __main__: # 测试1计算 print( 测试110乘以6.5 ) print(executor.invoke({input: 10乘以6.5等于多少})[output]) # 测试2天气 print(\n 测试2查询北京天气 ) print(executor.invoke({input: 北京今天天气怎么样})[output])3. 运行日志 测试110乘以6.5 Entering new AgentExecutor chain... Invoking: calculator with {num1: 10, num2: 6.5, operator: *} 结果65.010乘以6.5等于65。 Finished chain. 10乘以6.5等于65。 测试2查询北京天气 Entering new AgentExecutor chain... Invoking: weather_query with {city: 北京} 晴 25℃北京今天天气晴朗气温25℃。 Finished chain. 北京今天天气晴朗气温25℃。五、Function Calling 用法核心规则1. 工具描述决定调用成功率LLM 不看代码只看描述描述越清晰调用越准确。2. 参数类型必须严格定义数字、字符串不能混淆否则格式解析失败。3. 必须限制调用次数防止无限循环生产环境必加max_iterations。六、总结Function Calling 一套固定 JSON 协议两个核心格式工具定义格式 模型返回格式5步固定用法定义工具→封装格式→传给LLM→执行→回传工程落地工具描述是关键框架自动处理格式

更多文章