Python中的ChatGPT库

2025 年 1 月 5 日 | 阅读 14 分钟

OpenAI发布了一个官方的ChatGPT API Python客户端库,名为 `openai`。这个库提供了一个易于使用的界面,用于与ChatGPT API交互和生成文本补全。

要使用 `openai` 库,您首先需要安装它。您可以使用 `pip` 来完成安装:

安装完库后,您就可以使用它来生成ChatGPT的文本补全。以下是您如何使用该库生成文本补全的示例:

Python

示例输入

示例输出

there lived a young boy named Jack. He was adventurous and always eager to explore new places. One day, while wandering through the forest, he stumbled upon a mysterious cave. Curiosity getting the best of him, Jack decided to venture inside...

说明

在此示例中,我们首先设置了OpenAI API密钥,然后使用 `openai.Completion.create()` 方法来生成文本补全。`engine` 参数指定了要使用的GPT模型,`prompt` 参数指定了要补全的文本。`max_tokens` 参数控制了生成文本的最大长度。

API的响应是一个字典,其中包含生成的文本,我们可以通过 `response['choices'][0]['text']` 访问它。

您可以在官方OpenAI API文档中找到更多关于如何使用 `openai` 库的信息和示例:https://beta.openai.com/docs/

安装完库后,您就可以使用它来生成ChatGPT API的文本补全。为此,您需要从OpenAI网站创建API密钥,并使用该密钥对API请求进行身份验证。

API的响应是一个字典,其中包含生成的文本,我们可以通过 `response['choices'][0]['text']` 访问它。

您还可以指定其他参数来控制文本生成的行为,例如 `temperature` 参数,它控制生成文本的随机性;以及 `top_p` 参数,它控制包含更多样化补全的概率。

除了我之前提到的参数之外,还有其他几个参数可用于自定义ChatGPT API的文本生成行为。以下是一些最常用的参数:

  • `n`:要生成的补全数量。默认为 `1`。
  • `stop`:一个字符串列表,表示生成文本的结束。如果生成的文本包含 `stop` 列表中的任何字符串,则文本生成将停止。
  • `temperature`:一个浮点值,用于控制生成文本的随机性。较高的值(例如 `0.8`)使输出更具创意和多样性,而较低的值(例如 `0.2`)使输出更具针对性和确定性。
  • `top_p`:一个介于 `0` 和 `1` 之间的浮点值,用于控制包含更多样化补全的概率。较高的值(例如 `0.9`)使输出更具多样性,而较低的值(例如 `0.1`)使输出更具针对性。
  • `frequency_penalty`:一个浮点值,用于控制对生成文本中使用高频词元的惩罚。较高的值使输出不太可能包含高频词元。
  • `presence_penalty`:一个浮点值,用于控制对生成文本中使用新词元的惩罚。较高的值使输出更可能包含新词元。

以下是您如何使用这些参数生成文本补全的示例:

Python

示例输入

示例输出

1. there was a kingdom ruled by a wise king who had a magical sword that could grant wishes.
2. in a faraway land, there lived a princess who had the power to control the elements.

说明

在此示例中,我们指定了 `n` 参数来生成两个补全,`temperature` 参数来控制生成文本的随机性,以及 `stop` 参数来指示文本的结束。

您可以尝试使用这些参数的不同值,看看它们如何影响文本生成的行为。请记住,这些参数的最佳值可能因您的具体用例和所使用的提示而异。

`openai.Completion.create()` 方法详解

正如我在之前的消息中提到的,`openai.Completion.create()` 方法用于使用ChatGPT模型为给定提示生成补全。该方法接受多个参数,允许您自定义文本生成的行为。

使用其他模型

除了 `text-davinci-003` 模型之外,OpenAI还提供了几个其他的GPT模型,您可以使用它们来生成文本补全。每个模型都有其优点和权衡,您可以选择最适合您特定用例的模型。一些可用的模型包括:

  • `text-ada-001`:一个较小且更快的模型,非常适合各种任务。
  • `text-babbage-001`:一个中等大小的模型,在性能和准确性之间提供了良好的平衡。
  • `text-curie-001`:一个更大且更准确的模型,非常适合更复杂的任务。

您可以通过将模型名称传递给 `openai.Completion.create()` 方法的 `engine` 参数来指定要使用的模型,如下所示:

Python

错误处理

在向ChatGPT API发出请求时,可能会发生错误。例如,如果您的API密钥无效,或者您已超出使用限制,API可能会返回错误。您可以通过捕获 `openai.error.OpenAIError` 异常来处理错误,如下所示:

Python

在此示例中,我们捕获 `OpenAIError` 异常并将错误消息打印到控制台。

批量请求

您可以通过将提示列表传递给 `openai.Completion.create()` 方法的 `prompts` 参数来向ChatGPT API发出批量请求。这使您可以在一次API调用中为多个提示生成补全。以下是一个示例:

Python

示例输入

示例输出

1. there was a young girl named Alice who lived in a small village.
2. jumps over the lazy dog. The quick brown fox jumps over the lazy dog's back.

说明

在此示例中,我们将两个提示的列表传递给 `prompts` 参数,API返回一个补全列表,每个提示一个。

流式传输

`openai` 库还支持流式传输,允许您实时接收模型生成的补全。您可以通过将 `stream=True` 参数传递给 `openai.Completion.create()` 方法来启用流式传输,如下所示:

Python

示例输入

示例输出

there lived a beautiful princess named Cinderella. She had a kind heart and was loved by all who knew her.

说明

在此示例中,我们通过传递 `stream=True` 参数启用了流式传输,API返回一个生成器对象,我们可以对其进行迭代以获取接收到的生成文本。

语言支持

ChatGPT模型支持多种语言的文本生成。虽然该模型主要是在英语文本上训练的,但它在一定程度上仍然可以生成其他语言的文本。您可以通过在提示中包含语言来指定语言,如下所示:

Python

示例输入

示例输出

una princesa llamada Aurora que vivía en un castillo encantado en lo alto de una colina.

说明

在此示例中,我们指定了一个西班牙语的提示,API生成了一个西班牙语的文本补全。

以下是一些在使用 `openai` Python客户端库时可能很有用的更多主题和技巧:

提示工程

您使用的提示对ChatGPT模型生成的补全的质量和相关性有很大影响。提示工程是设计和微调提示以从模型中获得所需输出的过程。关于提示工程的一些技巧包括:

  • 使您的提示尽可能具体和清晰,以指导模型生成所需的输出。
  • 在提示中包含上下文或背景信息,以帮助模型理解任务。
  • 尝试不同的提示格式和风格,看看哪种最适合您的用例。

速率限制

ChatGPT API有速率限制,限制您在一定时间内可以发出的请求数量。速率限制取决于您的订阅计划,并且可以在OpenAI API文档中找到。跟踪您的使用情况并妥善处理速率限制错误非常重要。

费用

使用ChatGPT API的成本取决于模型处理的令牌数量。输入和输出令牌都计入总成本。您可以使用 `openai.Util.count_tokens()` 方法计算文本字符串中的令牌数量,如下所示:

Python

示例输入

示例输出

The text contains 4 tokens

说明

在此示例中,我们计算了输入文本中的令牌数量并将结果打印到控制台。

清理和格式化

ChatGPT API返回的生成文本可能包含前导和尾随空格、换行符或其他格式字符。您可以使用标准的Python字符串操作函数根据需要清理和格式化生成的文本。

异步请求

如果您需要并行发出多个ChatGPT API请求,可以使用 `openai.AsyncCompletion.create()` 方法发出异步请求。这使您可以通过一次发送多个请求而无需等待每个请求完成来更有效地生成补全。以下是一个示例:

Python

示例输入

示例输出

1. there was a young girl named Alice who lived in a small village.
2. jumps over the lazy dog. The quick brown fox jumps over the lazy dog's back.
3. there was a rebellion against the tyrannical empire led by a group of brave rebels.

说明

在此示例中,我们定义了一个提示列表和一个为每个提示生成补全的函数。然后,我们创建了一个任务列表来为每个提示生成补全,并使用 `asyncio.gather()` 来并行运行任务。最后,我们打印每个提示的生成文本。

错误处理

在向ChatGPT API发出请求时,妥善处理错误非常重要。除了我之前提到的 `OpenAIError` 异常之外,您还可能遇到其他一些异常,例如 `openai.error.RequestError`、`openai.error.RateLimitError` 和 `openai.error.OpenAIAPIError`。您可以单独捕获这些异常,或者捕获基础的 `openai.error.OpenAIError` 异常来处理所有错误。

模型微调

除了使用OpenAI提供的预训练GPT模型之外,您还可以使用OpenAI微调API来微调自己的模型。微调允许您通过在自己的数据上训练模型来定制模型的行为。您可以在OpenAI微调指南中找到更多关于微调的信息:https://beta.openai.com/docs/guides/fine-tuning

文件上传

OpenAI API还允许您上传文件,这对于微调自己的模型或执行基于文件的搜索等任务非常有用。您可以使用 `openai.File.create()` 方法来上传文件,如下所示:

Python

示例输入

假设您有一个名为“myfile.txt”的文件,其中包含您想要上传的一些文本或数据。

示例输出

File uploaded successfully with ID: your-file-id

说明

在此输出中,“your-file-id”将替换为OpenAI API分配给已上传文件的实际ID。此ID稍后可用于微调模型中使用此文件内容的任务。

在此示例中,我们上传了一个名为 `myfile.txt` 的文件,其目的为 `fine-tune`。`purpose` 参数指定了文件的预期用途。

使用模型

`openai` 库提供了一个 `Model` 类,允许您检索有关可用模型及其功能的信息。您可以使用 `openai.Model.retrieve()` 方法来获取有关特定模型的信息,如下所示:

Python

示例输入

假设您想检索有关名为“text-davinci-003”的模型的信息。

示例输出

{
  "id": "text-davinci-003",
  "created_at": 1621232514,
  "owner": "openai",
  "permissions": null,
  "name": "Davinci Codex",
  "description": "The davinci-codex engine is a successor to the davinci model, trained on a large-scale dataset sourced from the internet that includes a mixture of licensed data, data created by human trainers, and publicly available data. The model has been trained to work with the codex completion model class.",
  "is_real_time": false,
  "is_owner": true,
  "nlp_version": "1.0.0",
  "display_name": "Davinci Codex",
  "training_time": "2018-05-01T00:00:00Z",
  "fine_tunable": false,
  "credentials_needed": ["api_key"]
}

在此示例中,该代码从OpenAI API检索有关“text-davinci-003”模型的信息,并打印出模型信息,包括其ID、名称、描述、创建日期以及其他相关详细信息。在此示例中,我们检索有关 `text-davinci-003` 模型的信息并将模型信息打印到控制台。

资源和学习

  • OpenAI Playground: OpenAI Playground是一个交互式Web工具,允许您使用图形界面尝试ChatGPT模型并生成文本补全。这是一个很好地了解模型工作原理并探索不同提示格式的方法。
  • OpenAI博客: OpenAI博客是了解OpenAI最新发展和研究的绝佳资源。它包含有关机器学习和人工智能的各种主题的文章、教程和案例研究。
  • OpenAI GitHub存储库: OpenAI GitHub存储库包含 `openai` Python客户端库的源代码,以及OpenAI开发的其他工具和资源。对于希望为该库做出贡献或进一步了解其内部工作原理的开发人员来说,这是一个很好的资源。

处理长文档

如果您需要为长文档生成补全,务必注意令牌限制。单个API调用中的总令牌数(输入和输出)必须低于模型的最大令牌限制,对于基础GPT-3模型,通常约为4096个令牌。如果您的内容超过此限制,您需要将其拆分成更小的块并发出多个API调用。您可以使用 `openai.Completion.create()` 方法的 `max_tokens` 参数来控制响应的长度。

自定义提示

您可以尝试不同的提示样式来获得所需的输出。例如,您可以使用“将以下英文文本翻译成法文:”或“编写一个Python代码片段来执行以下操作:”等说明。您如何措辞您的提示会影响模型的行为。

上下文管理

您可以通过在提示中包含对话历史来与模型保持对话或上下文。这允许您在前一个响应的基础上进行构建,并与模型进行更具交互性和动态性的交互。例如:

Python

多文档摘要

您可以使用ChatGPT模型为多个文档生成摘要,方法是将文档提供在提示中并指示模型进行摘要。例如:

Python

后处理

在生成文本补全后,您可以执行后处理来根据需要清理和格式化输出。这可能包括删除不必要的空格、更正语法或重新格式化文本。

实验和微调

不要犹豫尝试不同的提示、参数和方法,以针对您的特定用例微调模型的行为。微调您的提示和参数可以帮助您获得最准确和最相关的结果。

版本控制

`openai` 库有多个版本,在代码中指定您正在使用的库版本非常重要。您可以通过将 `version` 参数传递给 `openai.api_version` 属性来做到这一点,如下所示:

Python

这确保您的代码使用的是正确版本的库,并且API的行为符合您的预期。

缓存

如果您使用相同的提示对ChatGPT API进行重复请求,则可以使用缓存来存储结果并避免不必要的API调用。缓存可以帮助提高应用程序的性能并减少API使用量。您可以使用诸如 `diskcache` 或 `cachetools` 之类的缓存库在代码中实现缓存。

速率限制处理

为了有效地处理速率限制,您可以将 `ratelimit` 库与 `backoff` 库结合使用来实现指数退避和重试逻辑。这使您可以在一定的延迟后自动重试失败的请求,并逐渐增加重试之间的延迟,以避免命中速率限制。

安全性

在使用 `openai` 库时,确保您的代码和API密钥是安全的非常重要。避免在代码中硬编码API密钥,并使用环境变量或配置文件来安全地存储API密钥。此外,请确保遵循保护代码和基础架构的最佳实践,例如使用HTTPS、保护服务器以及保持依赖项的更新。

文档

`openai` 库文档齐全,官方OpenAI API文档提供了有关如何使用该库和ChatGPT API的详细信息。请务必参考文档以获取有关最佳实践、用法示例和故障排除技巧的指导。