生产最佳实践open in new window

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

建立你的组织

一旦您登录open in new window到您的OpenAI账户,您可以在组织设置open in new window中找到您的组织名称和ID。组织名称是您的组织的标签,在用户界面上显示。组织ID是您的组织的唯一标识符,可以在API请求中使用。

属于多个组织的用户可以发送一个请求头open in new window来指定在API请求中使用哪个组织。这些API请求的用量将计入指定组织的配额。如果没有提供标头,将向默认组织open in new window计费。你可以在你的用户设置open in new window中改变你的默认组织。

你可以从成员open in new window设置页面邀请新成员加入你的组织。会员可以是读者或所有者。读者可以提出API请求并查看基本的组织信息,而所有者可以修改计费信息并管理组织内的成员。

管理计费限额

新的免费试用用户收到5美元的初始信贷,三个月后到期。一旦信用额度用完或过期,你可以选择输入账单信息open in new window以继续使用API。如果没有输入计费信息,你将仍然有登录权限,但将无法再提出任何API请求。

一旦您输入了您的账单信息,您将有一个被批准的使用限额,即每月120美元,这是由OpenAI设定的。如果要增加您的配额,超过每月120美元的计费限额,请提交配额增加申请open in new window

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

API keys

OpenAI的API使用API密钥进行认证。请访问您的API密钥open in new window页面,检索您将在请求中使用的API密钥。

这是一种相对直接的控制访问的方式,但你必须对这些密钥的安全保持警惕。避免在你的代码中或公共资源库中暴露API密钥;相反,要把它们存储在一个安全的地方。你应该使用环境变量或秘密管理服务将你的密钥暴露给你的应用程序,这样你就不需要在你的代码库中硬编码了。在我们的API密钥安全最佳实践open in new window中阅读更多内容。

阶段性账户

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

建立你的原型

如果你还没有看过快速入门指南open in new window,我们建议你在进入本指南的其余部分之前从那里开始。

对于那些刚接触OpenAI API的人来说,我们的游乐场open in new window可以成为探索其能力的一个重要资源。这样做将帮助你了解什么是可能的,以及你可能想要集中精力的地方。你也可以探索我们的示例提示open in new window

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

其他提示

  1. 首先确定你希望你的应用程序所具有的核心功能。考虑你将需要的数据输入、输出和流程的类型。争取使原型尽可能地集中,这样你就可以快速有效地进行迭代。
  2. 选择你觉得最舒服的编程语言和框架,并与你的项目目标最一致。一些流行的选择包括Python、Java和Node.js。参见库支持open in new window页面,了解更多关于由我们团队和更广泛的开发者社区维护的库绑定。
  3. 开发环境和支持:用正确的工具和库设置你的开发环境,确保你有训练你的模型所需的资源。利用我们的文档、社区论坛open in new window和我们的帮助中心open in new window来获得故障排除方面的帮助。如果你正在使用Python进行开发,请看一下这个项目结构指南open in new window(资源库结构是你项目结构的一个重要部分)。为了与我们的支持工程师联系,只需登录到您的帐户,使用 "帮助 "按钮开始对话。

围绕提示语提高可靠性的技术

即使有仔细的计划,当在你的应用中使用GPT-3时,为意外问题做好准备是很重要的。在某些情况下,模型可能会在任务中失败,所以考虑你能做些什么来提高你的应用程序的可靠性是有帮助的。

如果你的任务涉及逻辑推理或复杂性,你可能需要采取额外的步骤来建立更可靠的提示。关于一些有用的建议,请参考我们的提高可靠性的技术指南open in new window。总的来说,这些建议是围绕着:

评估和迭代

开发一个用于生产的系统最重要的方面之一是定期评估和迭代实验。这个过程允许你测量性能,排除问题,并微调你的模型以提高准确性和效率。这个过程的一个关键部分是为你的功能创建一个评估数据集。这里有几件事情要记住:

  1. 确保你的评估集能代表你的模型在现实世界中使用的数据。这将使你能够评估你的模型在它以前没有见过的数据上的表现,并帮助你了解它对新情况的概括程度。
  2. 定期更新你的评估集,以确保它随着你的模型的发展和新数据的出现而保持相关性。
  3. 使用各种指标来评估你的模型的性能。根据你的应用和业务成果,这可能包括准确率、精确度、召回率、F1得分或平均精度(MAP)open in new window。此外,你可以将你的微调与权重和偏差open in new window同步,以跟踪实验、模型和数据集。
  4. 将你的模型的性能与基线进行比较。这将使你更好地了解你的模型的优势和劣势,并能帮助指导你未来的开发工作。

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

评估语言模型

语言模型可能很难评估,因为评估生成语言的质量往往是主观的,而且有许多不同的方式来正确传达语言中的相同信息。例如,当评估一个模型对一段长文进行总结的能力时,有许多正确的总结。也就是说,设计好的评价是在机器学习中取得进展的关键。

一个评估套件需要全面,易于运行,并有合理的速度(取决于模型大小)。它还需要易于继续添加到套件中,因为这个月的全面性很可能在下个月就已经过时了。我们应该优先考虑任务的多样性,以及识别模型中的弱点或没有随着规模扩大而提高的能力的任务。

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

自动评估

快速测试的最好方法是开发自动评估。然而,这在更多的主观应用中可能是不可能的,比如总结任务。

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

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

  • 编写带有 "黄金标准 "答案的测试,然后测量每个黄金标准答案和系统输出之间的某种相似性分数(我们已经看到嵌入在这方面的效果很好)
  • 建立一个判别系统来判断/排列输出,然后给该判别系统一组输出,其中一个是由被测系统生成的(这甚至可以是GPT模型,被问及问题是否由给定的输出正确回答)。
  • 构建一个评估模型,检查答案的组成部分的真实性;例如,检测一个引文是否真的出现在给定文本的片段中

对于非常开放的任务,如创造性的故事作者,自动评估是比较困难的。尽管有可能开发出质量指标,考察拼写错误、单词多样性和可读性分数,但这些指标并不能真正捕捉到一篇文章的创造性质量。在找不到好的自动衡量标准的情况下,人的评价仍然是最好的方法。

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

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

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

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

对于搜索步骤,人们可以:

  • 首先,生成一个测试集,其中有大约100个问题和每个问题的正确文件集。
  • 如果你有用户数据,这些问题可以来自用户数据;否则,你可以发明一套具有不同风格和难度的问题。
  • 对于每个问题,让一个人手动搜索知识库并记录包含答案的文档集。
  • 第二,使用测试集给系统的表现打分
  • 对于每个问题,使用系统对候选文档进行排名(例如,通过文档嵌入与查询嵌入的余弦相似度)。
  • 你可以用二进制的准确性评分,如果候选文档至少包含1个来自答案键的相关文档,则评分为1,否则为0
  • 你也可以使用一个连续的指标,如平均互换等级,它可以帮助区分接近正确或远离正确的答案(例如,如果正确的文档是等级1,则得分1,如果等级2,则得分1/2,如果等级3,则得分⅓,等等)。

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

  • 首先,生成一个测试集,其中包括~100组{问题、相关文本、正确答案}。
  • 对于问题和相关文本,使用上述数据
  • 对于正确答案,让一个人写下~100个例子,说明一个好的答案是什么样子。

第二,使用测试集为系统的性能打分

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

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

扩展你的解决方案架构

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

  • 横向扩展:你可能想横向扩展你的应用程序,以适应来自多个来源的应用程序的请求。这可能涉及部署额外的服务器或容器来分配负载。如果你选择这种类型的扩展,请确保你的架构是为处理多个节点而设计的,并且你有机制来平衡它们之间的负载。
  • 垂直扩展:另一个选择是纵向扩展你的应用程序,这意味着你可以加强单个节点的可用资源。这将涉及升级你的服务器的能力,以处理额外的负载。如果你选择这种类型的扩展,确保你的应用程序被设计成能够利用这些额外的资源。
  • 缓存:通过存储经常访问的数据,你可以提高响应时间,而不需要重复调用我们的API。你的应用程序将需要被设计成尽可能地使用缓存数据,并在添加新信息时使缓存失效。有几种不同的方法可以做到这一点。例如,你可以将数据存储在数据库、文件系统或内存缓存中,这取决于什么对你的应用程序最有意义。
  • 负载平衡:最后,考虑负载平衡技术,以确保请求被均匀地分布在你的可用服务器上。这可能涉及到在你的服务器前使用一个负载平衡器或使用DNS轮流。平衡负载将有助于提高性能和减少瓶颈。

管理速度限制

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

改善延迟

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

完成请求的延迟主要受两个因素的影响:模型和生成的标记的数量。一个完成请求的生命周期是这样的:

大部分的延迟通常来自于token生成步骤。

TIP

直觉:Prompt tokens对完成调用的延迟增加得很少。生成completion tokens的时间要长得多,因为token是一次生成一个。较长的生成长度将累积延迟,因为每个token都需要生成。

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

现在我们已经看过了延迟的基本知识,让我们来看看能够影响延迟的各种因素,大致从影响最大到影响最小排序。

Model

我们的API提供不同的模型,具有不同的复杂程度和通用性。能力最强的模型,如gpt-4,可以生成更复杂、更多样的补语,但它们也需要更长的时间来处理您的查询。像gpt-3.5-turbo这样的模型,可以产生更快更便宜的聊天完成度,但它们可能产生的结果对你的查询来说不太准确或相关。您可以选择最适合您的使用情况的模型,并在速度和质量之间进行权衡。

完成tokens的数量

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

  • 降低最大token:对于具有类似token生成数量的请求,那些具有较低max_tokens参数的请求会产生较少的延迟。
  • 包括停止序列:为了防止生成不需要的token,添加一个停止序列。例如,你可以使用停止序列来生成一个具有特定数量的项目的列表。在这种情况下,通过使用11.作为停止序列,你可以生成一个只有10个项目的列表,因为当达到11.时完成将停止。阅读我们关于停止序列的帮助文章open in new window,了解更多关于如何做到这一点的背景。
  • 生成更少的完成度:尽可能降低nbest_of的值,其中n指的是为每个提示生成多少个完成度,best_of用于表示每个标记具有最高对数概率的结果。

如果nbest_of都等于1(这是默认的),那么生成的tokens的数量将最多等于max_tokens

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

Streaming

在一个请求中设置stream: true使得模型在有token的时候就开始返回token,而不是等待完整的token序列生成。这并不改变获得所有token的时间,但对于我们想显示部分进展或要停止生成的应用,它减少了获得第一个token的时间。这可以是一个更好的用户体验,也是一个用户体验的改进,所以值得实验一下流媒体。

基础设施

我们的服务器目前位于美国。虽然我们希望将来能有全球冗余,但与此同时,你可以考虑将你的基础设施的相关部分设在美国,以减少你的服务器和OpenAI服务器之间的往返时间。

Batching

根据你的使用情况,批处理可能有帮助。如果你要向同一个端点发送多个请求,你可以将批量提示信息在同一个请求中发送。这将减少你需要发出的请求的数量。提示参数最多可以容纳20个独特的提示信息。我们建议你测试一下这种方法,看看它是否有帮助。在某些情况下,你最终可能会增加生成的token的数量,这将减缓响应时间。

管理花费

为了监控你的费用,你可以在你的账户中设置一个软限制,一旦你超过某个使用门槛,就会收到电子邮件提醒。你也可以设置一个硬限制。请注意,硬性限制可能会对您的应用程序/用户造成干扰。使用使用情况跟踪仪表板open in new window来监测你在当前和过去的计费周期中的token使用情况。

文本生成

将你的原型推向生产的挑战之一是为运行你的应用程序的相关费用做预算。OpenAI提供现收现付的定价模式open in new window,每1000个token(大约相当于750个单词)的价格。为了估计你的成本,你将需要预测token的利用率。考虑一些因素,如流量水平,用户与您的应用程序互动的频率,以及您将处理的数据量。

思考降低成本的一个有用框架是将成本视为token数量和每个token成本的函数。 使用这个框架,有两个潜在的降低成本的途径。首先,你可以努力减少每个token的成本,为一些任务切换到较小的模型,以降低成本。或者,你可以尝试减少所需token的数量。有几种方法可以做到这一点,如使用更短的提示,微调模型,或缓存常见的用户查询,以便不需要重复处理。

你可以用我们的交互式tokenizer工具open in new window进行实验,以帮助你估算成本。API和游乐场也会将token计数作为响应的一部分返回。一旦你用我们最能干的模型把事情做好了,你可以看看其他模型是否能以更低的延迟和成本产生同样的结果。在我们的token使用帮助文章open in new window中了解更多。

机器学习运维策略

当你将你的原型推向生产时,你可能想考虑制定一个机器学习运维策略。MLOps(机器学习运维)指的是管理你的机器学习模型的端到端生命周期的过程,包括任何你可能使用我们的API进行微调的模型。在设计你的MLOps战略时,有许多方面需要考虑。这些方面包括

  • 数据和模型管理:管理用于训练或微调你的模型的数据,跟踪版本和变化。
  • 模型监控:随着时间的推移,跟踪你的模型的性能,发现任何潜在的问题或退化。
  • 模型再训练:确保你的模型与数据的变化或不断变化的要求保持同步,并根据需要重新训练或微调它。
  • 模型部署:将你的模型和相关构件部署到生产中的过程自动化。

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

Security and compliance

当你把你的原型转移到生产中时,你将需要评估和解决可能适用于你的应用程序的任何安全和合规要求。这将涉及检查你所处理的数据,了解我们的API如何处理数据,并确定你必须遵守哪些规定。作为参考,这里有我们的隐私政策open in new window使用条款open in new window

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

最佳安全实践

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

Last Updated:
Contributors: lanheixingkong