OpenAI GPT For Python Developers 第二章 GPT是如何工作的?

发布于 2023年10月02日

生成型预训练变换器(Generative Pre-trained Transformer,GPT)是一种生成文本模型。该模型具有根据接收到的输入来预测接下来会出现什么新文本的能力。

GPT-3是另一个模型,显然比之前的任何GPT模型都要大且性能更好,包括GPT-1和GPT-2。

第三代GPT是在大规模的文本语料库上进行训练的,包括书籍、文章和公开可访问的网站,如Reddit和其他论坛。它使用这些训练数据来学习单词和短语之间的模式和关系。

GPT-3的关键创新在于其令人印象深刻的规模——拥有令人惊叹的1750亿参数——使其成为迄今为止最庞大和最强大的语言模型之一。它在如此庞大的数据集上进行了广泛的训练,使其能够生成类似人类的文本,执行各种自然语言处理任务,并以令人印象深刻的准确性完成任务。

GPT是一种称为变换器(transformer)的神经网络类型,专门设计用于自然语言处理任务。变换器的架构基于一系列的自注意机制,允许模型并行处理输入文本,并根据上下文权衡每个单词或标记的重要性。

自注意是深度学习模型用于自然语言处理(NLP)的机制,允许模型在进行预测时权衡句子或多个句子的不同部分的重要性。作为变换器架构的一部分,它使神经网络在处理NLP任务时能够达到令人满意的性能。

这是一个使用Hugging Face transformers进行GPT-2推理的示例。

from transformers import pipeline

generator = pipeline('text-generation', model='gpt2')

generator("Hello, I'm a language model", max_length=30,num_return_sequences=3)

默认情况下,模型没有记忆,这意味着每个输入都是独立处理的,没有从之前的输入中传递任何信息。当GPT生成文本时,它不会根据先前的输入预先设定下一个应该出现什么的观念。相反,它根据前一个输入后下一个词成为下一个可能的词的概率生成每个词。这导致生成的文本可能令人惊讶和富有创意。

这是另一个使用GPT模型根据用户输入生成文本的代码示例。

#导入必要的库

from transformers import GPT2Tokenizer, GPT2LMHeadModel

#加载预训练的GPT-2令牌化器和模型

tokenizer = GPT2Tokenizer.from_pretrained('gpt2')

model = GPT2LMHeadModel.from_pretrained('gpt2')

#将模型设置为评估模式

model.eval()

#为模型完成定义一个提示

prompt = input("You:")

#对提示进行令牌化并生成文本

input_ids = tokenizer.encode(prompt, return_tensors='pt')

output = model.generate(input_ids, max_length=50, do_sample=True)

#解码生成的文本并打印到控制台

generated_text = tokenizer.decode(output[0], skip_special_tokens=True)

print("AI:" + generated_text)

GPT-3被设计为通用语言模型,这意味着它可以用于各种自然语言处理任务,如语言翻译、文本摘要和问题回答。OpenAI已经训练了GPT-3,但您可以基于自己的微调数据集构建自己训练的模型。这使得可以实现更具创意性和特定用途的用例,除了模型默认支持的任务外,如生成文本、诗歌和故事。它还可以用于构建在特定领域内具有专业知识的聊天机器人、其他对话界面等等!

在本指南中,我们将深入探讨OpenAI GPT-3,包括如何有效利用API和由公司和AI/ML社区提供的工具来原型设计强大和创新的工具和系统。这不仅会提高您使用GPT-3 API的熟练程度,还会扩展您对自然语言处理和其他相关领域中使用的概念和技术的理解。

由于其广泛的规模,GPT-3被认为是自然语言处理领域的重大进展。然而,一些专家对该模型可能创建带有偏见或有害内容的可能性提出了担忧。与任何技术一样,审慎考虑其使用的伦理影响非常重要。本指南不涵盖伦理问题,只关注实际方面。

祝愉快编码!

准备开发环境

安装Python、pip和虚拟环境以进行开发

显然,您需要安装Python。在本书中,我们将使用Python 3.9.5版本。

我们还将使用pip,这是Python的包安装程序。您可以使用pip从Python包索引和其他索引安装包。

您不需要在系统中安装Python 3.9.5,因为我们将创建一个虚拟开发环境。所以无论您安装了哪个版本,您的开发环境都将与系统隔离,并将使用相同的Python 3.9.5。

如果未安装Python,请前往www.python.org/downloads/11,下载并安装Python 3.x版本之一,具体操作取决于您的操作系统,请遵循不同的说明。

为了管理我们的开发环境,我们将使用virtualenvwrapper。您将在官方文档中找到安装说明。

获取它的最简单方式是使用pip:

pip install virtualenvwrapper

注意:如果您习惯于使用virtualenv、Poetry或任何其他包管理器,可以继续使用它。在这种情况下,不需要安装virtualenvwrapper。

如果未安装pip,安装它的最简单方式是使用官方文档中提供的脚本:

1. 从 https://bootstrap.pypa.io/get-pip.py 下载脚本。

2. 打开终端/命令提示符,cd到包含get-pip.py文件的文件夹,并运行以下命令:

#Mac和Linux用户
python get-pip.py
#Windows用户
py get-pip.py   

总结一下,您的系统应该已安装以下包:

- Python

- pip

- virtualenvwrapper(或您更喜欢的virtualenv或其他包管理器)

我强烈建议Windows用户在Linux内创建一个虚拟机,因为本书提供的大多数示例是在Linux Mint系统上运行和测试的。

接下来,让我们创建一个虚拟环境:

mkvirtualenv -p python3.9 chatgptforpythondevelopers

创建后,激活它:

workon chatgptforpythondevelopers

获取您的OpenAI API密钥

下一步是创建API密钥,以允许您访问OpenAI提供的官方API。前往https://openai.com/api/ 并创建一个帐户。

按照提供的说明创建一个帐户,然后在此处创建您的API密钥:

https://beta.openai.com/account/api-keys

一个API密钥应该属于一个组织,您将被要求创建一个组织。在本书中,我们将其称为“LearningGPT”。

将生成的秘密密钥保存在安全且可访问的地方。您将无法通过OpenAI帐户再次查看它。

安装官方Python绑定

您可以使用任何语言的HTTP请求与API进行交互,可以使用官方Python绑定,官方Node.js库或社区维护的库。

在本书中,我们将使用由OpenAI提供的官方库。另一种选择是使用Chronology17,这是OthersideAI提供的非官方库。但是,似乎该库已不再更新。

要安装官方Python绑定,请运行以下命令:

pip install openai

确保您在之前创建的虚拟环境中安装库。

测试我们的API密钥

为了验证一切是否正常工作,我们将执行一个curl调用。在执行之前,让我们将API密钥和组织ID存储在.env文件中:

cat <<EOF > .env

API_KEY=xxx

ORG_ID=xxx

EOF

在执行上述命令之前,请确保通过相应的值更新API_KEY和ORG_ID变量。

现在您可以执行以下命令:

source .env

curl https://api.openai.com/v1/models \

-H 'Authorization: Bearer '$API_KEY'' \

-H 'OpenAI-Organization: '$ORG_ID''

您可以跳过变量的源,并直接在curl命令中使用它们:

curl https://api.openai.com/v1/models \

-H 'Authorization: Bearer xxxx' \

-H 'OpenAI-Organization: xxxx'

如果在您的OpenAI帐户中有一个组织,可以执行相同的命令,而无需提及组织ID。

curl https://api.openai.com/v1/models -H 'Authorization: Bearer xxxx'

curl命令应该会返回API提供的模型列表,如“davinci”、“ada”和其他许多模型。

为了使用Python代码测试API,我们可以执行以下代码:

import os
import openai
# 从.env文件中读取变量,即API_KEY和ORG_ID。
with open(".env") as env:
    for line in env:
        key, value = line.strip().split("=")
        os.environ[key] = value

# 初始化API密钥和组织ID
openai.api_key = os.environ.get("API_KEY")
openai.organization = os.environ.get("ORG_ID")
# 调用API并列出模型
models = openai.Model.list()
print(models)

我们将在将来使用几乎相同的方法,因此让我们创建一个可重用的函数来初始化API。我们可以这样编写我们的代码:

import os
import openai
def init_api():
    with open(".env") as env:
        for line in env:
            key, value = line.strip().split("=")
            os.environ[key] = value
    openai.api_key = os.environ.get("API_KEY")
    openai.organization = os.environ.get("ORG_ID")
init_api()
models = openai.Model.list()
print(models)

可用模型

主要的三个模型

有主要的模型或者说模型系列,如果我们可以这样称呼它们的话:

  • GPT-3

  • Codex

  • 内容过滤模型(Content Filter model)

您可能会在一些在线文档资源中找到其他模型的名称,这可能会令人困惑。其中许多文档是关于旧版本而不是GPT-3的。

此外,请注意,除了这三个主要模型之外,您还可以创建并对自己的模型进行微调。

GPT-3:处理和生成自然语言

GPT-3模型能够理解人类语言和看起来是自然语言的文本。这个模型系列有4个模型(A、B、C、D),它们的速度和性能各不相同。

  • D:text-davinci-003

  • C:text-curie-001

  • B:text-babbage-001

  • A:text-ada-001

正如所说,每个模型都具有不同的功能、定价和准确性。

OpenAI建议首先尝试Davinci模型,然后再尝试其他模型,这些模型能够以更低的成本执行大量类似的任务。

text-davinci-003

这是最强大的GPT-3模型,因为它可以执行所有其他模型能够执行的任务。此外,它比其他模型提供了更高的质量。它是最新的模型,因为它是根据截至2021年6月的数据进行训练的。

它的优点之一是允许请求多达4,000个标记(tokens)。稍后在本指南中,我们将更详细地定义标记,现在只需知道它们决定了用户请求的长度。

text-curie-001

text-curie-001模型是第二强大的GPT-3模型,因为它支持多达2048个token。它的优点是比text-davinci-003更经济,但仍然具有高准确性。

它是根据截至2019年10月的数据进行训练的,因此在准确性上略低于text-davinci-003。它可能是翻译、复杂分类、文本分析和摘要的不错选择。

text-babbage-001

与Curie相同:2048个token和数据训练截至2019年10月。

这个模型适用于更简单的分类和语义分类。

text-ada-001

与Curie相同:2048个token和数据训练截至2019年10月。

这个模型非常快速和经济,适合用于最简单的分类、文本提取和地址校正。

Codex:理解和生成计算机代码

OpenAI提供了两个Codex模型用于理解和生成计算机代码:code-davinci-002和code-cushman-001。

Codex是GitHub Copilot的动力来源。它精通十多种编程语言,包括Python、JavaScript、Go、Perl、PHP、Ruby、Swift、TypeScript、SQL和Shell等。

Codex能够理解用自然语言表达的基本指令,并代表用户执行所请求的任务。

Codex有两个模型可用:

  • code-davinci-002

  • code-cushman-001

code-davinci-002

Codex模型最强大。它擅长将自然语言翻译成代码。它不仅完成代码,还支持插入补充元素。它可以处理多达8,000个标记,并且是根据截至2021年6月的数据进行训练的。

code-cushman-001

Cushman功能强大且速度快。即使在处理复杂任务时Davinci更强大,这个模型也具有许多代码生成任务的能力。

它还更快速,比Davinci更经济。

内容过滤器

顾名思义,这是用于敏感内容的过滤器。

使用此过滤器,您可以检测到可能是敏感或不安全的API生成文本。该过滤器可以将文本分类为3个类别:

  • 安全

  • 敏感

  • 不安全

如果您正在构建一个将由用户使用的应用程序,您可以使用该过滤器检测模型是否返回任何不适当的内容。

列出所有模型

使用API模型端点,您可以列出所有可用的模型。让我们看看这在实践中是如何工作的:

import os
import openai
def init_api():
    with open(".env") as env:
        for line in env:
            key, value = line.strip().split("=")
            os.environ[key] = value
    openai.api_key = os.environ.get("API_KEY")
    openai.organization = os.environ.get("ORG_ID")
init_api()
models = openai.Model.list()
print(models)

如您所见,我们只需使用openai包的Model模块的list()函数。结果将类似于以下内容的列表:

{

 "data": [ {

 "created": 1649358449,

 "id": "babbage",

 "object": "model",

 "owned_by": "openai",

 "parent": null,

 "permission": [

 {

 "allow_create_engine": false,

 "allow_fine_tuning": false,

 "allow_logprobs": true,

 "allow_sampling": true,

 "allow_search_indices": false,

 "allow_view": true,

 "created": 1669085501,

 "group": null,

 "id": "modelperm-49FUp5v084tBB49tC4z8LPH5",

 "is_blocking": false,

 "object": "model_permission",

 "organization": "*"

 }

 ],

 "root": "babbage"

 },

 [...]

 [...]

 [...]

 [...]

 [...]

 {

 "created": 1642018370,

 "id": "text-babbage:001",

 "object": "model

",

 "owned_by": "openai",

 "parent": null,

 "permission": [

 {

 "allow_create_engine": false,

 "allow_fine_tuning": false,

 "allow_logprobs": true,

 "allow_sampling": true,

 "allow_search_indices": false,

 "allow_view": true,

 "created": 1642018480,

 "group": null,

 "id": "snapperm-7oP3WFr9x7qf5xb3eZrVABAH",

 "is_blocking": false,

 "object": "model_permission",

 "organization": "*"

 } ],

 "root": "text-babbage:001"

 }

],

 "object": "list"

}

让我们只打印模型的ID:

import os
import openai

def init_api():
    with open(".env") as env:
        for line in env:
            key, value = line.strip().split("=")
            os.environ[key] = value
    openai.api_key = os.environ.get("API_KEY")
    openai.organization = os.environ.get("ORG_ID")

init_api()

models = openai.Model.list()
for model in models["data"]:
    print(model["id"])

结果应该是:

babbage
ada
davinci
text-embedding-ada-002
babbage-code-search-code
text-similarity-babbage-001
text-davinci-003
text-davinci-001
curie-instruct-beta
babbage-code-search-text
babbage-similarity
curie-search-query
code-search-babbage-text-001
code-cushman-001
code-search-babbage-code-001
audio-transcribe-deprecated
code-davinci-002
text-ada-001
text-similarity-ada-001
text-davinci-insert-002
ada-code-search-code
text-davinci-002
ada-similarity
code-search-ada-text-001
text-search-ada-query-001
text-curie-001
text-davinci-edit-001
davinci-search-document
ada-code-search-text
text-search-ada-doc-001
code-davinci-edit-001
davinci-instruct-beta
text-similarity-curie-001
code-search-ada-code-001
ada-search-query
text-search-davinci-query-001
davinci-search-query
text-davinci-insert-001
babbage-search-document
ada-search-document
text-search-babbage-doc-001
text-search-curie-doc-001
text-search-curie-query-001
babbage-search-query
text-babbage-001
text-search-davinci-doc-001
text-search-babbage-query-001
curie-similarity
curie-search-document
curie
text-similarity-davinci-001
davinci-similarity
cushman:2020-05-03
ada:2020-05-03
babbage:2020-05-03
curie:2020-05-03
davinci:2020-05-03
if-davinci-v2
if-curie-v2
if-davinci:3.0.0
davinci-if:3.0.0
davinci-instruct-beta:2.0.0
text-ada:001
text-davinci:001
text-curie:001
text-babbage:001

我们已经了解了Ada,Babbage,Curie,Cushman和Davinci。

我们还见过Codex。每个带有id中的代码的模型都是Codex的一部分。

像babbage-code-search-code这样的搜索模型经过优化,用于搜索代码,但其中一些现在已经过时,包括ada-code-search-code,ada-code-search-text,babbage-code-search-code和babbage-code-search-text,它们已被code-search-ada-code-001,code-search-ada-text-001,code-search-babbage-code-001和code-search-babbage-text-001所取代。

其他针对文本搜索进行优化的搜索模型,如ada-search-document,ada-search-query,babbage-search-document,babbage-search-query,curie-search-document和curie-search-query也已被弃用,并被text-search-ada-doc-001,text-search-ada-query-001,text-search-babbage-doc-001,text-search-babbage-query-001,text-search-curie-doc-001和text-search-curie-query-001所取代。

“相似性”模型用于查找相似的文档。ada-similarity,babbage-similarity,curie-similarity,davinci-similarity已被text-similarity-ada-001,text-similarity-babbage-001,text-similarity-curie-001和text-similarity-davinci-001所取代。

davinci-instruct-beta-v3,curie-instruct-beta-v2,babbage-instruct-beta和ada-instruct-beta已被text-davinci-001,text-curie-001,text-babbage-001和text-ada-001所取代。

请注意,davinci并不等同于text-davinci-003或text-davinci-002。它们都很强大,但在支持的标记数等方面存在一些差异。

这些传统模型中的许多过去被称为“引擎”,但OpenAI已将术语“引擎”弃用,而使用“模型”。许多人和在线资源将这些术语互换使用,但正确的名称是“模型”。

使用旧名称的API请求仍然有效,因为OpenAI确保了向后兼容性。但建议您使用更新的名称。

过时调用的示例:

response=openai.Completion.create( engine="text-davinci-002", prompt="What's the meaning of life?",)

新方法的示例来进行调用:

response=openai.Completion.create( model="text-davinci-002", prompt="What's the meaning of life?",)

应该使用哪个模型?

Davinci模型无疑是最好的模型,但它们也是最昂贵的。因此,如果优化成本不是您的首要任务,而您想专注于质量,那么Davinci是您的最佳选择。具体来说,text-davinci-003是最强大的模型。

与davinci相比,text-davinci-003是一个更新的、更具能力的模型,专门设计用于遵循指令的任务和零样本情况,这是我们在本指南中将要探讨的一个概念。

然而,要记住,对于某些特定用例,Davinci模型并不总是首选。我们将在本指南的后续部分看到更多详细信息。

为了优化成本,其他模型如Curie是很好的选择,特别是如果您执行简单的请求,比如文本摘要或数据提取。

这适用于GPT-3和Codex。

内容过滤器是可选的,但如果您正在构建一个公共应用程序,则强烈推荐使用。您不希望用户收到不合适的结果。

接下来呢?

总结本章,像text-davinci-003这样的Davinci模型是最好的模型。OpenAI建议在大多数用例中使用text-davinci-003。其他模型,如Curie,在某些用例中表现非常出色,成本约为Davinci的十分之一。

定价模型清晰简单易懂,可以在官方网站上找到。此外,当您注册OpenAI时,您将获得18美元的免费信用额度,可在前3个月内使用。

在本指南中,我们将遵循OpenAI的建议,使用新模型,而不是已弃用的模型。

随着我们深入研究这些模型,您将更好地了解如何使用API来创建、生成和编辑文本和图像,无论是使用基础模型还是您自己的微调模型。随着我们进行更多实际示例,您将更好地了解标记和定价,最终您将能够创建出可以投入生产的智能应用程序,利用这个人工智能。



评论