本章将详细介绍GPT-4和ChatGPT API。本章的目标是让您充分了解如何使用这些API,以便能够有效地将它们集成到您的Python应用程序中。通过本章的学习,您将能够充分掌握这些API,并在自己的开发项目中充分利用它们的强大功能。
我们将从介绍OpenAI Playground开始。这将使您在编写任何代码之前更好地了解这些模型。接下来,我们将查看OpenAI Python库。这包括登录信息和一个简单的“Hello World”示例。然后,我们将涵盖创建和发送请求到API的过程。我们还将看看如何管理API的响应。这将确保您知道如何解释这些API返回的数据。此外,本章还将涵盖安全最佳实践和成本管理等考虑因素。
随着学习的深入,您将获得实用的知识,这将在您作为与GPT-4和ChatGPT一起工作的Python开发人员的旅程中非常有用。本章中包含的所有Python代码都可以在本书的GitHub存储库中找到。
重要概念
OpenAI提供了多个专为不同任务设计的模型,并且每个模型都有其自己的定价方式。在接下来的页面中,您将找到可用模型的详细比较以及如何选择使用哪些模型的建议。值得注意的是,一个模型被设计的目的,无论是用于文本补全、聊天还是编辑,都会影响您如何使用其API。例如,ChatGPT和GPT-4背后的模型都是基于聊天的,使用聊天端点。
“提示”(prompts)的概念是在第1章中引入的。提示不仅适用于OpenAI API,而且是所有LLM的入口点。简而言之,提示是您发送给模型的输入文本,它们用于指导模型执行特定的任务。对于ChatGPT和GPT-4模型,提示采用聊天格式,将输入和输出消息存储在列表中。在本章中,我们将探讨这种提示格式的详细信息。
“标记”(tokens)的概念也在第1章中进行了描述。标记是单词或单词的部分。一个粗略的估计是,对于英文文本,100个标记大约等于75个单词。对OpenAI模型的请求是基于使用的标记数定价的,也就是说,调用API的成本取决于输入文本和输出文本的长度。您将在“使用ChatGPT和GPT-4”以及“使用其他文本补全模型”中找到有关管理和控制输入和输出标记数量的更多详细信息。
这些概念在图2-1中总结如下。
现在我们已经讨论了这些概念,让我们继续详细了解这些模型。
OpenAI API 中可用的模型
OpenAI API 为您提供了访问由 OpenAI 开发的多个模型的机会。这些模型可以通过 API 提供服务(通过直接的 HTTP 调用或提供的库),这意味着 OpenAI 在远程服务器上运行这些模型,开发者只需向其发送查询即可。
每个模型都具有不同的功能和定价。在本节中,我们将介绍 OpenAI 通过其 API 提供的 LLMs。需要注意的是,这些模型是专有的,因此您无法直接修改代码以适应您的需求。但正如我们将在后面看到的,您可以通过 OpenAI API 在您的特定数据上对其中一些模型进行微调。
由于 OpenAI 提供的许多模型不断更新,因此在本书中很难列出它们的完整列表;OpenAI 提供的模型的最新列表可以在在线文档中找到。因此,在这里,我们将重点关注最重要的模型:
- InstructGPT
这个系列的模型可以处理许多单一完成任务。text-ada-001 模型只能处理简单的完成任务,但它也是 GPT-3 系列中速度最快、价格最低的模型。text-babbage-001 和 text-curie-001 模型稍微强大一些,但也更昂贵。text-davinci-003 模型可以以出色的质量执行所有完成任务,但它也是 GPT-3 系列中最昂贵的模型。
- ChatGPT
ChatGPT 背后的模型是 gpt-3.5-turbo。作为一个聊天模型,它可以接受一系列消息作为输入,并返回适当生成的消息作为输出。虽然 gpt-3.5-turbo 的聊天格式旨在促进多轮对话,但也可以将其用于没有对话的单一完成任务。在单一完成任务中,gpt-3.5-turbo 的性能与 text-davinci-003 相媲美,由于 gpt-3.5-turbo 的价格仅为 text-davinci-003 的十分之一,性能几乎相当,因此建议您默认情况下使用它进行单一完成任务。gpt-3.5-turbo 模型的上下文大小为 4,000 个标记,这意味着它可以接受 4,000 个标记作为输入。OpenAI 还提供了另一个模型,名为 gpt-3.5-turbo-16k,具有与标准 gpt-3.5-turbo 模型相同的功能,但上下文大小是标准模型的四倍。
- GPT-4
这是由 OpenAI 推出的最大模型。它还经过了对文本和图像的最广泛多模态语料库的训练。因此,它在许多领域都具有知识和专业知识。GPT-4 能够遵循复杂的自然语言指令并准确解决困难问题。它可以用于聊天和单一完成任务,具有高度的准确性。OpenAI 提供了两个 GPT-4 模型:gpt-4 具有 8,000 个标记的上下文大小,gpt-4-32k 具有 32,000 个标记的上下文大小。32,000 的上下文大约表示 24,000 个单词,这是大约 40 页的上下文。
GPT-3.5 Turbo 和 GPT-4 都在不断更新。当我们提到 gpt-3.5-turbo、gpt-3.5-turbo-16k、gpt-4 和 gpt-4-32k 这些模型时,我们指的是这些模型的最新版本。
开发者通常需要在其应用程序中使用的 LLM 版本中获得更多的稳定性和可见性。对于开发者来说,使用版本可能会很困难,因为版本可以在一夜之间发生变化,对于相同的输入提示可能会表现出不同的行为。出于这个目的,这些模型的静态快照版本也是可用的。在撰写本文时,最新的快照版本是 gpt-3.5-turbo-0613、gpt-3.5-turbo-16k-0613、gpt-4-0613 和 gpt-4-32k-0613。
正如在第 1 章中所讨论的,OpenAI 建议使用 InstructGPT 系列而不是原始的基于 GPT-3 的模型。这些模型仍然在 API 中以 ada、davinci、curie 和 babbage 的名称提供。鉴于这些模型可能会提供奇怪、错误和误导性的答案,正如第 1 章所示,建议在使用它们时要小心。然而,这些模型仍然在使用,因为它们是唯一可以根据您的数据进行微调的模型。在撰写本文时,OpenAI 宣布 GPT-3.5 Turbo 和 GPT-4 将在 2024 年提供微调。
使用 OpenAI 演示场试用 GPT 模型
您可以直接使用 OpenAI Playground 来测试 OpenAI 提供的不同语言模型,而无需编写代码。OpenAI Playground 是一个基于 Web 的平台,允许您快速测试 OpenAI 提供的各种 LLM(大型语言模型)以完成特定任务。Playground 让您编写提示、选择模型,并轻松查看生成的输出。
以下是如何访问 Playground 的步骤:
- 转到 OpenAI 的首页,并单击 “Developers”,然后选择 “Overview”。
- 如果您已经拥有帐户但未登录,请单击屏幕右上角的 “Login”。如果您还没有 OpenAI 帐户,您需要创建一个帐户才能使用 Playground 和大多数 OpenAI 功能。请单击屏幕右上角的 “Sign Up”。请注意,因为 Playground 和 API 需要付费,您需要提供支付方式。
- 登录后,您将在网页的左上角看到链接以加入 Playground。单击该链接,您应该会看到类似于图2-2的内容。
使用 OpenAI Playground 是一个极好的方式,可以在不编写代码的情况下直接测试 OpenAI 提供的不同语言模型,以完成特定任务。通过这种方式,您可以更好地了解这些模型的工作原理并了解它们的输出。
界面中央的主要空白区域用于输入您的消息。在编写完您的消息后,点击 “Submit” 以生成对您的消息的完成。在图2-2的示例中,我们写了 “正如笛卡尔所说,我思故我”,然后在点击 “Submit” 后,模型将我们的输入完成为 “I am”。
界面的周围有许多选项。让我们从底部开始。在 “Submit” 按钮的右边是一个撤销按钮 [图中标为 (A)],用于删除最后生成的文本。在我们的示例中,它将删除 “I am”。接下来是重新生成按钮 [图中标为 (B)],它会重新生成刚刚删除的文本。然后是历史按钮 [图中标为 (C)],其中包含您在过去30天内的所有请求。请注意,一旦进入历史菜单,根据隐私原因,很容易删除请求。
屏幕右侧的选项面板提供与界面和选择的模型相关的各种设置。我们只会在这里解释其中一些选项;其他选项将在本书的后面部分介绍。右侧的第一个下拉列表是模式列表 [图中标为 (D)]。在撰写本文时,可用的模式包括聊天 (默认)、完成和编辑。
正如前面所演示的,语言模型努力在 Playground 的默认模式下无缝完成用户的输入提示。
图 2-3 展示了在聊天模式下使用 Playground 的示例。屏幕左侧是系统面板 [图中标为 (E)]。在这里,您可以描述聊天系统的行为方式。例如,在图 2-3 中,我们要求它成为一个热爱猫咪的有用助手。我们还要求它只谈论猫,并提供简短的答案。由于设置了这些参数,所产生的对话显示在屏幕中央。
如果您想继续与系统进行对话,点击 “Add message” [(F)],输入您的消息,然后点击提交 [(G)]。还可以在右侧定义模型 [(H)];在这里,我们使用了 GPT-4。请注意,并非所有模型都在所有模式下都可用。例如,只有 GPT-4 和 GPT-3.5 Turbo 在聊天模式下可用。
Playground 中的另一种模式是编辑模式。在此模式中,如图 2-4 所示,您提供一些文本 [(I)] 和指令 [(J)],模型将尝试相应地修改文本。在此示例中,提供了一段描述一个年轻男子要去旅行的文本。模型被指示将文本的主题更改为一位老妇人,您可以看到结果遵循了指示 [(K)]。
Playground 界面的右侧,在 Mode 下拉列表下方,是 Model 下拉列表 [(L)]。正如您已经看到的,这是选择 LLM 的地方。下拉列表中可用的模型取决于所选的模式。在 Model 下拉列表下方是定义模型行为的参数,例如 Temperature [(M)]。我们不会在这里详细介绍这些参数。当我们仔细研究这些不同模型的工作方式时,大多数参数将会被探讨。 屏幕顶部是“Load a preset” 下拉列表 [(N)] 和四个按钮。在图 2-2 中,我们使用 LLM 完成了句子 “As Descartes said, I think therefore”,但是通过使用适当的提示,可以使模型执行特定任务。图 2-5 显示了与一个预设示例相关的模型可以执行的常见任务列表。
需要注意的是,提供的预设不仅定义提示,还定义了屏幕右侧的一些选项。例如,如果单击“Grammatical Standard English”,您将在主窗口中看到图 2-6 中显示的提示。
如果单击提交,您将获得以下响应:“她没有去市场。”您可以使用下拉列表中提供的提示作为起点,但您总是需要对其进行修改以适应您的问题。OpenAI还提供了不同任务的示例的完整列表。
在图 2-4 中的“Load a preset”下拉列表旁边是“Save”按钮 [(O)]。想象一下,您已经为您的任务使用了模型和其参数定义了有价值的提示,并且希望以后在Playground中轻松重用它。此“Save”按钮将保存Playground的当前状态为预设。您可以为预设指定名称和描述,一旦保存,您的预设将出现在“Load a preset”下拉列表中。
接口顶部的倒数第二个按钮称为“View code” [(P)]。它提供了在脚本中直接运行Playground中的测试所需的代码。您可以请求Python、Node.js或cURL的代码,以在Linux终端中直接与OpenAI远程服务器交互。如果要求我们示例“正如笛卡尔所说,我思故我在”的Python代码,我们将得到以下内容:
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
response = openai.Completion.create(
model="text-davinci-003",
prompt="As Descartes said, I think therefore",
temperature=0.7,
max_tokens=3,
top_p=1,
frequency_penalty=0,
presence_penalty=0,
)
既然您了解了如何使用Playground来在不编写代码的情况下测试OpenAI语言模型,让我们讨论如何获取和管理用于OpenAI服务的API密钥。
入门:OpenAI Python库
在本节中,我们将重点介绍如何在一个小型Python脚本中使用API密钥,并将使用OpenAI API执行我们的第一个测试。 OpenAI将GPT-4和ChatGPT作为一项服务提供。这意味着用户无法直接访问模型的代码,也无法在自己的服务器上运行模型。然而,OpenAI管理其模型的部署和运行,只要用户有一个账户和一个秘密密钥,就可以调用这些模型。 在执行以下步骤之前,请确保您已登录到OpenAI网页。
OpenAI Access and API Key
OpenAI要求您拥有API密钥才能使用其服务。这个密钥有两个用途:
- 它赋予您调用API方法的权利。
- 它将您的API调用与您的账户关联,用于计费目的。 您必须拥有这个密钥才能从您的应用程序中调用OpenAI服务。 要获取这个密钥,请导航至OpenAI平台页面。在右上角,点击您的账户名称,然后点击“查看API密钥”,如图2-7所示。
当您在“API密钥”页面上时,点击“创建新的秘密密钥”并复制您的密钥。这个密钥是一个以sk-开头的长字符串。
一旦您有了密钥,最佳做法是将其导出为环境变量。这将允许您的应用程序访问密钥,而无需直接将其写入您的代码。以下是如何操作的步骤。 对于Linux或Mac:
# set environment variable OPENAI_API_KEY for current session
export OPENAI_API_KEY=sk-(...)
# check that environment variable was set
echo $OPENAI_API_KEY
对于Windows:
# set environment variable OPENAI_API_KEY for current session
set OPENAI_API_KEY=sk-(...)
# check that environment variable was set
echo %OPENAI_API_KEY%
上面的代码片段将设置一个环境变量,并使您的密钥在从同一 shell 会话启动的其他进程中可用。对于 Linux 系统,还可以直接将此代码添加到您的 .bashrc 文件中。这将允许在所有 shell 会话中访问您的环境变量。当然,不要在您推送到公共存储库的代码中包含这些命令行。
要在 Windows 11 中永久添加/更改环境变量,请同时按下 Windows 键 + R 键,以打开运行程序或文件窗口。在此窗口中,键入 sysdm.cpl 进入系统属性面板。然后点击“高级”选项卡,接着点击“环境变量”按钮。在结果屏幕上,您可以添加一个包含您的 OpenAI 密钥的新环境变量。
现在您已经有了密钥,是时候编写您的第一个使用 OpenAI API 的“Hello World”程序了。
“Hello World”例子
这一部分展示了使用 OpenAI Python 库的第一行代码。我们将从一个经典的“Hello World”示例开始,以了解 OpenAI 如何提供其服务。 使用 pip 安装 Python 库:
pip install openai
接下来,在Python中访问OpenAI API:
import openai
# Call the openai ChatCompletion endpoint
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "Hello World!"}],
)
# Extract the response
print(response["choices"][0]["message"]["content"])
你将看到以下输出:
Hello there! How may I assist you today?
恭喜!您刚刚使用OpenAI Python库编写了您的第一个程序。 让我们详细了解如何使用这个库。
正如您可能已经观察到的那样,代码片段没有明确提到OpenAI API密钥。这是因为OpenAI库是设计成自动查找名为OPENAI_API_KEY的环境变量的。或者,您可以使用以下代码将openai模块指向包含您的密钥的文件:
# Load your API key from file
openai.api_key_path = <PATH>,
或者,您可以在代码中手动设置API密钥,如下所示:
# Load your API key
openai.api_key = os.getenv("OPENAI_API_KEY")
我们建议遵循环境变量的广泛约定:将您的密钥存储在一个不包含在.gitignore文件中的.env文件中。然后,在Python中,您可以运行load_dotenv函数来加载环境变量并导入openai库:
from dotenv import load_dotenv
load_dotenv()
import openai
在加载.env文件之后有openai的导入声明是很重要的;否则,OpenAI的设置将不会正确应用。 既然我们已经了解了ChatGPT和GPT-4的基本概念,我们可以继续讨论它们的详细使用方法。
使用ChatGPT和GPT-4
在撰写本文时,GPT 3.5 Turbo是最便宜且最多功能的模型。因此,它也是大多数用例的最佳选择。以下是其使用示例:
import openai
# For GPT 3.5 Turbo, the endpoint is ChatCompletion
openai.ChatCompletion.create(
# For GPT 3.5 Turbo, the model is "gpt-3.5-turbo"
model="gpt-3.5-turbo",
# Conversation as a list of messages.
messages=[
{"role": "system", "content": "You are a helpful teacher."},
{
"role": "user",
"content": "Are there other measures than time complexity for an
algorithm?",
},
{
"role": "assistant",
"content": "Yes, there are other measures besides time complexity
for an algorithm, such as space complexity.",
},
{"role": "user", "content": "What is it?"},
],
)
在上面的示例中,我们使用了最少数量的参数,即用于进行预测的LLM以及输入的消息。正如您所看到的,输入消息中的对话格式允许将多个交换发送到模型。请注意,API 不会将先前的消息存储在其上下文中。问题 “它是什么?” 涉及到前一个答案,只有在模型具有对这个答案的知识时才有意义。为了模拟聊天会话,每次都必须发送整个对话。我们将在下一节进一步讨论这个问题。
GPT 3.5 Turbo 和 GPT-4 模型针对聊天会话进行了优化,但这并不是强制性的。这两个模型都可以用于多轮对话和单轮任务。如果您指定一个提示来请求完成,它们还可以用于传统的完成任务。 ChatGPT 和 GPT-4 都使用相同的端点:openai.ChatCompletion。通过更改模型 ID,开发人员可以在不进行任何其他代码更改的情况下在 GPT-3.5 Turbo 和 GPT-4 之间切换。
Chat Completion 端点的输入选项
让我们更详细地看一下如何使用 openai.ChatCompletion
端点以及它的 create
方法。
必需的输入参数
openai.ChatCompletion
端点及其 create
方法有多个输入参数,但只有两个是必需的,如表2-1所述。
一段对话以一个可选的系统消息开头,然后是交替的用户消息和助手消息:
- 系统消息有助于设置助手的行为。
- 用户消息相当于用户在ChatGPT网页界面中键入问题或句子。它们可以由应用程序的用户生成,也可以设置为指示。
- 助手消息有两个作用:要么它们存储以前的响应以继续对话,要么它们可以设置为指示,以示例所需的行为。模型不会记住过去的请求,因此存储先前的消息是为了给对话提供上下文和提供所有相关信息。
对话的长度和标记数
正如前面所看到的,对话的总长度将与标记的总数相关联。这将影响以下方面:
- 成本
按标记计费。
- 时间
标记越多,响应所需的时间就越长,最多可能需要几分钟。
- 模型是否工作
总标记数必须小于模型的最大限制。您可以在“注意事项”中找到标记限制的示例。
如您所见,有必要仔细管理对话的长度。您可以通过管理消息的长度来控制输入标记的数量,并通过max_tokens参数来控制输出标记的数量,详细信息请参见下一小节。
其他可选参数
OpenAI提供了其他几个选项,可以微调您与库的交互方式。我们不会在这里详细说明所有参数,但建议查看表2-2。
您可以在官方文档页面上找到更多详细信息和其他参数。
Chat Completion端点的输出结果格式
现在您已经获得了查询基于聊天的模型所需的信息,让我们看看如何使用结果。 以下是“Hello World”示例的完整响应:
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "Hello there! How may I assist you today?",
"role": "assistant",
},
}
],
"created": 1681134595,
"id": "chatcmpl-73mC3tbOlMNHGci3gyy9nAxIP2vsU",
"model": "gpt-3.5-turbo",
"object": "chat.completion",
"usage": {"completion_tokens": 10, "prompt_tokens": 11, "total_tokens": 21},
}
生成的输出详见表 2-3。
从文本完成到函数
OpenAI引入了其模型输出JSON对象的可能性,该对象包含调用函数所需的参数。模型本身将无法调用函数,而是将文本输入转换为可由调用者以编程方式执行的输出格式。
当需要处理OpenAI API调用的结果时,这特别有用:与其创建一个复杂的提示以确保模型以可由您的代码解析的特定格式回答,不如使用函数定义将自然语言转换为API调用或数据库查询,从文本中提取结构化数据,并创建通过调用外部工具来回答问题的聊天机器人。
正如您在详细介绍聊天完成端点的输入选项的表2-2中看到的那样,函数定义需要作为函数对象数组传递。函数对象在表2-4中详细介绍。
举个例子,假设我们有一个包含与公司产品相关信息的数据库。我们可以定义一个执行针对该数据库的搜索的函数:
# Example function
def find_product(sql_query):
# Execute query here
results = [
{"name": "pen", "color": "blue", "price": 1.99},
{"name": "pen", "color": "red", "price": 1.78},
]
return results
接下来,我们定义函数的规格:
# Function definition
functions = [
{
"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"],
},
}
]
然后,我们可以创建一个对话并调用 openai.ChatCompletion
端点:
# Example question
user_question = "I need the top 2 products where the price is less than 2.00"
messages = [{"role": "user", "content": user_question}]
# Call the openai.ChatCompletion endpoint with the function definition
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613", messages=messages, functions=functions
)
response_message = response["choices"][0]["message"]
messages.append(response_message)
模型已经创建了一个查询,我们可以使用。如果我们从响应中打印 function_call
对象,我们会得到:
"function_call": {
"name": "find_product",
"arguments": '{n "sql_query": "SELECT * FROM products
WHERE price < 2.00 ORDER BY price ASC LIMIT 2"n}',
}
接下来,我们执行该函数并继续使用结果进行对话:
# Call the function
function_args = json.loads(
response_message["function_call"]["arguments"]
)
products = find_product(function_args.get("sql_query"))
# Append the function's response to the messages
messages.append(
{
"role": "function",
"name": function_name,
"content": json.dumps(products),
}
)
# Format the function's response into natural language
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=messages,
)
最后,我们提取最终的响应,得到如下结果:
The top 2 products where the price is less than $2.00 are:
1. Pen (Blue) - Price: $1.99
2. Pen (Red) - Price: $1.78
这个简单的例子演示了如何使用函数来构建一个解决方案,允许最终用户以自然语言与数据库互动。函数定义允许您限制模型的回答方式,将其响应集成到应用程序中。
使用其他文本完成模型
正如前面提到的,OpenAI除了GPT-3和GPT-3.5系列之外,还提供了几种其他模型。这些模型使用与ChatGPT和GPT-4模型不同的终端点。尽管GPT 3.5 Turbo模型通常在价格和性能方面都是最佳选择,但了解如何使用完成模型仍然很有帮助,特别是对于精细调整等用例,其中GPT-3完成模型是唯一的选择。
文本完成和聊天完成之间存在重要的区别:你可能会猜到,两者都会生成文本,但聊天完成是为对话优化的。正如你可以在以下代码片段中看到的,与openai.ChatCompletion端点的主要区别是提示格式。聊天模型必须采用对话格式;而完成模型则是单一提示:
import openai
# Call the openai Completion endpoint
response = openai.Completion.create(
model="text-davinci-003", prompt="Hello World!"
)
# Extract the response
print(response["choices"][0]["text"])
前面的代码片段将生成类似以下内容的完成:
"nnIt's a pleasure to meet you. I'm new to the world"
下一节将详细介绍文本完成端点的输入选项。
文本完成端点的输入选项
openai.Completion.create的输入选项集与我们之前在聊天端点中看到的非常相似。在本节中,我们将讨论主要的输入参数,并考虑提示的长度对其的影响。
主要的输入参数
我们已经讨论了一些最有用的必需输入参数和可选参数,它们在表2-5中有详细说明。
问题长度和令牌数
与聊天模型一样,价格将取决于您发送的输入和接收的输出。对于输入消息,您必须仔细管理提示参数的长度,以及如果使用后缀的话,也要管理后缀的长度。对于接收的输出,使用max_tokens参数可以避免不必要的意外。
附加的可选参数
和 openai.ChatCompletion 一样,您可以使用附加的可选参数来进一步调整模型的行为。这些参数与用于 openai.ChatCompletion 的参数相同,因此我们不会再次详细说明它们。请记住,您可以使用温度 (temperature) 或 n 参数来控制输出,使用 max_tokens 控制成本,如果希望获得更好的用户体验,可以使用 stream 选项来处理长的完成。有关这些参数的详细信息,请参阅 OpenAI 的文档。
文本完成端点的输出结果格式
现在,您已经拥有了查询基于文本的模型所需的所有信息,您会发现结果与聊天端点的结果非常相似。以下是使用 davinci 模型的“Hello World”示例的输出示例:
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"logprobs": null,
"text": "<br />nnHi there! It's great to see you.",
}
],
"created": 1681883111,
"id": "cmpl-76uutuZiSxOyzaFboxBnaatGINMLT",
"model": "text-davinci-003",
"object": "text_completion",
"usage": {"completion_tokens": 15, "prompt_tokens": 3, "total_tokens": 18},
}
考虑事项
在广泛使用API之前,您应考虑两个重要因素:成本和数据隐私。
定价和令牌限制
在撰写本文时,OpenAI 的定价如下所示,适用于最常用的OpenAI 模型:
从表格2-6中有几个要注意的事项:
- Davinci模型的成本是GPT-3.5 Turbo 4,000-context模型的10倍以上。由于gpt-3.5-turbo也可以用于单轮完成任务,并且对于这种类型的任务,这两种模型的准确性几乎相等,因此建议使用GPT-3.5 Turbo(除非您需要一些特殊功能,比如通过参数后缀进行插入,或者如果text-davinci-003在您的特定任务中表现优于gpt-3.5-turbo)。
- GPT-3.5 Turbo比GPT-4更便宜。对于许多基本任务来说,GPT-4和GPT-3.5之间的区别并不重要。但是,在复杂的推理情况下,GPT-4远远优于以前的任何模型。
- 聊天模型与davinci模型有不同的定价系统:它们区分输入(提示)和输出(完成)。
- GPT-4允许的上下文长度是GPT-3.5 Turbo的两倍,甚至可以达到32,000个标记,相当于25,000多个字的文本。GPT-4支持的用例包括长篇内容创作、高级对话和文档搜索与分析等,当然需要付费。
安全和隐私:Caution!
截止到本文写作时,OpenAI声称除非您选择选择加入,否则不会使用发送到模型的输入数据进行重新训练。但是,您的输入数据将保留30天,用于监控和遵守使用规定的目的。这意味着OpenAI员工以及专门的第三方承包商可能会访问您的API数据。
这一点需要引起您的注意,因为它涉及到数据隐私和安全。在使用OpenAI的API时,您应该仔细考虑您发送的数据,并确保符合隐私法规和最佳实践。如果您处理敏感信息或与个人身份有关的数据,应采取额外的保护措施,以确保数据的安全性和合规性。
在第三章中,您将找到更多有关如何构建具有LLM支持的应用程序,同时考虑安全性和隐私问题的详细信息。
其他OpenAI API和功能
您的OpenAI账户除了文本完成功能外,还可以访问其他功能。我们在本节中选择了其中的一些功能来进行探讨,但如果您想深入了解所有API的可能性,请查看OpenAI的API参考页面。
Embeddings
由于模型依赖数学函数,它需要数值输入来处理信息。然而,许多元素,如单词和标记,并不是本质上数值的。为了克服这个问题,嵌入将这些概念转化为数值向量。嵌入允许计算机通过数值表示更有效地处理这些概念之间的关系。在某些情况下,访问嵌入可能很有用,OpenAI提供了一个可以将文本转化为数字向量的模型。嵌入端点允许开发人员获得输入文本的向量表示。然后,这个向量表示可以作为其他机器学习模型和自然语言处理算法的输入使用。
截至本书编写时,OpenAI建议几乎所有用例使用其最新的模型text-embedding-ada-002。它非常简单使用:
result = openai.Embedding.create(
model="text-embedding-ada-002", input="your text"
)
嵌入可以通过以下方式访问:
result['data']['embedding']
生成的嵌入是一个向量,即一个浮点数数组。
嵌入的原理是在某个空间中有意义地表示文本字符串,以捕捉它们的语义相似性。基于这个思想,您可以有各种用途:
- 搜索
按照与查询字符串的相关性对结果进行排序。
- 推荐
推荐包含与查询字符串相关的文本字符串的文章。
- 聚类
将相似的字符串分组。
- 异常检测
找到与其他字符串无关的文本字符串。
嵌入具有这样的属性,即如果两个文本具有相似的含义,它们的向量表示将是相似的。例如,在图2-8中,展示了两维嵌入中的三个句子。尽管两个句子“猫追逐着老鼠绕房子跑。”和“绕房子,老鼠被猫追赶。”具有不同的语法结构,但它们传达了相同的基本含义,因此它们应该具有相似的嵌入表示。而句子“The astronaut repaired the spaceship in orbit.”与前面的句子主题(猫和老鼠)无关,讨论了完全不同的主题(宇航员和太空飞船),因此它应该具有明显不同的嵌入表示。请注意,在这个示例中,为了清晰起见,我们将嵌入显示为具有两个维度,但实际上,它们通常具有更高的维度,例如512维。
在剩余的章节中,我们多次提到嵌入API,因为嵌入是使用AI模型处理自然语言的重要组成部分。
审查模型
正如前面提到的,当使用OpenAI模型时,您必须遵守OpenAI的使用政策中描述的规定。为了帮助您遵守这些规定,OpenAI提供了一个模型,用于检查内容是否符合这些使用政策。如果您构建的应用程序将使用用户输入作为提示,那么此模型可能会非常有用:您可以根据审查端点的结果筛选查询。该模型提供分类能力,允许您搜索以下类别的内容:
- 仇恨
促进对基于种族、性别、种族、宗教、国籍、性取向、残疾或种姓的群体的仇恨
- 仇恨/威胁
涉及对目标群体实施暴力或严重伤害的仇恨内容
- 自残
宣传或描述自残行为的内容,包括自杀、切割和饮食障碍
- 性
旨在描述性行为或促进性服务(除了教育和健康以外)的内容
- 涉及未成年人的性行为
涉及未满18岁人士的性别内容
- 暴力
美化暴力或庆祝他人的痛苦或羞辱的内容
- 暴力/图形
以图形方式详细描述死亡、暴力或严重身体伤害的暴力内容
审查模型的端点是openai.Moderation.create,仅有两个参数可用:模型和输入文本。有两个内容审查模型。默认模型是text-moderation-latest,它会随着时间的推移自动更新,以确保您始终使用最准确的模型。另一个模型是text-moderation-stable。在更新此模型之前,OpenAI会通知您。
以下是如何使用此审查模型的示例:
import openai
# Call the openai Moderation endpoint, with the text-moderation-latest model
response = openai.Moderation.create(
model="text-moderation-latest",
input="I want to kill my neighbor.",
)
让我们看一下响应对象中包含的审查终端的输出结果:
{
"id": "modr-7AftIJg7L5jqGIsbc7NutObH4j0Ig",
"model": "text-moderation-004",
"results": [
{
"categories": {
"hate": false,
"hate/threatening": false,
"self-harm": false,
"sexual": false,
"sexual/minors": false,
"violence": true,
"violence/graphic": false,
},
"category_scores": {
"hate": 0.0400671623647213,
"hate/threatening": 3.671687863970874e-06,
"self-harm": 1.3143378509994363e-06,
"sexual": 5.508050548996835e-07,
"sexual/minors": 1.1862029225540027e-07,
"violence": 0.9461417198181152,
"violence/graphic": 1.463699845771771e-06,
},
"flagged": true,
}
],
}
审查终端的输出结果提供了表2-7中显示的信息片段。
Whisper and DALL-E
OpenAI还提供了其他不是LLMs但在某些用例中可以与GPT模型轻松结合使用的人工智能工具。我们不在这里解释它们,因为它们不是本书的重点。但不要担心,使用它们的API与使用OpenAI的LLM API非常相似。
Whisper是一个多功能的语音识别模型。它经过大规模音频数据集的训练,也是一个多任务模型,可以进行多语言语音识别、语音翻译和语言识别。Whisper项目的开源版本可以在OpenAI的GitHub页面上找到。
在2021年1月,OpenAI推出了DALL-E,这是一个能够根据自然语言描述创建逼真图像和艺术品的人工智能系统。DALL-E 2将这项技术推向了更高的分辨率、更强的输入文本理解和新功能。这两个版本的DALL-E都是通过对图像及其文本描述进行训练的变压器模型创建的。您可以通过API和实验室界面尝试DALL-E 2。