入门文档(docs)
指南(Guides)
生产最佳实践(Production Best Practices)

全面的最佳生产实践Production Best Practices

本指南提供了一套全面的最佳实践,帮助您从原型转向生产。

无论您是经验丰富的机器学习工程师还是新近的爱好者,本指南都应该为您提供成功将平台应用于生产环境所需的工具 —— 从保证 API 访问的安全性到设计能够处理高流量的健壮架构。

使用本指南来帮助制定部署应用程序的计划,以尽可能平稳和有效地实现。

组织设置Setting up your organization

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

属于多个组织的用户可以提供标头 (opens in a new tab)来指定用于 API 请求的组织。从这些 API 请求中的使用将计入指定组织的配额。如果未提供标头,则会计费默认组织 (opens in a new tab)。您可以在用户设置 (opens in a new tab)中更改默认组织。

您可以从成员 (opens in a new tab)设置页面邀请新成员加入您的组织。成员可以是读者所有者。读者可以进行 API 请求并查看基本的组织信息,而所有者可以修改结算信息并管理组织内的成员。

结算信息Managing billing limits

全新的免费试用用户将会收到 $5 的初次信用,其有效期为三个月。信用用尽或过期后,您可以选择输入结算信息 (opens in a new tab)以继续使用 API。如果未输入结算信息,则仍然具有登录访问权限,但无法进行任何进一步的 API 请求。

一旦输入了您的结算信息,您将获得每月 $120 的使用额度,这是由 OpenAI 设定的上限。如需扩大配额超出每月 $120 的结算限制,请提交配额增加请求

如果您希望在使用量超过某个特定值时得到通知,您可以通过使用限制 (opens in a new tab)页面设置软限制。当软限制达到时,组织所有者将收到电子邮件通知。您还可以设置硬限制,使达到硬限制后,任何后续的 API 请求都将被拒绝。请注意,这些限制是最佳努力,使用量和限制之间可能会有 5 到 10 分钟的延迟。

API keys

OpenAI API 使用 API 密钥进行身份验证。访问API 密钥 (opens in a new tab)页面以检索在请求中使用的 API 密钥。

这是一种相对简单的控制访问的方法,但必须保持警觉以确保这些密钥的安全性。避免将API密钥暴露在代码或公共存储库中;而是将它们存储在安全的位置中。您应该使用环境变量或秘密管理服务向您的应用程序公开密钥,以便您不需要在代码库中进行硬编码。在我们的API密钥安全最佳实践 (opens in a new tab)中了解更多信息。

Staging accounts

随着规模的扩大,您可能希望为您的暂存环境和生产环境创建单独的组织。请注意,您可以使用两个不同的电子邮件地址注册,比如bob+prod@widgetcorp.combob+dev@widgetcorp.com,来创建两个组织。这将允许您隔离开发和测试工作,以避免意外干扰您的现场应用程序。您也可以通过这种方式限制对您的生产组织的访问。

设计你的原型 Building your prototype

如果您还没有完成快速入门指南,我们建议您在深入阅读本指南之前从那里开始。

对于那些刚开始接触 OpenAI API 的人来说,我们的playground是一个非常好的资源,可以探索其功能。这样做可以帮助您了解可能的可能性以及您可能希望将重点放在哪里。您还可以探索我们的样例提示

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

额外的提示 Additional tips

  • 首先确定您的应用程序需要的核心功能

考虑您需要的数据输入、输出和流程类型。旨在保持原型的重点集中,以便您可以快速高效地迭代。

  • 选择您最为熟悉的编程语言和框架

并最好与您的项目目标相一致。一些流行的选项包括 Python、Java 和 Node.js。请参阅库支持页面,了解我们团队和更广泛的开发者社区维护的库绑定的详细信息。

  • 开发环境和支持

使用正确的工具和库设置您的开发环境,并确保您拥有训练模型所需的资源。借助我们的文档、社区论坛 (opens in a new tab)以及我们的帮助中心 (opens in a new tab),以解决故障的方式获得帮助。如果您正在使用Python开发,请查看这个项目结构指南 (opens in a new tab)(仓库结构是项目架构的重要部分)。

为了与我们的支持工程师联系,只需登录您的帐户并使用“帮助”按钮开始交流。

提高应用程序的可靠性

即使有仔细的规划,当在您的应用程序中使用GPT-3时,准备应对意外问题也很重要。在某些情况下,模型可能在任务上失败,因此考虑如何提高应用程序的可靠性是有帮助的。

如果您的任务涉及逻辑推理或复杂性,您可能需要采取额外的步骤来构建更可靠的提示。对于一些有用的建议,请参考我们的提高可靠性技巧指南 (opens in a new tab)。总体建议包括:

评估和迭代实验 Evaluation and iteration

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

  • 确保您的评估集代表了模型在实际世界中将使用的数据。这将使您能够评估模型在之前未见过的数据上的性能,并帮助您了解它在新情况下的泛化能力。
  1. 定期更新您的评估集以确保其与模型的演变和新数据保持相关

  2. 使用各种指标评估模型的性能。根据应用和业务结果,这可能包括[准确度、精确率、召回率、F1分数或平均精度(MAP)](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_fscore_support)。此外,您可以将微调与[Weights (opens in a new tab) & Biases](/docs/guides/fine-tuning/advanced-usage)同步,以跟踪实验、模型和数据集。

  3. 将模型的性能与基准进行比较。这将使您更好地了解模型的优势和弱点,并有助于指导您未来的发展努力。

通过定期评估和迭代性实验,您可以确保您的基于GPT的应用程序或原型在时间推移中不断改进。

评估语言模型

评估语言模型可能很困难,因为评估生成的语言质量通常是主观的,并且有很多不同的方法可以以正确的方式传达同一条信息。例如,当评估模型对长篇文本的摘要能力时,有许多正确的摘要。话虽如此,设计好的评估对于推动机器学习的进步至关重要。

评估套件需要全面、易于运行,并且速度合理(取决于模型大小)。它还需要易于继续添加到套件中,因为一个月所认为的全面很可能在另一个月过时。我们应该优先考虑具有多样性的任务,并且这些任务可以确定模型中的弱点或无法通过缩放改进的功能。

评估您的系统的最简单方法是手动检查其输出。它是否执行您想要的操作?输出质量高吗?它们的一致性如何?

自动化评估

更快地进行测试的最佳方法是开发自动化评估。但是,在摘要等较为主观的应用中,这可能是不可能的。

自动评估在能够轻松将最终输出评为正确或不正确时表现最佳。例如,如果您正在微调分类器以将文本字符串分类为A类或B类,则相当简单:创建一个测试集,其中包括输入和输出示例对,对输入运行您的系统,然后将系统输出与正确输出进行比较(查看准确性、F1分数、交叉熵等指标)。

如果您的输出是半开放式的,例如会议记录摘要器,那么定义成功可能就会更加棘手:例如,是什么使得一份摘要比另一份更好?在这里,可能的技术包括:

  • 编写带有“黄金标准”答案的测试,然后测量每个黄金标准答案与系统输出之间的某种相似度得分(我们看到嵌入在这方面表现不错)。

  • 构建一个鉴别器系统来判断/排名输出,并给该鉴别器一组输出,其中一个是由被测试的系统生成的(这甚至可以是GPT模型,通过输出判断是否正确回答问题)

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

对于非常开放的任务,例如创造性写作,自动化评估更加困难。虽然可能可以开发质量度量标准,看拼写错误、单词多样性和可读性分数,但这些度量标准并不能真正捕捉到一篇文章的创造性质量。在找不到好的自动度量标准的情况下,人工评估仍然是最佳方法。

基于检索的问答系统 Example procedure for evaluating a GPT-3-based system

以构建一种基于检索的问答系统为例。

基于检索的问答系统有两个步骤。首先,使用用户的查询来排列知识库中可能相关的文档。其次,GPT-3提供排名靠前的文档,并询问查询的答案。

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

对于搜索步骤,可以:

  • 首先,生成一个测试集,其中包含约100个问题和每个问题的正确文档集
  • 如果您有用户数据,可以从其中获取问题;否则,您可以发明一组不同风格和难度的问题。
  • 对于每个问题,让一个人手动搜索知识库并记录包含答案的文档集。
  • 其次,使用测试集来评估系统的性能
  • 对于每个问题,使用系统对候选文档进行排名(例如,通过文档嵌入与查询嵌入的余弦相似度)。
  • 您可以使用二进制准确度得分对结果进行评分,如果候选文档至少包含一个答案键中的相关文档,则为1,否则为0。
  • 您还可以使用连续的度量,例如平均倒数排名,它可以帮助区分接近正确与远离正确的答案(例如,如果正确文档的排名为1,则得分为1,如果排名为2,则得分为1/2,如果排名为3,则得分为1/3,等等)。

对于问题回答步骤,可以采用以下方法

  • 首先,生成一个测试集,包含约100组{问题,相关文本,正确答案}
  • 对于问题和相关文本,请使用上述数据
  • 对于正确答案,请让一个人编写约100个优秀答案的示例。

第二,使用测试集评估系统的表现

  • 对于每个问题和文本对,将它们组合成提示并将提示提交给GPT-3
  • 接下来,将GPT-3的答案与由人类编写的金标准答案进行比较
  • 这种比较可以是手动的,其中人类并排查看它们并评分GPT-3答案是否正确/高质量
  • 这种比较也可以是自动的,通过使用嵌入相似性得分或其他方法(自动方法可能会有噪声,但只要它是无偏的并且在要相互测试的不同模型类型之间同等嘈杂即可)

Of course, N=100 is just an example, and in early stages, you might start with a smaller set that’s easier to generate, and in later stages, you might invest in a larger set that’s more costly but more statistically reliable.

扩展 Scaling your solution architecture

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

  • 水平扩展:您可能需要横向扩展应用程序以适应来自多个来源的应用程序请求。这可能涉及部署其他服务器或容器来分配负载。如果您选择这种类型的扩展,请确保您的架构被设计为处理多个节点,并且您已经采取了平衡负载的机制。
  • 垂直扩展:另一种选择是垂直扩展应用程序,这意味着您可以增加单个节点的资源。这将涉及升级您的服务器能力以处理额外的负载。如果您选择这种类型的扩展,请确保您的应用程序被设计为利用这些额外的资源。
  • 缓存:通过存储频繁访问的数据,您可以提高响应时间,无需重复调用我们的API。您的应用程序需要被设计为尽可能使用缓存数据,并在添加新信息时使缓存失效。您可以使用一些不同的方式来实现这一点。例如,您可以根据应用程序的最合适选择将数据存储在数据库、文件系统或内存缓存中。
  • 负载均衡:最后,请考虑负载均衡技术,以确保请求均匀分布在可用服务器上。这可能涉及在您的服务器前使用负载均衡器或使用DNS轮询。平衡负载将有助于提高性能并减少瓶颈。

管理限速 Managing rate limits

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

减少延迟Improving latencies

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

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

网络端到API的延迟
服务器处理提示令牌所需时间
服务器生成/抽样令牌所需时间
网络API到终端用户的延迟

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

直觉:提示令牌对完成调用的延迟几乎没有影响。生成完成令牌的时间要长得多,因为令牌是一个接一个地生成的。由于每个令牌都需要进行生成,较长的生成长度将累积延迟。

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

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

模型

我们的API提供了不同复杂性和广泛适用性的不同模型。 最高级别的模型,例如gpt-4,可以生成更复杂和多样化的完成,但它们处理您的查询所需的时间也更长。

gpt-3.5-turbo之类的模型可以生成更快速和更便宜的交流完成,但是它们可能会生成与您的查询相关性较低或不准确的结果。 您可以选择最适合您用例和速度/质量之间权衡的模型。

完成令牌数

请求生成大量令牌完成可能会导致增加延迟。

  • 降低max_tokens: 对于令牌生成计数相似的请求,具有较低max_tokens参数的请求会引起较少的延迟。
  • 包含停止序列: 为了防止生成不需要的令牌,请添加停止序列。 例如,您可以使用停止序列生成具有特定数量条目的列表。 在这种情况下,通过使用11.作为停止序列,您可以仅生成包含10个项目的列表,因为完成将在到达11.时停止。 阅读我们关于停止序列的帮助文章以获取有关如何执行此操作的更多上下文。
  • 生成较少的完成: 在可能的情况下降低nbest_of的值,其中n表示每个提示生成多少个完成,best_of用于表示每个标记具有最高对数概率的结果。

如果nbest_of都等于1(默认值),则生成的令牌数量最多等于max_tokens

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

流式传输

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

基础设施 Infrastructure

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

分批 Batching

根据您的使用情况,分批处理 可能会有所帮助 。如果您要发送多个请求到同一端点(Completion),您可以将这些请求 批量处理 并在同一请求中发送。这将减少您需要发送的请求数量。提示参数可以容纳最多20个唯一的提示。我们建议您测试一下这种方法,看看它是否有帮助。在某些情况下,您可能会增加生成的令牌数量,这会降低响应时间。

监控您的成本 Managing costs

为了监控您的成本,您可以在您的账户中设置一个软限制,当您超过某个使用阈值时,会收到一封电子邮件警报。您还可以设置一个硬限制。请注意,硬限制可能会对您的应用程序/用户造成干扰。使用使用跟踪仪表盘 (opens in a new tab)来监控当前和过去的结算周期中的令牌使用情况。

生成文字所需的成本 Text generation

将您的原型移动到生产环境的一个难点是预算运行应用程序所需的成本。OpenAI 提供 按量支付的定价模型 (opens in a new tab),每1,000个令牌的价格(大致相当于 750个单词)。

要估算成本,您需要预测令牌利用情况。考虑因素,如流量水平,用户与您的应用程序交互的频率以及您将要处理的数据量。

降低成本的一个有用框架是将成本视为令牌数量和每个令牌的成本函数。

使用此框架可以有两种降低成本的潜在途径。首先,您可以尝试通过转换为某些任务的较小模型来降低每个令牌的成本以降低成本。或者,您可以尝试减少所需的令牌数量。您可以通过使用较短的提示、微调模型或缓存常见用户查询来避免重复处理来实现这一点。

您可以尝试我们的交互式标记工具来帮助您估算成本。API和游乐场也会在响应中返回令牌计数。一旦您使用我们最强大的模型使事情正常运行,您可以查看其他模型是否能够以更低的延迟和成本产生相同的结果。在我们的标记使用帮助文章 (opens in a new tab)中了解更多信息。

MLOps策略MLOps strategy

在将您的原型转移到生产环境时,您可能需要考虑开发MLOps策略。MLOps (机器学习运营)指的是管理您的机器学习模型的端到端生命周期的过程,包括您使用我们的API进行微调的任何模型。设计MLOps策略时需要考虑许多方面。其中包括

  • 数据和模型管理: 管理用于训练或微调模型的数据,并跟踪版本和更改。
  • 模型监控: 跟踪模型在时间上的表现,并检测任何潜在问题或退化。
  • 模型重训练: 确保您的模型随着数据或不断发展的要求的变化保持最新,必要时进行重新训练或微调。
  • 模型部署: 自动化将您的模型及相关工件部署到生产环境的过程。

仔细思考应用程序的这些方面,将有助于确保您的模型随时间保持相关并良好地执行。

安全性和合规性要求 Security and compliance

当您将原型转移到生产环境时,您需要评估并解决可能适用于您的应用程序的任何安全性和合规性要求。这将涉及检查您正在处理的数据,了解我们的API如何处理数据,并确定您必须遵守的法规。我们的安全实践 (opens in a new tab)信任和合规门户 (opens in a new tab)提供了我们最全面和最新的文档。供参考,这里是我们的隐私政策 (opens in a new tab)使用条款 (opens in a new tab)

您需要考虑的常见领域包括数据存储、数据传输和数据保留。您可能还需要实施数据隐私保护措施,例如尽可能使用加密或匿名化等。此外,您应该遵循安全编码的最佳实践,例如输入过滤和正确的错误处理。

安全最佳实践 Safety best practices

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