OpenAI API 生产最佳实践

2023-03-20 13:51 更新

本指南提供了一套全面的最佳实践,可帮助您从原型过渡到生产。无论您是经验丰富的机器学习工程师还是新近的爱好者,本指南都将为您提供成功将平台投入生产环境所需的工具:从保护对我们 API 的访问到设计能够处理高交通量。使用本指南来帮助制定尽可能顺利有效地部署应用程序的计划。

设置您的组织

登录到您的 OpenAI 帐户后,您可以在您的组织设置中找到您的组织名称和 ID。组织名称是您的组织的标签,显示在用户界面中。组织 ID 是您组织的唯一标识符,可用于 API 请求。

属于多个组织的用户可以通过标头来指定哪个组织用于 API 请求。来自这些 API 请求的使用将计入指定组织的配额。如果未提供标头,将按默认组织计费。您可以在用户设置中更改默认组织。

您可以从成员设置页面邀请新成员加入您的组织。成员可以是读者或所有者。读者可以进行 API 请求和查看基本组织信息,而所有者可以修改帐单信息和管理组织内的成员。

管理计费限额

新的免费试用用户将获得 5 美元的初始信用额度,该信用额度将在三个月后到期。信用额度用完或过期后,您可以选择输入账单信息以继续使用 API。如果未输入账单信息,您仍然可以登录,但无法再发出任何 API 请求。

输入账单信息后,您将获得每月 120 美元的批准使用限额,这是由 OpenAI 设定的。要将您的配额增加到超过 120 美元的每月账单限额,请提交增加配额的请求。

如果您希望在使用量超过一定数量时收到通知,您可以通过使用限制页面设置软限制。当达到软限制时,组织的所有者将收到一封电子邮件通知。您还可以设置硬限制,一旦达到硬限制,任何后续 API 请求都将被拒绝。请注意,这些限制是尽力而为的,使用和执行限制之间可能会有 5 到 10 分钟的延迟。

API 密钥

OpenAI API 使用 API 密钥进行身份验证。访问您的 API 密钥页面以检索您将在请求中使用的 API 密钥。

这是控制访问的一种相对直接的方法,但您必须警惕保护这些密钥。避免在您的代码或公共存储库中公开 API 密钥;相反,将它们存储在安全的位置。您应该使用环境变量或秘密管理服务将您的密钥公开给您的应用程序,这样您就不需要在代码库中对它们进行硬编码。

暂存帐户

随着规模的扩大,您可能希望为暂存和生产环境创建单独的组织。请注意,您可以使用两个单独的电子邮件地址(例如 bob+prod@widgetcorp.com 和 bob+dev@widgetcorp.com)进行注册,以创建两个组织。这将允许您隔离您的开发和测试工作,这样您就不会意外地中断您的实时应用程序。您还可以通过这种方式限制对生产组织的访问。

建立你的原型

如果您还没有阅读快速入门指南,我们建议您先从这里开始,然后再深入阅读本指南的其余部分。

对于 OpenAI API 的新手,我们的 playground 可以成为探索其功能的重要资源。这样做将帮助您了解什么是可能的,以及您可能希望将精力集中在哪些方面。您还可以浏览我们的示例提示。

虽然 playground 是制作原型的好地方,但它也可以用作大型项目的孵化区。 playground 还可以轻松导出 API 请求的代码片段并与协作者共享提示,使其成为开发过程中不可或缺的一部分。

附加提示

  1. 首先确定您希望应用程序具有的核心功能。考虑您将需要的数据输入、输出和处理的类型。旨在使原型尽可能集中,以便您可以快速高效地进行迭代。

  2. 选择您感觉最舒服并且最符合您的项目目标的编程语言和框架。一些流行的选项包括 Python、Java 和 Node.js。请参阅库支持页面以了解有关由我们的团队和更广泛的开发人员社区维护的库绑定的更多信息。

  3. 开发环境和支持:使用正确的工具和库设置您的开发环境,并确保您拥有训练模型所需的资源。利用我们的文档、社区论坛和我们的帮助中心获得故障排除方面的帮助。如果您正在使用 Python 进行开发,请查看此构建项目指南(存储库结构是项目架构的重要组成部分)。为了与我们的支持工程师联系,只需登录您的帐户并使用“帮助”按钮开始对话。

提高提示可靠性的技术

即使进行了周密的计划,在您的应用程序中使用 GPT-3 时为意外问题做好准备也很重要。在某些情况下,模型可能会在任务上失败,因此考虑可以采取哪些措施来提高应用程序的可靠性会很有帮助。

如果您的任务涉及逻辑推理或复杂性,您可能需要采取额外的步骤来构建更可靠的提示。总体而言,建议围绕:

  • 将不可靠的操作分解为更小、更可靠的操作(例如,选择推理提示
  • 使用多个步骤或多个关系使系统的可靠性高于任何单个组件(例如,美化提示

评估和迭代

开发生产系统最重要的方面之一是定期评估和迭代试验。此过程允许您衡量性能、解决问题并微调您的模型以提高准确性和效率。此过程的一个关键部分是为您的功能创建评估数据集。请记住以下几点:

  1. 确保您的评估集代表您的模型将在现实世界中使用的数据。这将允许您评估您的模型在它以前从未见过的数据上的性能,并帮助您了解它对新情况的泛化能力。

  2. 定期更新您的评估集,以确保它在您的模型发展和新数据可用时保持相关性。

  3. 使用各种指标来评估模型的性能。根据您的应用程序和业务成果,这可能包括准确度、精确度、召回率、F1 分数或平均精确度 (MAP)。此外,您可以将微调与权重和偏差同步以跟踪实验、模型和数据集。

  4. 将模型的性能与基线进行比较。这将使您更好地了解模型的优势和劣势,并有助于指导您未来的开发工作。

通过进行定期评估和迭代实验,您可以确保您的 GPT 驱动的应用程序或原型随着时间的推移不断改进。

评估语言模型

语言模型可能很难评估,因为评估生成语言的质量通常是主观的,并且有许多不同的方法可以用语言正确传达相同的信息。例如,在评估一个模型对一大段文本的总结能力时,有很多正确的总结。话虽如此,设计良好的评估对于机器学习取得进展至关重要。

评估套件需要全面、易于运行且速度相当快(取决于模型大小)。它还需要易于继续添加到套件中,因为一个月的综合性内容可能在另一个月就已经过时了。我们应该优先考虑具有多样性的任务和任务,这些任务可以识别模型中的弱点或没有随着扩展而改进的能力。

评估系统的最简单方法是手动检查其输出。它在做你想做的事吗?输出质量高吗?他们一致吗?

自动评估

加快测试速度的最佳方法是开发自动化评估。但是,这在摘要任务等更主观的应用程序中可能是不可能的。

当很容易将最终输出定为正确或不正确时,自动评估效果最佳。例如,如果您正在微调分类器以将文本字符串分类为 A 类或 B 类,这非常简单:创建一个包含示例输入和输出对的测试集,在输入上运行您的系统,然后对系统进行评分输出与正确输出(查看准确度、F1 分数、交叉熵等指标)。

如果您的输出是半开放式的,就像会议记录总结器那样,那么定义成功可能会比较棘手:例如,是什么让一个总结比另一个更好?这里,可能的技术包括:

  • 使用“黄金标准”答案编写测试,然后测量每个黄金标准答案与系统输出之间的某种相似性分数(我们已经看到嵌入为此工作得很好)

  • 建立一个判别器系统来判断/排序输出,然后给判别器一组输出,其中一个由被测系统生成(这甚至可以是 GPT 模型,询问给定输出是否正确回答了问题)

  • 建立一个评估模型,检查答案组成部分的真实性;例如,检测引号是否实际出现在给定文本中

对于非常开放的任务,例如创意故事作家,自动化评估更加困难。尽管可以制定质量指标来查看拼写错误、单词多样性和可读性分数,但这些指标并不能真正体现一篇文章的创造性质量。在找不到好的自动化指标的情况下,人工评估仍然是最好的方法。

评估基于 GPT-3 的系统的示例程序

作为一个例子,让我们考虑构建一个基于检索的问答系统的情况。

基于检索的问答系统有两个步骤。首先,用户的查询用于对知识库中可能相关的文档进行排名。其次,GPT-3 获得了排名靠前的文档,并被要求生成查询的答案。

可以进行评估以衡量每个步骤的性能。

对于搜索步骤,可以:

  • 首先,生成一个包含约 100 个问题的测试集和每个问题的一组正确文档

  • 如果您有任何问题,可以从用户数据中获取问题;否则,您可以发明一组具有不同风格和难度的问题。

  • 对于每个问题,让一个人手动搜索知识库并记录包含答案的文档集。

  • 然后使用测试集对系统的性能进行评分

  • 对于每个问题,使用系统对候选文档进行排名(例如,通过文档嵌入与查询嵌入的余弦相似度)。

  • 如果候选文档至少包含 1 个来自答案键的相关文档,则可以使用二进制准确度分数 1 对结果进行评分,否则为 0

  • 您还可以使用 Mean Reciprocal Rank 等连续指标,它可以帮助区分接近正确或远离正确的答案(例如,如果正确的文档排名第 1,则得分为 1,如果排名第 2,则得分为 ½ , ⅓ 如果排名 3, 等等)

对于问题回答步骤,可以:

  • 首先,生成一个包含约 100 组{question, relevant text, correct answer} 的测试集

  • 对于问题和相关文本,使用上面的数据

  • 对于正确的答案,让一个人写下大约 100 个好的答案的例子。

二、使用测试集对系统的性能进行评分

  • 对于每个问题和文本对,将它们组合成一个提示并将提示提交给 GPT-3

  • 接下来,将 GPT-3 的答案与人类编写的黄金标准答案进行比较

  • 这种比较可以是手动的,人类将它们并排查看并对 GPT-3 答案是否正确/高质量进行评分

  • 这种比较也可以通过使用嵌入相似性分数或其他方法来自动化(自动化方法可能会有噪音,但噪音是可以的,只要它是无偏见的,并且在你正在相互测试的不同类型的模型之间同样有噪音)

当然,N=100 只是一个例子,在早期阶段,您可能会从更容易生成的较小集合开始,而在后期阶段,您可能会投资成本更高但统计上更可靠的更大集合。

扩展您的解决方案架构

在设计使用我们的 API 用于生产的应用程序或服务时,重要的是要考虑如何扩展以满足流量需求。无论您选择哪种云服务提供商,您都需要考虑几个关键领域:

  • Horizontal scaling: 您可能希望横向扩展您的应用程序以适应来自多个来源的应用程序请求。这可能涉及部署额外的服务器或容器来分配负载。如果您选择这种类型的缩放,请确保您的体系结构设计用于处理多个节点,并且您有适当的机制来平衡它们之间的负载。
  • Vertical scaling: 另一种选择是垂直扩展您的应用程序,这意味着您可以增加单个节点可用的资源。这将涉及升级服务器的能力以处理额外的负载。如果您选择这种类型的扩展,请确保您的应用程序旨在利用这些额外资源。
  • Caching: 通过存储经常访问的数据,您可以缩短响应时间,而无需重复调用我们的 API。您的应用程序需要设计为尽可能使用缓存数据,并在添加新信息时使缓存无效。有几种不同的方法可以做到这一点。例如,您可以将数据存储在数据库、文件系统或内存缓存中,具体取决于哪种方式对您的应用程序最有意义。
  • Load balancing: 最后,考虑负载平衡技术以确保请求在可用服务器之间均匀分布。这可能涉及在服务器前面使用负载平衡器或使用 DNS 循环。平衡负载将有助于提高性能并减少瓶颈。

管理速率限制

使用我们的 API 时,了解和规划速率限制非常重要。

改善延迟

延迟是处理请求和返回响应所需的时间。在本节中,我们将讨论影响文本生成模型延迟的一些因素,并提供有关如何减少延迟的建议。

完成请求的延迟主要受两个因素影响:模型和生成的令牌数量。完成请求的生命周期如下所示:


大部分延迟通常来自令牌生成步骤。

Intuition: 提示标记对完成调用的延迟很少。生成完成令牌的时间要长得多,因为一次生成一个令牌。由于每个令牌所需的生成,较长的生成长度将累积延迟。

影响延迟的常见因素和可能的缓解技术

现在我们已经了解了延迟的基础知识,让我们看一下可能影响延迟的各种因素,大致按照从影响最大到影响最小的顺序排列。

模型

我们的 API 提供了不同程度的复杂性和通用性的不同模型。最强大的模型,例如 gpt-4,可以生成更复杂和多样化的补全,但它们也需要更长的时间来处理您的查询。 gpt-3.5-turbo 等模型可以生成更快、更便宜的聊天完成,但它们生成的结果可能不太准确或与您的查询不相关。您可以选择最适合您的用例的模型以及速度和质量之间的权衡。

完成令牌的数量

请求大量生成的令牌完成会导致延迟增加:

  • 较低的最大令牌数:对于具有类似令牌生成计数的请求,那些具有较低 max_tokens 参数的请求会产生较少的延迟。

  • 包括停止序列:为防止生成不需要的令牌,请添加停止序列。例如,您可以使用停止序列生成包含特定数量项目的列表。在这种情况下,通过使用 11. 作为停止序列,您可以生成一个只有 10 个项目的列表,因为当到达 11. 时完成将停止。

  • 生成更少的补全:尽可能降低 n 和 best_of 的值,其中 n 指的是为每个提示生成多少补全,best_of 用于表示每个标记具有最高对数概率的结果。

如果 n 和 best_of 都等于 1(这是默认值),则生成的令牌数量最多等于 max_tokens。

如果 n(返回的完成数)或 best_of(为考虑而生成的完成数)设置为 > 1,则每个请求将创建多个输出。在这里,您可以将生成的令牌数视为 [ max_tokens * max (n, best_of) ]

Streaming

在请求中设置 stream: true 会使模型在令牌可用时立即开始返回令牌,而不是等待生成完整的令牌序列。它不会改变获取所有令牌的时间,但它会减少我们想要显示部分进度或将停止生成的应用程序的第一个令牌的时间。这可能是更好的用户体验和 UX 改进,因此值得尝试流式传输。

基础设施

我们的服务器目前位于美国。虽然我们希望在未来实现全球冗余,但与此同时,您可以考虑将基础设施的相关部分放在美国,以最大限度地减少服务器与 OpenAI 服务器之间的往返时间。

批处理

根据您的用例,批处理可能会有所帮助。如果您向同一个端点发送多个请求,您可以批处理要在同一个请求中发送的提示。这将减少您需要提出的请求数量。 prompt 参数最多可以包含 20 个不同的提示。我们建议您测试此方法,看看是否有帮助。在某些情况下,您最终可能会增加生成的令牌数量,这会减慢响应时间。

管理成本

要监控您的成本,您可以在您的帐户中设置一个软限制,以便在您超过某个使用阈值时收到一封电子邮件警报。您还可以设置硬限制。请注意硬限制可能会导致您的应用程序/用户中断。使用用量跟踪仪表板来监控您在当前和过去的计费周期中的令牌使用情况。

文本生成

将原型投入生产的挑战之一是对与运行应用程序相关的成本进行预算。 OpenAI 提供现收现付的定价模式,每 1,000 个代币(约等于 750 个单词)的价格。要估算您的成本,您需要预测代币利用率。考虑诸如流量级别、用户与您的应用程序交互的频率以及您将处理的数据量等因素。

考虑降低成本的一个有用框架是将成本视为代币数量和每个代币成本的函数。使用此框架可以通过两种潜在途径降低成本。首先,您可以通过为某些任务切换到较小的模型来降低每个令牌的成本,以降低成本。或者,您可以尝试减少所需的令牌数量。有几种方法可以做到这一点,例如使用更短的提示、微调模型或缓存常见的用户查询,这样就不需要重复处理它们。

您可以尝试使用我们的交互式分词器工具来帮助您估算成本。 API 和 playground 还返回令牌计数作为响应的一部分。一旦您使用了我们最强大的模型,您就可以查看其他模型是否可以以更低的延迟和成本产生相同的结果。

MLOps 策略

当您将原型投入生产时,您可能需要考虑制定 MLOps 策略。 MLOps(机器学习操作)是指管理机器学习模型的端到端生命周期的过程,包括您可能使用我们的 API 进行微调的任何模型。设计 MLOps 策略时需要考虑多个方面。这些包括

  • 数据和模型管理:管理用于训练或微调模型以及跟踪版本和更改的数据。

  • 模型监控:随着时间的推移跟踪模型的性能并检测任何潜在的问题或退化。

  • 模型再训练:确保您的模型与数据变化或不断变化的需求保持同步,并根据需要进行再训练或微调。

  • 模型部署:自动化将模型和相关工件部署到生产中的过程。

仔细考虑您的应用程序的这些方面将有助于确保您的模型保持相关性并随着时间的推移表现良好。

安全性和合规性

当您将原型投入生产时,您需要评估并解决可能适用于您的应用程序的任何安全性和合规性要求。这将涉及检查您正在处理的数据、了解我们的 API 如何处理数据,以及确定您必须遵守哪些法规。作为参考,这里是我们的隐私政策使用条款

您需要考虑的一些常见领域包括数据存储、数据传输和数据保留。您可能还需要实施数据隐私保护,例如在可能的情况下进行加密或匿名化。此外,您应该遵循安全编码的最佳实践,例如输入清理和正确的错误处理。

安全最佳实践

使用我们的 API 创建您的应用程序时,请考虑我们的安全最佳实践,以确保您的应用程序安全且成功。这些建议强调了广泛测试产品、积极解决潜在问题以及限制滥用机会的重要性。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号