GPT-4:2023年06月13日OpenAI重大更新的简介(新增函数调用/模型更新/上下文长度扩大4倍/使用成本降低)、基于OpenAl的Python SDK实现函数调用应用案例之详细攻略
导读:2023年06月13日OpenAI宣布了一些更新,包括更多可控的API模型、函数调用能力、更长的上下文和更低的价格。
目录
T1、通过调用外部工具(例如ChatGPT插件)创建能够回答问题的聊天机器人
LLMs之GPT-4:基于OpenAl新增函数调用功能的简介、两种方法(原生SDK和LangChain框架)实现之详细攻略
(1)、通过自定义函数来计算函数x**2在[1,5]的积分的开平方,来教会GPT-3.5做对这个问题
地址 |
|
时间 |
2023年6月13日 |
作者 |
OpenAI团队 Atty Eleti,Jeff Harris,Logan Kilpatrick |
函数调用和其他API更新
更新内容简介
我们今年早些时候发布了gpt-3.5-turbo和gpt-4,并且在短短几个月内,我们看到开发者在这些模型之上构建了令人难以置信的应用程序。
今天,我们将跟进一些令人兴奋的更新:
官方发布 |
解读与总结 |
>> 在Chat Completions API中新增了函数调用功能 >> 更新和更可控的gpt-4和gpt-3.5-turbo版本 >> 新增了gpt-3.5-turbo的16k上下文版本(相比标准的4k版本) >> 我们的最先进的嵌入模型成本降低了75% >> gpt-3.5-turbo的输入标记成本降低了25% >> 宣布了gpt-3.5-turbo-0301和gpt-4-0314模型的弃用时间表 所有这些模型都具备我们于3月1日引入的相同的数据隐私和安全保证 —— 客户拥有所有生成的输出,并且他们的API数据不会被用于训练。 |
>> 新增函数调用:可以把GPT API 理解为一位介于开发者和用户之间的“翻译官”。函数调用功能使我们能够利用模型的自然语言理解能力,将人类语言有效地转化为结构化数据,或在我们的代码中进行特定的函数调用。开发者只需提供函数的描述,模型会根据提示词自动决定何时调用哪个函数,这与ChatGPT调用插件的机制相同。 >>上下文长度扩大4倍:新增了gpt-3.5-turbo的16k上下文版本(相对于标准的4k版本)。意味着该模型现在可以在单个请求中支持约 20 页文本。 >>使用成本降低:我们的最先进的嵌入模型成本降低了75%;gpt-3.5-turbo的输入令牌成本降低了25%。 >>更可控:更新了更可控的gpt-4和gpt-3.5-turbo版本。 >>9月13日彻底废弃旧版本:公布了gpt-3.5-turbo-0301和gpt-4-0314模型的停用时间表。9月13日之后,所有旧版本的请求将被彻底废弃。 |
gpt-3.5-turbo(4k token版) 输入token的价格降低了25%:每千个token 0.0015美元,1美元可以获得66.6万个token。 输出token的价格:每千个token 0.002美元,1美元可以获得50万个token(大约700页英文)。 嵌入模型价格大幅下降75%:每千个token只需0.0001美元,1美元可以获得一千万个token。 gpt-3.5-turbo(16k token版):新推出并提供了4K版本四倍的处理能力,但价格只增加了两倍。 |
函数调用
1、函数调用使开发者能够更可靠地从模型中获取结构化数据
开发者现在可以向gpt-4-0613和gpt-3.5-turbo-0613描述函数,并让模型智能地选择输出一个包含调用这些函数的参数的JSON对象。这是一种更可靠地将GPT的能力与外部工具和API连接起来的新方法。
这些模型经过了微调,既可以检测到何时需要调用函数(取决于用户的输入),也可以响应符合函数签名的JSON。函数调用使开发者能够更可靠地从模型中获取结构化数据。例如,开发者可以:
T1、通过调用外部工具(例如ChatGPT插件)创建能够回答问题的聊天机器人
将类似“发送电子邮件给Anya,看看她是否想在下周五喝咖啡”这样的查询转换为类似于send_email(to: string, body: string)的函数调用,或者将“波士顿的天气如何?”转换为get_current_weather(location: string, unit: 'celsius' | 'fahrenheit')。
T2、将自然语言转换为API调用或数据库查询
将“本月我最重要的十个客户是谁?”转换为类似于get_customers_by_revenue(start_date: string, end_date: string, limit: int)的内部API调用,或者将“上个月Acme公司下了多少订单?”转换为使用sql_query(query: string)的SQL查询。
T3、从文本中提取结构化数据
定义一个名为extract_people_data(people: [{name: string, birthday: string, location: string}])的函数,以提取在维基百科文章中提到的所有人物。
这些用例通过我们的/v1/chat/completions端点中的新API参数functions和function_call得以实现,开发者可以通过JSON模式向模型描述函数,并可选择要求它调用特定的函数。请参阅我们的开发者文档并添加evals,以便在发现函数调用可以改进的情况下开始使用。
2、函数调用三步骤示例
现在波士顿的天气如何?
输入 |
步骤1,OpenAI API 使用函数和用户的输入调用模型 |
响应 |
步骤2,第三方API 使用模型的响应调用您的API |
返回 |
步骤3,OpenAI API 将响应发送回模型进行总结 |
结果 |
波士顿目前天晴,气温为22摄氏度。 |
自ChatGPT插件的Alpha版本发布以来,我们在使工具和语言模型安全合作方面积累了很多经验。然而,仍然存在一些开放的研究问题。例如,概念验证漏洞演示了如何使用来自工具输出的不受信任的数据指示模型执行意外操作。我们正在努力减轻这些和其他风险。开发者可以通过仅使用来自受信任工具的信息以及在执行具有现实影响的操作(如发送电子邮件、在线发布或购买)之前包含用户确认步骤来保护其应用程序。
模型更新与价格调整
1、新模型
GPT-4 |
gpt-4-0613包括更新和改进的模型,并支持函数调用。 gpt-4-32k-0613除了与gpt-4-0613相同的改进之外,还具有更长的上下文长度,以更好地理解较大的文本。 通过这些更新,我们将在接下来的几周内邀请更多的等候名单上的人尝试GPT-4,并计划使用这个模型完全移除等候名单。感谢所有耐心等待的人,我们很期待看到您用GPT-4构建的作品! |
GPT-3.5 Turbo |
gpt-3.5-turbo-0613包括与GPT-4相同的函数调用功能,以及通过系统消息更可靠的可控性,这两个功能使开发者能够更有效地引导模型的回应。 gpt-3.5-turbo-16k提供了比gpt-3.5-turbo多4倍的上下文长度,但价格是其两倍:输入标记为每1K标记0.003美元,输出标记为每1K标记0.004美元。16k上下文意味着该模型现在可以支持单个请求中的大约20页文本。 |
2、模型弃用
初始版本进行升级 |
今天,我们将开始对我们在3月份宣布的gpt-4和gpt-3.5-turbo初始版本进行升级和弃用。使用稳定模型名称(gpt-3.5-turbo,gpt-4和gpt-4-32k)的应用程序将在6月27日自动升级到上述新模型。为了比较不同版本之间的模型性能,我们的Evals库支持公共和私有评估,以显示模型变化对您的用例的影响。 |
旧模型弃用 |
需要更多过渡时间的开发者可以继续使用旧模型,只需在API请求的“model”参数中指定gpt-3.5-turbo-0301,gpt-4-0314或gpt-4-32k-0314。这些旧模型将可在2023年9月13日之前使用,此后指定这些模型名称的请求将失败。您可以通过我们的模型弃用页面及时了解模型弃用情况。这是对这些模型的首次更新,因此我们热切期待开发者的反馈,以帮助我们确保平稳过渡。 |
3、价格降低
我们持续提高系统效率,并将这些节省成本传递给开发者,从今天开始生效。
嵌入模型 |
嵌入 text-embedding-ada-002是我们最受欢迎的嵌入模型。今天,我们将价格降低75%,每1K标记仅需0.0001美元。 |
gpt-3.5-turbo-4k模型 |
GPT-3.5 Turbo gpt-3.5-turbo是我们最受欢迎的聊天模型,为数百万用户提供ChatGPT服务。今天,我们将gpt-3.5-turbo的输入标记价格降低25%。开发者现在可以以每1K输入标记0.0015美元和每1K输出标记0.002美元的价格使用这个模型,相当于每美元大约700页文本。 |
gpt-3.5-turbo-16k模型 |
gpt-3.5-turbo-16k的价格为每1K输入标记0.003美元和每1K输出标记0.004美元。 |
基于OpenAl的Python SDK使用函数调用应用案例
1、基础案例
LLMs之GPT-4:基于OpenAl新增函数调用功能的简介、两种方法(原生SDK和LangChain框架)实现之详细攻略
https://yunyaniu.blog.csdn.net/article/details/131326060
2、进阶案例
(1)、通过自定义函数来计算函数x**2在[1,5]的积分的开平方,来教会GPT-3.5做对这个问题
知乎的段小草提供了一个很好的案例:通过自定义函数来计算函数x**2在[1,5]的积分的开平方,来教会GPT-3.5做对这个问题
文章链接:
OpenAI 重磅更新,API 添加新函数调用能力,能处理更长上下文,价格又降了 75%,有哪些影响? - 知乎
# 第一步,定义GPT API和自然语言描述的问题
# 函数f(x)=x^2在区间[0,5]上的定积分的开平方是多少?"
# 第二步,实现这个计算,我们先定义积分和开方的函数
# 字符串转为被积函数
# 进行数值积分
# 计算 9 的平方根
# 第三步,需要描述这两个函数,作为 GPT API functions参数
# 第四步,进行 API chat completion 的调用即可
# 增加相应的多轮对话和函数执行判断
为了回答「函数f(x)=x^2在区间[0,5]上的定积分的开平方是多少?」
GPT 一共进行了三步
第一步,判断需要调用积分函数,提供参数为 x**2, 0 , 5。(本地执行积分结果 41.67)
第二步,判断需要调用开方函数,提供参数为 41.67。(本地执行结果为 6.455)
第三步,回答原问题。
'''
知乎的段小草提供了一个很好的案例:通过自定义函数来计算函数x**2在[1,5]的积分的开平方,来教会GPT-3.5做对这个问题
文章链接:https://www.zhihu.com/question/606520916/answer/3073018455
'''
# 第一步,定义GPT API和自然语言描述的问题
import os
import requests
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
COMPLETION_MODEL = "gpt-3.5-turbo-0613"
QUESTION = (
"函数f(x)=x^2在区间[0,5]上的定积分的开平方是多少?"
)
messages = [
{"role": "user", "content": QUESTION},
]
def chat_completion_request(messages, functions=None, model=COMPLETION_MODEL):
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer " + openai.api_key,
}
json_data = {"model": model, "messages": messages}
if functions is not None:
json_data.update({"functions": functions})
try:
response = requests.post(
"https://api.openai.com/v1/chat/completions",
headers=headers,
json=json_data,
)
return response
except Exception as e:
print("Unable to generate ChatCompletion response")
print(f"Exception: {e}")
return e
# 第二步,实现这个计算,我们先定义积分和开方的函数
from scipy import integrate
import math
# 字符串转为被积函数
def str2fx(formula_str):
return eval('lambda x: ' + formula_str)
# 进行数值积分
def cauculate_quad(formula_str, a, b):
integral, error = integrate.quad(str2fx(formula_str), a, b)
return integral
# 计算 9 的平方根
def cauculate_sqrt(x):
return math.sqrt(x)
# 第三步,需要描述这两个函数,作为 GPT API functions参数
functions_desc = [
{
"name": "cauculate_quad",
"description": "计算函数的积分",
"parameters": {
"type": "object",
"properties": {
"formula_str": {
"type": "string",
"description": "一个数学函数的表达式. For example, x**2",
},
"a": {
"type": "number",
"description": "积分区间的左端点. For example, 1.0",
},
"b": {
"type": "number",
"description": "积分区间的右端点. For example, 5.0",
},
},
"required": ["formula_str", "a", "b"],
},
},
{
"name": "cauculate_sqrt",
"description": "计算一个数值的开平方",
"parameters": {
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "被开方数. For example, 2.0",
},
},
"required": ["x"],
},
},
]
# 第四步,进行 API chat completion 的调用即可
# 增加相应的多轮对话和函数执行判断
import json
while True:
chat_response = chat_completion_request(
messages, functions=functions_desc
)
response = chat_response.json()
print(response)
if response['choices'][0]["finish_reason"] == "stop":
print(response['choices'][0]["message"]["content"])
break
elif response['choices'][0]["finish_reason"] == "function_call":
fn_name = response['choices'][0]["message"]["function_call"]["name"]
arguments = response['choices'][0]["message"]["function_call"]["arguments"]
arguments_json = json.loads(arguments)
function = locals()[fn_name]
result = function(**arguments_json)
messages.append(
{
"role": "assistant",
"content": None,
"function_call": {
"name": fn_name,
"arguments": arguments,
},
}
)
messages.append(
{
"role": "function",
"name": fn_name,
"content": f'{
{"result": {str(result)} }}'}
)
chat_response = chat_completion_request(
messages, functions=functions_desc
)
'''
为了回答「函数f(x)=x^2在区间[0,5]上的定积分的开平方是多少?」
GPT 一共进行了三步
第一步,判断需要调用积分函数,提供参数为 x**2, 0 , 5。(本地执行积分结果 41.67)
第二步,判断需要调用开方函数,提供参数为 41.67。(本地执行结果为 6.455)
第三步,回答原问题。
输出结果
{'id': 'chatcmpl-7RMi4hIimsD4hwKv4kEYI2H6BUVAD', 'object': 'chat.completion', 'created': 1686756508, 'model': 'gpt-3.5-turbo-0613', 'choices': [{'index': 0, 'message': {'role': 'assistant', 'content': None, 'function_call': {'name': 'cauculate_quad', 'arguments': '{\n"formula_str": "x**2",\n"a": 0,\n"b": 5\n}'}}, 'finish_reason': 'function_call'}], 'usage': {'prompt_tokens': 189, 'completion_tokens': 30, 'total_tokens': 219}}
{'id': 'chatcmpl-7RMi7rdugXYxrzsREblPvQ74LVbQq', 'object': 'chat.completion', 'created': 1686756511, 'model': 'gpt-3.5-turbo-0613', 'choices': [{'index': 0, 'message': {'role': 'assistant', 'content': None, 'function_call': {'name': 'cauculate_sqrt', 'arguments': '{\n"x": 41.66666666666667\n}'}}, 'finish_reason': 'function_call'}], 'usage': {'prompt_tokens': 241, 'completion_tokens': 21, 'total_tokens': 262}}
{'id': 'chatcmpl-7RMiAFPk8JNNeu9rBPl2wTdxNSBnn', 'object': 'chat.completion', 'created': 1686756514, 'model': 'gpt-3.5-turbo-0613', 'choices': [{'index': 0, 'message': {'role': 'assistant', 'content': '函数f(x)=x^2在区间[0,5]上的定积分的开平方是约等于6.455。'}, 'finish_reason': 'stop'}], 'usage': {'prompt_tokens': 284, 'completion_tokens': 34, 'total_tokens': 318}}
函数f(x)=x^2在区间[0,5]上的定积分的开平方是约等于6.455。
'''
{'id': 'chatcmpl-7RMi4hIimsD4hwKv4kEYI2H6BUVAD', 'object': 'chat.completion', 'created': 1686756508, 'model': 'gpt-3.5-turbo-0613', 'choices': [{'index': 0, 'message': {'role': 'assistant', 'content': None, 'function_call': {'name': 'cauculate_quad', 'arguments': '{\n"formula_str": "x**2",\n"a": 0,\n"b": 5\n}'}}, 'finish_reason': 'function_call'}], 'usage': {'prompt_tokens': 189, 'completion_tokens': 30, 'total_tokens': 219}}
{'id': 'chatcmpl-7RMi7rdugXYxrzsREblPvQ74LVbQq', 'object': 'chat.completion', 'created': 1686756511, 'model': 'gpt-3.5-turbo-0613', 'choices': [{'index': 0, 'message': {'role': 'assistant', 'content': None, 'function_call': {'name': 'cauculate_sqrt', 'arguments': '{\n"x": 41.66666666666667\n}'}}, 'finish_reason': 'function_call'}], 'usage': {'prompt_tokens': 241, 'completion_tokens': 21, 'total_tokens': 262}}
{'id': 'chatcmpl-7RMiAFPk8JNNeu9rBPl2wTdxNSBnn', 'object': 'chat.completion', 'created': 1686756514, 'model': 'gpt-3.5-turbo-0613', 'choices': [{'index': 0, 'message': {'role': 'assistant', 'content': '函数f(x)=x^2在区间[0,5]上的定积分的开平方是约等于6.455。'}, 'finish_reason': 'stop'}], 'usage': {'prompt_tokens': 284, 'completion_tokens': 34, 'total_tokens': 318}}
函数f(x)=x^2在区间[0,5]上的定积分的开平方是约等于6.455。
'''