ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【零基础入门 LLM 开发 · Day 8】:Function Calling——让 AI 会“用“工具

【零基础入门 LLM 开发 · Day 8】:Function Calling——让 AI 会“用“工具 【零基础入门 LLM 开发 · Day 8】Function Calling——让 AI 会用工具先纠正一个常见误解Function Calling不是AI 自己去执行函数。AI 是个活在服务器里的大脑它碰不到你的电脑。它真正能做的是告诉你我想调用 get_weather参数是 location北京然后——由你的代码替它执行再把结果喂回给它。一句话总结AI 出主意你动手结果再汇报给 AI。完整流程图先看懂再写代码用户提问 ──► 第一次请求带上工具说明书 tools │ ▼ AI 返回 tool_calls想调用什么函数参数 │ ▼ 你的代码本地执行真正的 Python 函数 │ ▼ 把执行结果以 role:tool 塞回 messages │ ▼ 第二次请求 ──► AI 结合结果生成最终回答完整代码importosimportjsonfromdotenvimportload_dotenvfromopenaiimportOpenAI load_dotenv()clientOpenAI(api_keyos.getenv(YUMC_MODEL_API_KEY),base_urlos.getenv(YUMC_MODEL_BASE_URL),)# 1. 定义一个普通的 Python 函数就是本地工具defget_weather(location:str)-str:if北京inlocation:return晴天25度elif上海inlocation:return雷阵雨28度return未知天气# 2. 告诉大模型有这个工具可用JSON Schema 说明书tools[{type:function,function:{name:get_weather,description:获取指定城市的当前天气,parameters:{type:object,properties:{location:{type:string,description:城市名称:如北京}},required:[location],},},}]# 3. 用户提问messages[{role:user,content:今天北京和上海的天气怎么样}]# 4. 第一次请求AI 决定要不要调用工具responseclient.chat.completions.create(modelyumcode-pro,messagesmessages,toolstools,tool_choiceauto,# 让 AI 自己决定用不用工具)ai_messageresponse.choices[0].message messages.append(ai_message)# 把 AI 决定调用工具的记录存入历史# 5. 检查 AI 是否要调用工具ifai_message.tool_calls:fortool_callinai_message.tool_calls:func_nametool_call.function.name func_argsjson.loads(tool_call.function.arguments)# 参数是 JSON 字符串print(fAI 想调用{func_name}({func_args}))# 6. 本地真正执行函数iffunc_nameget_weather:resultget_weather(**func_args)print(f本地函数执行结果:{result})# 7. 把执行结果塞回 messages汇报给 AImessages.append({role:tool,tool_call_id:tool_call.id,content:result})# 8. 第二次请求AI 根据工具结果生成最终人类可读的回答final_responseclient.chat.completions.create(modelyumcode-pro,messagesmessages)print(\nAI 最终回复:,final_response.choices[0].message.content)逐段拆解最容易懵的 4 个点① tools 里的 JSON Schema 是什么是写给 AI 看的工具说明书函数叫什么、干什么用、需要哪些参数、哪些必填。AI 靠读这份说明决定要不要用、怎么用。说明书怎么写才好用明天专门讲。②tool_choiceauto让 AI 自己判断需要工具就用闲聊就直接答。不要看到查天气四个字就无脑调用。③tool_call.function.arguments是字符串AI 返回的参数是 JSON字符串{location: 北京}必须json.loads()转成字典才能get_weather(**func_args)这样展开传参。④ 回传结果时的三个讲究role必须是tooltool_call_id必须对应上AI 才知道这份结果是谁要的有几个tool_calls就回传几份结果用户问了两个城市AI 会一次性发起两次调用。运行效果AI 想调用get_weather ({location: 北京}) 本地函数执行结果:晴天25度 AI 想调用get_weather ({location: 上海}) 本地函数执行结果:雷阵雨28度 AI 最终回复: 北京今天是晴天25度上海有雷阵雨28度。出行记得带伞这就是 Agent 的原子操作。Day 14-15 的多 Agent 系统不过是把这个流程套了好几层。今日踩坑点忘 append AI 的 tool_calls 消息第二次请求会报错——messages 必须完整连贯。arguments 没json.loads拿到的是字符串**展开会炸。result必须是字符串函数返回了字典/对象先str()或json.dumps()再塞回去。安全提醒AI 只是建议调用执行权和参数校验永远在你手里绝不要把 AI 的输出直接拼进 SQL 或 shell 命令。今日小练习必做新增一个get_current_time()工具返回当前时间跑通现在几点了。进阶让 AI 同时查三个城市观察tool_calls列表的长度。明日预告Day 9同一个工具说明书换个写法AI 的行为天差地别——description 是门手艺。附录完整练习代码openAITools.pyimportosimportjsonfromdotenvimportload_dotenvfromopenaiimportOpenAI load_dotenv()clientOpenAI(api_keyos.getenv(YUMC_MODEL_API_KEY),base_urlos.getenv(YUMC_MODEL_BASE_URL),)# 1.定义一个普通的python 函数defget_weather(location:str)-str:模拟获取天气的函数if北京inlocation:return晴天25度elif上海inlocation:return雷阵雨28度return未知天气# 2. 告诉大模型有这个工具可用tools[{type:function,function:{name:get_weather,description:获取指定城市的当前天气,parameters:{type:object,properties:{location:{type:string,description:城市名称:如北京}},required:[location],},},}]# 3.用户提问messages[{role:user,content:今天北京和上海的天气怎么样}]# 4. 第一次请求AI 决定调用工具responseclient.chat.completions.create(modelyumcode-pro,messagesmessages,toolstools,tool_choiceauto,# 让AI 自己决定用不用工具)ai_messageresponse.choices[0].message messages.append(ai_message)# 把AI 决定调用工具的记录存入历史# 5.检查AI 是否要调用工具ifai_message.tool_calls:fortool_callinai_message.tool_calls:func_nametool_call.function.name func_argsjson.loads(tool_call.function.arguments)print(fAI 想调用{func_name}({func_args}))# 实际执行我们的python 函数iffunc_nameget_weather:resultget_weather(**func_args)print(f本地函数执行结果:{result})# 6.把函数执行的结果塞回messages 里告诉AImessages.append({role:tool,tool_call_id:tool_call.id,content:result})# 7.第二次请求AI 根据工具结果生成最终人类可读的回答final_responseclient.chat.completions.create(modelyumcode-pro,messagesmessages)print(\nAI 最终回复:,final_response.choices[0].message.content)
返回列表