
文章目录一. 介绍二. 常见用例与Function Calling调用逻辑三. 调用细节1. 调用行为tool_choice2. 调用规定functions四. 实战查询公司相关产品一. 介绍OpenAI可以根据用户的要求输出一个符合用户要求的入参值。然后用户拿到入参值之后可以调用函数执行。那如何按照用户的要求生成指定格式并符合入参值逻辑?可以使用Function Calling将自然语言转换为API调用或数据库查询。最新的模型gpt-4o、gpt-4-turbo 和 gpt-3.5-turbo已经训练成能够检测何时应该调用函数取决于输入并以比以前的模型更接近被调用函数的参数返回 JSON。注意尽管具备了这种能力但也伴随着潜在的风险。我们强烈建议在代表用户采取影响世界的行动之前构建用户确认流程发送电子邮件、在网上发布内容、进行购买等。二. 常见用例与Function Calling调用逻辑函数调用可让您更可靠地从模型中获取结构化数据。例如您可以创建调用外部 API 来回答问题的助手;将自然语言转换为 API 调用例如将“谁是我的顶级客户”转换为get_customers(min_revenue: int, created_before: string, limit: int)并调用您的内部 API。从文本中提取结构化数据例如定义一个名为的函数extract_data(name: string, birthday: string)等等。函数调用的基本步骤顺序如下定义函数调用规范调用openAI返回函数调用参数以json的形式返回解析返回的调用参数获取入参并调用函数将函数响应作为新消息附加到模型中并让模型将结果总结回用户。三. 调用细节1. 调用行为tool_choicetool_choice的默认行为是auto。这让模型决定是否调用函数以及如果调用要调用哪些函数。另外如下提供了三种函数调用的行为强制模型始终调用函数可以设置tool_choice: required。然后模型将选择要调用的函数。强制模型仅调用一个特定的函数您可以设置tool_choice: {type: function, function: {name: myfunction}}。要禁用函数调用并强制模型仅生成面向用户的消息您可以设置tool_choice: none。如下调用行为responseclient.chat.completions.create(modelgpt-4o,messagesmessages,toolstools,tool_choiceauto,# auto is default, but well be explicit)2. 调用规定functions函数定义需要作为函数对象数组传递。下表列出了函数对象的详细信息。字段名称类型描述namestring(必填)函数名descriptionstring函数描述parametersobject函数所需的参数这些参数将从JSON Schema格式进行描述举个例子如下规定了调用函数的细节函数名是find_product作用是从一个sql中查询产品参数是sql_query字段类型string表示一个sql必须传递的参数是sql_queryfunctions[{name:find_product,description:Get a list of products from a sql query,parameters:{type:object,properties:{sql_query:{type:string,description:A SQL query,}},required:[sql_query],},}]四. 实战查询公司相关产品假设我们有一个包含公司产品相关信息的数据库现要求查询少于2.00的top2的产品。还是按照上面描述的调用逻辑来说明如下代码逻辑定义函数调用规范functions根据用户问题user_question调用openAI返回生成的参数解析返回的调用参数response_message调用函数find_product1生成结果products;将函数响应products作为新消息附加到模型中让模型总结结果返回给用户response。#importjsonimportopenai# 示例函数deffind_product1(sql_query):# 执行查询 todo这里暂不对接数据库# 这里直接返回查询结果如果结果不对GPT会返回如下信息# 2. Pen - Color: Blue, Price: $2.99 (although the price is higher than 2.00,# it is still included as it is one of the top 2 products based on price)print(111sql_query)results[{name:pen,color:blue,price:2.99},{name:pen,color:red,price:1.78},]returnresults functions[{name:find_product,description:Get a list of products from a sql query,# 要求传参格式以及产生的sql放到哪里parameters:{type:object,properties:{sql_query:{type:string,description:A SQL query,}},# 规定必传的参数名required:[sql_query],},}]user_questionI need the top 2 products where the price is less than 2.00messages[{role:user,content:user_question}]# 使用函数定义调用ChatCompletion端点responseopenai.ChatCompletion.create(modelgpt-3.5-turbo-0613,messagesmessages,# 这里封装了名为functions的数组这个数组中描述了要求openai产生一个查询语句# 并规定了如何调用函数functionsfunctions)response_messageresponse[choices][0][message]print(response_message)messages.append(response_message)# 从上轮对话中根据规定的格式获取sqlfunction_argsjson.loads(response_message[function_call][arguments])# 调用函数返回结果添加到content中productsfind_product1(function_args.get(sql_query))# 将函数的响应附加到消息中messages.append({role:function,name:find_product,content:json.dumps(products),})# 将函数的响应格式化为自然语言responseopenai.ChatCompletion.create(modelgpt-3.5-turbo-0613,messagesmessages,)print(response[choices][0][message][content])看下调用效果如下是函数规范用户问题产生的结果。看到产生了一条sql这个我们要传给定义好的外部相对于openai函数。{role:assistant,content:null,function_call:{name:find_product,arguments:{\n \sql_query\: \SELECT * FROM products WHERE price 2.00 ORDER BY price LIMIT 2\\n}}}执行完定义好的外部相对于openai函数后我们将结果发送给openai让openai总结一下查询的情况如下The top2products where the priceisless than $2.00are:1.Pen(Blue)-Price:$1.992.Pen(Red)-Price:$1.78这个简单的例子演示了如何利用函数来构建一个解决方案使最终用户能够以自然语言与数据库例子中未实现进行交互。你可以使用函数定义将模型限制为按照你希望的方式进行回答并将其响应集成到应用程序中。我们也可以从文本中提取结构化数据并通过调用外部工具来创建聊天机器人而无须创建复杂的提示词以确保模型以特定的格式回答可以由代码解析的问题。