书店网站开发目的和意义,运城网站建设兼职,在线定制英文名,字体设计生成器1 函数调用 虽然大模型能解决很多问题#xff0c;但大模型并不能知晓一切。比如#xff0c;大模型不知道最新消息(GPT-3.5 的知识截至 2021年9月#xff0c;GPT-4 是 2023 年12月)。另外#xff0c;大模型没有“真逻辑”。它表现出的逻辑、推理#xff0c;是训练文本的统计…1 函数调用 虽然大模型能解决很多问题但大模型并不能知晓一切。比如大模型不知道最新消息(GPT-3.5 的知识截至 2021年9月GPT-4 是 2023 年12月)。另外大模型没有“真逻辑”。它表现出的逻辑、推理是训练文本的统计规律而不是真正的逻辑所以有幻觉。所以大模型需要连接真实世界并对接真逻辑系统。这就需要用到“函数调用”。 函数调用(Function Calling)可以使LLM具有与外部API交互的能力。让用户能够使用高效的外部工具、与外部API进行交互。其使用机制如下 关于function calling,有以下几点需要注意
在最新版本的OpenAI API中可以使用tools参数对函数进行描述。并让大模型智能地选择输出包含函数参数的JSON对象来调用一个或多个函数。最新的GPT模型(gpt-3.5-turbo-0125 and gpt-4-turbo-preview)可以自动检测何时应该调用函数(还有一个相关的参数tool_choice一般不用自己设置)还可以输出更加符合函数签名的JSON串。GPT不负责调用和执行外部函数需要用户自己完成。
2 使用GPT进行函数调用 在使用GPT模型进行函数调用时需要用到tools参数进行函数声明关于该参数有以下几点需要说明
该参数可以接收一系列JSON组成的array一个函数对应一个JSON当前最多可以接受128个函数。JSON串的结构如下 其中parameters参数的写法要遵循JSON Schema格式具体可以参考https://blog.csdn.net/yeshang_lady/article/details/137146295
2.1 使用函数调用完成加法计算 大模型可以做加法是因为大模型记住了简单加法的统计规律但大模型无法保证每次都能得到正确的加法计算结果。这里我们使用函数调用来完成加法计算。具体代码如下
from openai import OpenAI
from dotenv import load_dotenv,find_dotenv
import json
from math import *_load_dotenv(find_dotenv())
clientOpenAI()def get_completion(messages,modelgpt-3.5-turbo):responseclient.chat.completions.create(modelmodel,messagesmessages,temperature0.7,tools[{type:function,function:{name:sum,description:加法器,计算一组数的和,parameters:{type:object,properties:{numbers:{type:array,items:{type:number}}}}}}],)return response.choices[0].messageprompt计算这些数据的和:345,2313,89,632.
messages[{role:system,content:你是一个数学家},{role:user,content:prompt}
]
responseget_completion(messages)
print(response)
#GPT模型第一次的回复中有关于函数调用信息包括GPT生成的函数调用的参数所以这些信息需要返回给GPT模型。
messages.append(response)
if response.tool_calls is not None:tool_callresponse.tool_calls[0]if tool_call.function.namesum:argsjson.loads(tool_call.function.arguments)resultsum(args[numbers])messages.append({tool_call_id:tool_call.id,role:tool,name:sum,content:str(result) })print(get_completion(messages).content)其结果如下 ChatCompletionMessage(contentNone, role‘assistant’, function_callNone, tool_calls[ChatCompletionMessageToolCall(id‘call_vYramfrhZX7kLZLYhqDiFVHP’, functionFunction(arguments‘{“numbers”:[345,2313,89,632]}’, name‘sum’), type‘function’)]) 这些数据的和是3379. 2.2 同时启动多个函数调用
借助上述加法函数的代码可以一次启动同一个函数的多次调用具体代码如下
from openai import OpenAI
import json
from dotenv import load_dotenv, find_dotenv
_ load_dotenv(find_dotenv())
clientOpenAI()
def run_conversation(prompt,modelgpt-3.5-turbo):messages[{role:user,content:prompt}]tools[{ type: function,function: {name: sum,description: 加法器计算一组数的和,parameters: {type: object,properties: {numbers: {type: array, items: { type: number}}}}}}]responseclient.chat.completions.create(modelmodel,messagesmessages,toolstools,tool_choiceauto,)response_messageresponse.choices[0].messagemessages.append(response_message)print(response_message)tool_callsresponse_message.tool_callsif tool_calls:for tool_call in tool_calls:function_nametool_call.function.namefunction_argsjson.loads(tool_call.function.arguments)function_responsesum(function_args.get(numbers))messages.append({tool_call_id:tool_call.id,role:tool,name:function_name,content:str(function_response)})second_responseclient.chat.completions.create(modelmodel,messagesmessages,)return second_response.choices[0].message.content
if __name____main__:prompt小明第一天买了5本书2个苹果第二天买了3本书4个橘子第三天买了7个梨和10本书那么小明总共买了多个水果和多少本书print(prompt)print(GPT回复)print(run_conversation(prompt))其执行结果如下 小明第一天买了5本书2个苹果第二天买了3本书4个橘子第三天买了7个梨和10本书那么小明总共买了多个水果和多少本书 ChatCompletionMessage(contentNone, role‘assistant’, function_callNone, tool_calls[ChatCompletionMessageToolCall(id‘call_XB4SBFVfhMtyeo4zRu1lvpim’, functionFunction(arguments‘{“numbers”: [2, 4, 7]}’, name‘sum’), type‘function’), ChatCompletionMessageToolCall(id‘call_d0B4e1j7Fhi1OPxxH9skJRAi’, functionFunction(arguments‘{“numbers”: [5, 3, 10]}’, name‘sum’), type‘function’)]) GPT回复: 小明总共买了13个水果和18本书。 关于这段代码需要注意一点
这段代码中的模型使用的是gpt-3.5-turbo更确切的说是最新的gpt-3.5-turbo-0125。OpenAI官方已经将gpt-3.5-turbo指向了gpt-3.5-turbo-0125。但如果使用的是国内代理的key的话可能gpt-3.5-turbo和gpt-3.5-turbo-0125还是两个不同的模型那运行上述代码时可能会遇到如下错误(输出second_response可以看到报错信息) Invalid parameter: messages with role ‘tool’ must be a response to a preceeding message with ‘tool_calls’ 2.3 同时定义多个函数调用
假设我们现在同时定义了加法和乘法的函数调用让大模型自动完成加法和乘法的调用。具体代码如下
from openai import OpenAI
import json
from dotenv import load_dotenv, find_dotenv
_ load_dotenv(find_dotenv())
clientOpenAI()
def math_multiply(number,price):return number*price
def run_conversation(prompt,modelgpt-3.5-turbo-0125):messages[{role:user,content:prompt}]tools[{ type: function,function: {name: sum,description: 加法器计算一组数的和,parameters: {type: object,properties: {numbers: {type: array, items: { type: number}}}}}},{type:function,function:{name:multiply,description:乘法器计算两个数的乘积,parameters:{type:object,properties:{price:{type:number,description:一种物品的价格},number:{type:integer,description:一种物品的数量},},required:[price,number],}}}]responseclient.chat.completions.create(modelmodel,messagesmessages,toolstools,tool_choiceauto,)response_messageresponse.choices[0].messageavailable_function{sum:sum,multiply:math_multiply,}while response_message.tool_calls:print(response_message)messages.append(response_message)tool_callsresponse_message.tool_callsfor tool_call in tool_calls:function_nametool_call.function.namefunction_argsjson.loads(tool_call.function.arguments)functionavailable_function[function_name]if functionsum:function_responsefunction(function_args.get(numbers))elif functionmath_multiply:function_responsefunction(function_args.get(number),function_args.get(price))messages.append({tool_call_id:tool_call.id,role:tool,name:function_name,content:str(function_response)})response_messageclient.chat.completions.create(modelmodel,messagesmessages,toolstools,).choices[0].messagereturn response_message.content
if __name____main__:prompt小明第一天买了5本书和7个苹果第二天买了3本书和2个苹果第三天买了18本书和20个苹果每一本书的价格是65元/本每一个苹果的价格是7.5元/个那么小明总共花了多少钱print(prompt)print(GPT回复:,run_conversation(prompt))其执行结果如下(从输出内容可以知道大模型先调用了两次加法运算完成书籍数量和水果数量的计算接着调用两次乘法完成书本总价和水果总价的计算最后调用加法完成总成本的计算。) 小明第一天买了5本书和7个苹果第二天买了3本书和2个苹果第三天买了18本书和20个苹果每一本书的价格是65元/本每一个苹果的价格是7.5元/个那么小明总共花了多少钱 ChatCompletionMessage(contentNone, role‘assistant’, function_callNone, tool_calls[ChatCompletionMessageToolCall(id‘call_xkGwaSApyRoTXmsNFhrtNQci’, functionFunction(arguments‘{“numbers”: [5, 3, 18]}’, name‘sum’), type‘function’), ChatCompletionMessageToolCall(id‘call_DQEKyCWNJT2JysmqH25OGLRO’, functionFunction(arguments‘{“numbers”: [7, 2, 20]}’, name‘sum’), type‘function’), ChatCompletionMessageToolCall(id‘call_5VlzZ8U5EhDixYnbwhh2Lljf’, functionFunction(arguments‘{“price”: 65, “number”: 26}’, name‘multiply’), type‘function’), ChatCompletionMessageToolCall(id‘call_qN12sj2Ze7TvcuF0vzcwZH9H’, functionFunction(arguments‘{“price”: 7.5, “number”: 29}’, name‘multiply’), type‘function’)]) ChatCompletionMessage(contentNone, role‘assistant’, function_callNone, tool_calls[ChatCompletionMessageToolCall(id‘call_XIdn5N1lhcRy8vG0UodSMfO9’, functionFunction(arguments‘{“numbers”:[1690,217.5]}’, name‘sum’), type‘function’)]) GPT回复: 小明总共花了1907.5元。 最后需要注意一点是否执行函数调用由大模型自己决定。