guides
production-best-practices
Index

生产最佳实践

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

设置您的组织

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

属于多个组织的用户可以传递标题以指定用于API请求的组织。 这些API请求使用情况将计入指定组织的配额。 如果未提供标题,则默认将收取费用。 您可以在用户设置中更改默认组织。

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

管理计费限制

新的免费试用用户将获得5美元的初始信用额,该信用额在三个月后到期。一旦信用额已经使用或过期,您可以选择输入结算信息以继续使用API。如果未输入任何结算信息,则仍然可以登录访问,但无法进行进一步的API请求。

一旦输入了您的结算信息,您将拥有每月120美元的批准使用限制,这是由OpenAI设置的。要增加超过每月120美元计费限制的配额,请提交配额增加请求。

如果您希望在使用量超过某个特定金额时收到通知,则可以通过使用限制页面设置软性限制。当达到软性限制时,组织所有者将收到电子邮件通知。您还可以设置硬性极限,在达到硬性极限后,任何随后的API请求都将被拒绝。请注意这些限制是最佳努力,并且在使用和强制执行之间可能会有5至10分钟延迟。

API密钥

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

这是一种相对简单的控制访问方式,但您必须注意保护这些密钥。避免在代码或公共存储库中暴露API密钥;而是将它们存储在安全位置。您应该使用环境变量或秘密管理服务向应用程序公开您的键,以便不需要在代码库中硬编码它们。阅读更多有关API密钥安全性最佳实践的信息。

暂存账户

随着您的业务规模扩大,您可能希望为暂存和生产环境创建单独的组织。请注意,您可以使用两个不同的电子邮件地址进行注册,例如[email protected][email protected] 来创建两个组织。这将使您能够隔离开发和测试工作,以免意外干扰实时应用程序。通过这种方式还可以限制对生产组织的访问权限。

构建您的原型

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

对于那些刚接触OpenAI API的人来说,我们的游乐场可以是探索其功能的绝佳资源。这样做将帮助您了解可能性以及可能想要集中精力的地方。 您还可以探索我们的示例提示。

虽然游乐场是原型设计的好地方,但它也可以用作更大项目孵化区域。 游乐场还使得导出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;否则为0.
  • 您还可以使用连续指标(如平均倒数排名),这有助于区分接近正确或远离正确答案的情况(例如:如果正确文件是第1位,则得分为1;如果是第2位,则得分为1/2; 如果是第3位,则得分为1/3等)。

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

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

其次,使用测试集来评估系统的性能。

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

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

  • 这种比较可以是手动的,即人类将它们并排放置,并评分GPT-3答案是否正确/高质量。

  • 这种比较也可以是自动化的,通过使用嵌入相似度得分或另一种方法(自动化方法可能会有噪声,但只要它是无偏差且在您正在相互测试的不同类型模型之间同样有噪声就可以)。

扩展你的解决方案架构

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

  • 水平扩展:您可能希望水平扩展应用程序以适应来自多个来源的请求。这可能涉及部署其他服务器或容器以分配负载。如果选择此类型的扩展,请确保您的架构设计能够处理多个节点,并且已经采取了机制来在它们之间平衡负载。

  • 垂直扩展:另一种选择是垂直扩展应用程序,这意味着可以增加单个节点可用资源。这将涉及升级服务器的功能以处理额外负载。如果选择此类型的缩放,请确保您的应用程序被设计为利用这些额外资源。

  • 缓存:通过存储频繁访问数据,可以提高响应时间,而无需重复调用API。您的应用程序需要被设计为尽可能使用缓存数据,并在添加新信息时使缓存失效。有几种不同方法可以做到这一点。例如,根据对于你的应用最合理方式,你可以将数据存储在数据库、文件系统或内存中进行缓存。

  • 负载均衡:最后,请考虑使用负载均衡技术来确保请求均匀地分布在可用服务器上。这可能涉及使用一个负载均衡器作为服务器前端或使用DNS轮询算法等方式实现 。平衡负载将有助于提高性能并减少瓶颈。

管理速率限制

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

改善延迟

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

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

网络 最终用户到API的延迟 $\downarrow$ 服务器 处理提示令牌所需时间 $\downarrow$ 服务器 采样/生成令牌所需时间 $\downarrow$ 网络 API到最终用户的延迟

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

直觉:提示令牌对完成调用的延迟影响很小。生成完成令牌所需的时间要长得多,因为每次只生成一个令牌。较长的生成长度会累积延迟,因为需要为每个令牌进行生成。

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

现在我们已经了解了延迟的基础知识,让我们来看一下各种影响延迟的因素,从最具影响力到最不具影响力进行广泛排序。

模型

我们的API提供不同复杂度和普适性水平的模型。最强大的模型,例如gpt-4,可以生成更复杂和多样化的完成结果,但处理查询所需时间也更长。像gpt-3.5-turbo这样的模型可以生成更快速、更便宜的聊天完成结果,但可能会产生与您查询不太准确或相关的结果。您可以选择最适合您用例以及在速度和质量之间权衡取舍的模型。

完成令牌数量

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

  • 降低最大令牌数:对于具有相似的令牌生成计数的请求,那些具有较低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改进,因此值得尝试流式传输。

基础设施

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

批处理

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

管理成本

为了监控您的成本,您可以在账户中设置一个软限制,一旦超过某个使用阈值就会收到电子邮件警报。您还可以设置硬限制。请注意,硬限制可能会对应用程序/用户造成干扰,请谨慎使用。使用使用跟踪仪表板来监视当前和过去计费周期内的令牌使用情况。

文本生成

将原型转化为生产应用的挑战之一是预算运行应用程序所需的成本。OpenAI 提供按使用量计费的定价模式,每 1,000 个标记(大约相当于 750 字)收取一定价格。要估算您的成本,您需要预测标记利用率。考虑因素包括流量水平、用户与应用程序交互频率以及您将处理的数据量。

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

你可以尝试我们交互式分词工具来帮助你估算费用。API 和 playground 还会返回 token 计数作为响应的一部分。一旦你已经成功地使用了我们最强大的模型,请查看其他模型是否能够以更低延迟和更低费用产生相同的结果。在我们的标记使用帮助文章中了解更多信息。

MLOps策略

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

  • 数据和模型管理:管理用于训练或微调模型的数据,并跟踪版本和更改。
  • 模型监控:随着时间推移跟踪您的模型性能并检测任何潜在问题或退化。
  • 重新训练模型:确保您的模型与数据变化或不断发展的要求保持最新,并根据需要重新训练或微调它。
  • 部署模型:自动化部署您的模型及相关工件到生产环境中。

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

安全和合规性

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

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

安全最佳实践

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