45-Function-Calling-让AI调用你的Python函数
文章目录【42.PythonAI】大模型Function Calling让AI调用你的Python函数从聊天机器人到智能助手导入语1 ~ Function Calling的核心流程2 ~ 定义Tool告诉AI你有哪些函数2.1 JSON Schema规范2.2 实际实现函数3 ~ 完整实现处理Function Calling循环4 ~ 实战AI助手——查数据库发邮件4.1 定义多个Tool4.2 实现函数4.3 完整对话处理思考 总结结尾【42.PythonAI】大模型Function Calling让AI调用你的Python函数从聊天机器人到智能助手文章简介本文深入拆解大模型Function Calling函数调用的完整机制。从Tool定义的JSON Schema规范讲起到单轮与多轮对话中的函数调用链实现再到一个可自动查数据库发送邮件的AI助手完整实战。文中包含Mermaid时序图展示Function Calling的请求-响应-执行-反馈全链路并对比了不同国产模型对Function Calling的支持现状适合想让AI从只会聊天升级为能执行操作的开发者。 个人主页源码骑士❄专栏传送门《Android开发基础》《python基础课程》⭐️热衷从源码视角拆解技术底层原理将复杂架构讲得通俗易懂 源码骑士的简介5年Android Framework系统开发经验曾主导多项系统级性能优化专项技术栈覆盖Android系统全链路Binder/Handler/AMS/WMS/启动流程及Java后端全家桶Spring MyBatis Redis Oracle累计产出原创技术文章100篇文章以流程图为特色被读者评价为看一篇胜过啃一周源码导入语你花了两周搭了一个AI客服Bot效果不错。但老板问“它能查订单状态吗能帮用户修改收货地址吗”——你沉默了。如果AI只能聊天、不能执行操作它永远是一个有趣的玩具而不是有用的工具。Function Calling就是解决这个痛点的关键能力——让大模型决定该调用哪个函数你来实现这个函数把结果返回给模型模型再用自然语言告诉用户。这篇文章就是带你从零实现一个能查数据库、发邮件的AI助手。整个过程你会彻底理解Function Calling的请求-响应-执行循环。1 ~ Function Calling的核心流程数据库/API大模型你的AI应用用户数据库/API大模型你的AI应用用户模型判断需要调用get_order_status函数帮我查订单发送消息 可用函数列表返回函数调用请求function_nameget_order_statusarguments{order_id:12345}执行 get_order_status(12345)返回 {status:已发货,tracking:SF123456}把函数执行结果发送给模型您的订单您的订单2 ~ 定义Tool告诉AI你有哪些函数2.1 JSON Schema规范# 定义一个查天气的函数描述weather_tool{type:function,function:{name:get_weather,description:获取指定城市的天气信息。使用此函数当用户询问天气相关问题。,parameters:{type:object,properties:{city:{type:string,description:城市名称如北京、上海,},unit:{type:string,enum:[celsius,fahrenheit],description:温度单位,}},required:[city],}}}2.2 实际实现函数defget_weather(city:str,unit:strcelsius)-dict:实际查询天气的函数这里用模拟数据# 真实场景调用天气APIweather_data{北京:{temp:28,humidity:65,condition:晴},上海:{temp:32,humidity:80,condition:多云},}dataweather_data.get(city,{temp:25,humidity:50,condition:未知})return{city:city,temperature:data[temp],humidity:data[humidity],condition:data[condition],unit:unit,}3 ~ 完整实现处理Function Calling循环importjsonfromopenaiimportOpenAI clientOpenAI()# 函数注册表AVAILABLE_FUNCTIONS{get_weather:get_weather,}defrun_conversation(user_message:str):处理一轮对话自动判断是否需要调用函数messages[{role:user,content:user_message}]tools[weather_tool]# 第一轮把用户消息和可用工具发给模型responseclient.chat.completions.create(modelgpt-3.5-turbo,messagesmessages,toolstools,tool_choiceauto,# 让模型自己决定是否调用函数)response_messageresponse.choices[0].message tool_callsresponse_message.tool_calls# 检查模型是否决定调用函数iftool_calls:# 把模型的回复加入消息历史messages.append(response_message)fortool_callintool_calls:function_nametool_call.function.name function_argsjson.loads(tool_call.function.arguments)print(f 调用函数:{function_name})print(f 参数:{function_args})# 执行函数function_to_callAVAILABLE_FUNCTIONS[function_name]function_resultfunction_to_call(**function_args)# 把函数执行结果加入消息历史messages.append({tool_call_id:tool_call.id,role:tool,name:function_name,content:json.dumps(function_result,ensure_asciiFalse),})# 第二轮把函数结果发给模型让它生成最终回答second_responseclient.chat.completions.create(modelgpt-3.5-turbo,messagesmessages,)returnsecond_response.choices[0].message.content# 模型不调用函数直接返回returnresponse_message.content# 测试print(run_conversation(北京今天天气怎么样))print(---)print(run_conversation(上海的温度是多少华氏度))4 ~ 实战AI助手——查数据库发邮件4.1 定义多个Toolimportsqlite3importsmtplibfromemail.mime.textimportMIMEText# Tool 1: 查询订单order_tool{type:function,function:{name:query_order,description:根据订单号查询订单信息包括状态、金额、收货地址,parameters:{type:object,properties:{order_id:{type:string,description:订单号}},required:[order_id],}}}# Tool 2: 发送邮件email_tool{type:function,function:{name:send_email,description:发送邮件给指定收件人,parameters:{type:object,properties:{to:{type:string,description:收件人邮箱},subject:{type:string,description:邮件主题},body:{type:string,description:邮件正文},},required:[to,subject,body],}}}4.2 实现函数defquery_order(order_id:str)-dict:从数据库查询订单connsqlite3.connect(orders.db)cursorconn.execute(SELECT * FROM orders WHERE id ?,(order_id,))rowcursor.fetchone()conn.close()ifrow:return{order_id:row[0],status:row[1],amount:row[2],address:row[3],}return{error:f订单{order_id}不存在}defsend_email(to:str,subject:str,body:str)-dict:发送邮件try:msgMIMEText(body,plain,utf-8)msg[Subject]subject msg[To]to# 实际发送此处为示例需配置SMTP# with smtplib.SMTP(smtp.example.com) as server:# server.send_message(msg)return{success:True,message:f邮件已发送至{to}}exceptExceptionase:return{success:False,error:str(e)}AVAILABLE_FUNCTIONS{query_order:query_order,send_email:send_email,}ALL_TOOLS[order_tool,email_tool]4.3 完整对话处理defai_assistant(user_message:str)-str:AI助手入口messages[{role:user,content:user_message}]# 循环处理因为一个请求可能需要多次函数调用whileTrue:responseclient.chat.completions.create(modelgpt-3.5-turbo,messagesmessages,toolsALL_TOOLS,tool_choiceauto,)msgresponse.choices[0].message# 没有函数调用 → 模型给出了最终回答ifnotmsg.tool_calls:returnmsg.content# 有函数调用 → 执行并继续循环messages.append(msg)fortool_callinmsg.tool_calls:func_nametool_call.function.name func_argsjson.loads(tool_call.function.arguments)resultAVAILABLE_FUNCTIONS[func_name](**func_args)messages.append({tool_call_id:tool_call.id,role:tool,name:func_name,content:json.dumps(result,ensure_asciiFalse),})# 使用示例print(ai_assistant(查一下订单#12345的状态然后发邮件到admintest.com通知负责人))思考 总结Function Calling把AI从嘴升级成手模型只负责决策——调用哪个函数、传什么参数函数的实际执行完全在你的控制之下。Tool定义的质量决定调用准确率description不仅要写清楚函数做什么还要告诉模型什么时候该用。写得模糊 → 模型乱调用。函数调用可以串联上面的例子中AI自动完成先查订单→再发邮件的串联操作。关键在于你用while True循环让模型多轮调用。国产模型支持差异大GPT和DeepSeek的Function Calling比较成熟通义千问和GLM的支持在快速追赶。上线前务必测试目标模型的调用准确率。安全是第一优先级模型调用什么函数、传什么参数完全是AI决定的。对敏感操作删除、转账必须加人工确认或权限校验。Function Calling是AI应用从Demo走向Product的分水岭。结尾各位小伙伴本文的内容到这里就全部结束了源码骑士在这里再次感谢您的阅读源码骑士 — Android Framework 全栈开发关注跟博主一起从源码视角深耕底层原理见证每一次成长❤️点赞让优质内容被更多人看见让知识传递更有力量⭐收藏BatchProcessor代码存好下个批量任务直接复用评论你批量调API最高用过多少并发评论区交流一键四连不要忘记给博主一键四连哦今日并发调优达成️寄语慢不是模型的问题是你的调用方式没有发挥它的并发能力。结语现在就把本文的Function Calling循环代码拷进你的项目给你的AI装上第一个技能——查天气也好查数据库也好。一旦跑通你会打开一个全新的世界。不要忘记给博主一键四连哦