赞
踩
尽管 GPT-3 是世界上最复杂和最复杂的语言模型,但它的功能被抽象为最终用户的简单“文本输入、文本输出”界面。本章将帮助你开始使用 Playground 接口,并介绍 OpenAI API 的技术细微差别,因为细节总是能揭示真正的瑰宝。
要完成本章,您需要注册一个OpenAI 帐户位于OpenAI API。如果您还没有这样做,请现在就这样做。
您的OpenAI 开发者帐户提供对 API 的访问和无限可能。我们将从 Playground 开始,这是一个基于 Web 的沙盒环境,可让您试验 API、了解其组件的工作原理以及访问开发人员文档和 OpenAI 社区。然后,我们将向您展示如何构建强大的提示,为您的应用程序生成有利的响应。我们将以 GPT-3 执行四项 NLP 任务的示例结束本章:分类、命名实体识别 (NER)、摘要和文本生成。
在接受采访时OpenAI 产品和合作伙伴关系副总裁 Peter Welinder 向我们征求了有关为初次使用的用户导航 Playground 的关键建议。他告诉我们他的建议取决于用户的角色。如果用户有机器学习背景,Peter 鼓励他们“从忘记他们已经知道的事情开始,然后去 Playground 尝试让 GPT-3 做你想要做的事情,只需询问它。” 他建议用户“将 GPT-3 想象成您要求做某事的朋友或同事。您如何描述您希望他们完成的任务?然后,看看 GPT-3 是如何响应的。如果它没有以您想要的方式响应,请重复您的指示。”
作为 YouTuber 和 NLP 影响者 Bakz Awan说,“非技术人员会问:我需要学位才能使用它吗?我需要知道如何编码才能使用它吗?绝对不。您可以使用游乐场。你不需要写一行代码。您将立即获得结果。任何人都可以做到这一点。”
以下是开始使用 Playground 的步骤:
在https://openai.com登录并从主菜单导航到 Playground。
看看 Playground 屏幕(图 2-1)。
选择现有的问答预设(标记为 3)。这将自动加载训练提示以及相关的参数设置。单击 Generate 按钮(在图 2-1中标记为 4 )。
API 处理您的输入并提供响应(称为完成)在同一文本框中。它还向您显示使用的令牌数量。令牌是用于确定每个 API 调用定价的单词的数字表示;我们将在本章后面讨论它们。
在右侧屏幕底部,您将看到令牌计数,在左侧您有一个 Generate 按钮(见图 2-2)。
图 2-2。问答提示完成以及令牌计数
每次单击“生成”按钮时,GPT-3 都会考虑文本输入字段中的提示和完成,并将它们视为下一次完成的训练提示的一部分。
这是您可以在图 2-2中看到的提示:
- I am a highly intelligent question answering bot. If you ask me a question that
- is rooted in truth, I will give you the answer. If you ask me a question that is
- nonsense, trickery, or has no clear answer, I will respond with "Unknown".
-
- Q: What is human life expectancy in the United States?
- A: Human life expectancy in the United States is 78 years.
-
- Q: Who was president of the United States in 1955?
- A: Dwight D. Eisenhower was president of the United States in 1955.
-
- Q: Which party did he belong to?
- A: He belonged to the Republican Party.
-
- Q: What is the square root of banana?
- A: Unknown
-
- Q: How does a telescope work?
- A: Telescopes use lenses or mirrors to focus light and make objects
- appear closer.
-
- Q: Where were the 1992 Olympics held?
这是完成:
A: The 1992 Olympics were held in Barcelona, Spain.
现在您已经了解了 Playground 的基本轮廓,让我们深入了解即时工程和设计。
这OpenAI API 从根本上改变了我们与 AI 模型交互的方式,剥离了一层又一层复杂的编程语言和框架。安德烈·卡帕蒂,特斯拉的 AI 总监,在 GPT-3 发布后就开玩笑说,编程 3.0 就是关于即时设计的(他在推特上发布的 meme 在图 2-3中)。您提供的培训提示与您获得的完成质量之间存在直接关系。单词的结构和排列会严重影响输出。了解提示设计是释放 GPT-3 真正潜力的关键。
编写好的提示的秘诀是了解 GPT-3 对世界的了解。作为Awan 指出,“它只看到了文字。这意味着你不应该期望它知道物理世界,即使它显然知道。它可以描述蒙娜丽莎,[可以]告诉你[关于]它的意义、重要性和历史,但它从未见过[这幅画],因为它只接受了文字训练。”
你的工作是让模型使用它已经拥有的信息来产生有用的结果。在字谜游戏中,表演者向其他玩家提供足够的信息来找出秘密单词。同样,使用 GPT-3,我们为模型提供了足够的上下文(以训练提示的形式)来找出模式并执行给定的任务。
图 2-3。模因来源不明,Andrej Karpathy于 2020 年 6 月 18 日在推特上发布
小费
在设计训练提示时,瞄准对于模型的零样本响应:也就是说,看看是否可以在不使用外部训练示例启动模型的情况下获得所需的响应。如果没有,请通过向其展示几个示例而不是整个数据集来继续前进。设计训练提示的标准流程是先尝试零样本,然后尝试少样本,然后再进行基于语料库的微调(本章稍后会介绍)。
GPT-3 是迈向通用人工智能的第一步,因此有其局限性。它不知道一切,也无法在人类层面上推理,但是当你知道如何与它交谈时,它的能力很强。这就是即时工程艺术的用武之地。
GPT-3 不是一个讲真话的人,但它是一个出色的讲故事的人。它接收文本输入并尝试用它认为最能完成输入的文本进行响应。如果你从你最喜欢的小说中给它几句台词,它会尝试以同样的风格继续下去。它通过在上下文中导航来工作,如果没有适当的上下文,它会产生不一致的响应。让我们看一个例子来了解 GPT-3 如何处理输入提示并生成输出:
- Q: What is human life expectancy in the United States?
- A:
如果您在没有任何上下文的情况下向 GPT-3 提供这样的提示,您实际上是在要求它从其训练数据的范围中寻找一般答案。结果将是泛化和不一致的响应,因为模型不知道要使用训练数据的哪一部分来回答问题。
另一方面,提供正确的上下文将成倍地提高响应的质量。它只是限制了模型为回答问题而必须检查的训练数据的范围,从而产生更具体和中肯的响应:
- I am a highly intelligent question answering bot. If you ask me a question that
- is rooted in truth, I will give you the answer. If you ask me a question that
- is nonsense, trickery, or has no clear answer, I will respond with "Unknown".
-
- Q: What is human life expectancy in the United States?
- A:
您可以认为 GPT-3 以与人脑相同的方式处理输入。当有人在没有适当背景的情况下问我们任何问题时,我们倾向于随机回答。发生这种情况是因为没有任何适当的方向或背景,很难得到准确的响应。GPT-3 也是如此;它的训练数据范围如此之大,以至于在没有任何外部背景或方向的情况下很难导航到正确的响应。
像 GPT-3 这样的 LLM 能够在适当的背景下进行创造性写作和回答事实问题。这是我们创建高效和有效培训提示的五步公式:
定义你要解决的问题以及它是什么类型的 NLP 任务,例如分类、问答、文本生成或创意写作。
问问自己是否有办法获得零样本解决方案。如果您认为需要外部示例来为您的用例准备模型,请认真考虑。
现在考虑一下在给定 GPT-3 的“文本输入,文本输出”界面的情况下,您如何以文本方式表述问题。考虑所有可能的场景,以文本形式表示您的问题。例如,假设您想构建一个广告文案助手,可以通过查看产品名称和描述来生成创意文案。要以“文本输入,文本输出”格式构建此目标,您可以将输入定义为产品名称和描述,将输出定义为广告文案:
- Input: Betty's Bikes, for price-sensitive shoppers
- Output: Low prices and huge selection. Free and fast delivery.
- Order online today!
如果您最终使用外部示例,请尽可能少地使用并尝试合并多样性,捕获所有表示以避免过度拟合模型或扭曲预测。
每当您从头开始创建培训提示时,这些步骤将充当标准框架。在为数据问题构建端到端解决方案之前,您需要了解有关 API 工作原理的更多信息。让我们通过查看它来更深入地挖掘成分。
我们将在本章中更详细地讨论图 2-4中的所有这些组件。
图 2-4。API 的组件
表 2-1显示了 OpenAI API 中组件的概述。
零件 | 功能 |
---|---|
执行引擎 | 确定用于执行的语言模型 |
响应长度 | 设置 API 在完成时包含多少文本的限制 |
温度和顶部 P | 温度控制响应的随机性,表示为从 0 到 1 的范围。 顶部 P 控制模型应考虑完成多少随机结果,如温度所建议的那样;它决定了随机性的范围。 |
频率损失和存在损失 | 频率惩罚降低了模型通过“惩罚”它逐字重复同一行的可能性。 存在惩罚增加了它谈论新话题的可能性。 |
最好的 | 允许您指定要在服务器端生成的完成数 (n) 并返回“n”个完成中的最佳值 |
停止序列 | 指定一组字符,指示 API 停止生成完成 |
注入开始和重启文本 | 插入开始文本允许您在完成的开头插入文本。 Inject restart text 允许您在完成的末尾插入文本。 |
显示概率 | 允许您通过显示模型可以为给定输入生成的标记的概率来调试文本提示 |
这执行引擎确定用于执行的语言模型。选择正确的引擎是确定模型功能并获得正确输出的关键。GPT-3 带有四个不同大小和功能的执行引擎:Davinci、Ada、Babbage 和 Curie。Davinci 是最强大的,也是 Playground 的默认设置。
这响应长度设置 API 在完成时包含多少文本的限制。由于 OpenAI 按每次 API 调用生成的文本长度收费(如前所述,这被转换为令牌或单词的数字表示),因此响应长度(也以令牌衡量)对于预算有限的任何人来说都是一个关键参数。更高的响应长度将使用更多的令牌并花费更多。例如,如果您执行分类任务,将响应文本拨号设置为 100 不是一个好主意:API 可能会生成不相关的文本并使用额外的令牌,这会在您的帐户上产生费用。由于技术限制,API 在提示和完成组合中最多支持 2048 个令牌。因此,在使用 API 时,您需要注意提示和预期完成不要超过最大响应长度,以避免突然完成。
这温度刻度盘控制响应的创造力,表示为从 0 到 1 的范围。温度值越低意味着 API 将预测模型看到的第一件事,从而产生最正确但可能很无聊的文本,变化。另一方面,较高的温度值意味着模型会在预测结果之前评估可能适合上下文的响应。生成的文本会更加多样化,但语法错误和废话生成的可能性更高。
顶部 P控制模型应考虑完成多少随机结果,如温度刻度盘所示;它决定了随机性的范围。Top P 的范围是从 0 到 1。接近于 0 的值意味着随机响应将被限制在某个部分:例如,如果值为 0.1,那么只有 10% 的随机响应将被考虑完成。这使得发动机确定性,这意味着它将始终为给定的输入文本生成相同的输出。如果该值设置为 1,API 将考虑完成所有响应、承担风险并提出创造性响应。较低的价值限制了创造力;更高的价值扩大了视野。
温度和 Top P 对输出有显着影响。有时您可能会感到困惑,何时以及如何使用它们来获得所需的输出。两者是相关的:改变一个的值会影响另一个。因此,通过将 Top P 设置为 1,您可以让模型通过探索整个响应谱来释放其创造力,并通过使用温度刻度盘控制随机性。
小费
我们始终建议更改 Top P 或温度,并将另一组的刻度盘保持在 1。
大型语言模型依赖于概率方法而不是传统逻辑。它们可以为相同的输入生成各种响应,具体取决于您设置模型参数的方式。该模型试图在其训练过的数据范围内找到最佳概率匹配,而不是每次都寻找完美的解决方案。
正如我们在第 1 章中提到的,GPT-3 的训练数据领域非常庞大,包括各种公开可用的书籍、互联网论坛和由 OpenAI 专门策划的 Wikipedia 文章,使其能够为给定的提示生成各种各样的补全. 这就是温度和 Top P(有时称为“创意表盘”)发挥作用的地方:您可以调整它们以产生更自然或抽象的响应,并带有有趣的创意元素。
假设您将使用 GPT-3 为您的初创公司生成名称。您可以将温度刻度盘设置为更高级别,以获得最具创意的响应。当我们日日夜夜地为我们的初创公司想出一个完美的名字时,我们调高了温度。GPT-3 提供了帮助,帮助我们获得了一个我们喜爱的名称:Kairos Data Labs。
在其他情况下,您的任务可能几乎不需要创造力:例如分类和问答任务。对于这些,请保持较低的温度。
让我们看一下图 2-5中的一个简单分类示例,该示例根据公司名称将公司分类到一般的桶或类别中。
图 2-5。温度分量
我们的提示:
- The following is a list of companies and the categories they fall into:
-
- Facebook: Social Media, Technology
- LinkedIn: Social Media, Technology, Enterprise, Careers
- Uber: Transportation, Technology, Marketplace
- Unilever: Conglomerate, Consumer Goods
- Mcdonalds: Food, Fast Food, Logistics, Restaurants
- FedEx:
和输出:
Logistics, Shipping
如图2-5 所示,我们再次使用温度来控制随机性程度。您也可以在保持温度刻度盘的同时更改 Top P设置为 1。
喜欢温度和 Top P 刻度盘、频率惩罚和存在惩罚刻度盘在决定输出时会考虑文本提示(先前的完成加上新的输入)而不是内部模型参数。因此,现有文本会影响新的完成。频率惩罚降低了模型通过“惩罚”它逐字重复同一行的可能性。存在惩罚增加了它谈论新话题的可能性。
当您想防止相同的完成文本在多个完成中重复时,这些会派上用场。尽管这些表盘相似,但有一个重要区别。如果重复建议的文本输出(例如,模型在之前的完成或同一会话中使用了确切的标记)并且模型选择旧输出而不是新输出,则会应用频率惩罚。如果给定文本中存在标记,则应用存在惩罚。
GPT-3使用最好的功能在服务器端生成多个完成,在幕后评估它们,然后为您提供最佳概率结果。使用“best of”参数,您可以指定要在服务器端生成的完成数 ( n )。该模型将返回n 个完成中最好的一个(每个令牌对数概率最低的那个)。
这使您能够在单个 API 调用中评估多个提示完成,而不是重复调用 API 来检查相同输入的不同完成的质量。然而,使用“best of”是昂贵的:它花费n倍于提示中的令牌。例如,如果您将“最佳”值设置为 2,那么您将被收取输入提示中存在的令牌的两倍,因为在后端,API 将生成两个完成并向您显示最好的一个。
“最佳”的范围可以从 1 到 20,具体取决于您的用例。如果您的用例为需要保持输出质量一致的客户服务,那么您可以将“最佳”值设置为更高的数字。另一方面,如果您的用例涉及太多 API 调用,那么使用较低的“最佳”价值以避免不必要的延迟和成本是有意义的。我们建议在使用“最佳”参数生成多个提示时尽量缩短响应长度,以避免产生额外费用。
一个停止序列是一组字符,指示 API 停止生成完成。这有助于避免使用不必要的代币,这是普通用户必不可少的节省成本的功能。
您最多可以为 API 提供四个序列以停止生成更多令牌。
让我们看一下图 2-6中的示例语言翻译任务,以了解停止序列的工作原理。在这个例子中,英语短语被翻译成法语。我们使用重启序列“English:”作为停止序列:每当 API 遇到该短语时,它将停止生成新的令牌。
图 2-6。停止序列组件
这注入开始文本和注入重新启动文本参数允许您分别在完成的开头或结尾插入文本。您可以使用它们来保持所需的模式。通常,这些设置与停止序列协同工作,如我们的示例所示。提示具有这样的模式,其中提供带有前缀“English:”(重新启动文本)的英语句子,并且生成带有前缀“French:”(开始文本)的翻译输出。因此,任何人都可以轻松区分两者,并创建模型和用户都可以清楚理解的训练提示。
每当我们针对此类提示运行模型时,它会在输出之前自动注入开始文本“French:”,在下一次输入之前注入重新启动文本“English:”,这样这种模式就可以持续下去。
这显示概率参数位于 Playground 设置窗格的底部。在传统的软件工程中,开发人员使用调试器对一段代码进行故障排除(调试)。您可以使用 show probabilities 参数来调试您的文本提示。每当您选择此参数时,您都会看到突出显示的文本。将光标悬停在它上面将显示模型可以为指定的特定输入生成的标记列表,以及它们各自的概率。
您可以使用此参数来检查您的选项。此外,它可以更容易地看到可能更有效的替代方案。显示概率参数具有三个设置:
最有可能的
按概率降序列出最有可能考虑完成的标记。
最不可能
按概率降序列出最不可能被考虑完成的标记。
全谱
显示可以选择完成的整个令牌世界。
让我们在一个简单提示的上下文中看一下这个参数。我们希望以一个简单的、众所周知的短语开始输出句子:“Once Upon a time”。我们向 API 提供提示“Once upon a”,然后我们检查显示概率选项卡中的最可能选项。
如图2-7所示,它生成“时间”作为响应。因为我们已将“显示概率”参数设置为最有可能,所以 API 不仅显示响应,还显示可能选项列表及其概率。
现在您已经有了一个概述,让我们更详细地了解这些组件。
图 2-7。显示概率组件,显示最可能的标记
作为如图 2-7 所示, OpenAI API 提供了四种执行引擎,根据参数数量和性能能力进行区分。执行引擎为 OpenAI API 提供动力。它们充当“autoML”解决方案,提供自动化的 ML 方法和流程,使机器学习可供非专家使用。它们易于配置和适应给定的数据集和任务。
四个主要执行引擎按字母顺序以著名科学家的名字命名:Ada(以 Ada Lovelace 命名)、Babbage(Charles Babbage)、Curie(Madame Marie Curie)和 Davinci(Leonardo da Vinci)。让我们深入了解这些执行引擎中的每一个,以了解在使用 GPT-3 时何时使用哪个引擎,从 Davinci 开始。
Davinci是第一次打开 Playground 时最大的执行引擎和默认值。它可以做其他引擎可以做的任何事情,通常只需要更少的指令和更好的结果。然而,权衡是每个 API 调用的使用成本更高,并且比其他引擎慢。您可能希望使用其他引擎来优化成本和运行时间。
小费
在测试新想法和提示时,我们建议从 Davinci 开始,因为它具有卓越的功能。使用 Davinci 进行试验是了解 API 能够做什么的好方法。然后,当您对问题陈述感到满意时,您可以慢慢向下移动以优化预算和运行时间。一旦你知道你想要完成什么,你可以继续使用 Davinci(如果成本和速度不是问题的话),或者你可以继续使用 Curie 或其他成本更低的引擎,并尝试围绕其功能优化输出。您可以使用OpenAI 的比较工具生成一个 Excel 电子表格,用于比较引擎的输出、设置和响应时间。
对于需要理解内容的任务,例如总结会议记录或生成创意广告文案,Davinci 应该是您的首选。它非常擅长解决逻辑问题和解释虚构人物的动机。它甚至可以写一个故事。达芬奇还能够解决一些涉及因果关系的最具挑战性的人工智能问题。
Curie旨在找到功率和速度之间的最佳平衡,这对于执行高频任务(如大规模分类或将模型投入生产)非常重要。
Curie也非常擅长进行问答和作为通用聊天机器人。例如,如果您正在构建一个客户支持聊天机器人,您可能会选择 Curie 来更快地处理大量请求。
虽然Davinci更擅长分析复杂的文本,但居里可以以低延迟和闪电般的速度执行。在选择Davinci而不是Curie之前,弄清楚你的用例是什么并进行成本效益分析总是明智的。生产。
Babbage比Curie快,但不能执行涉及理解复杂意图的任务。但是,在语义搜索排名和分析文档与搜索查询的匹配程度方面,它非常有能力并且更可取。它比 Curie 和 Davinci 便宜,是涉及频繁 API 调用的简单问题的首选。
Ada是可用引擎中最快且最便宜的。它可以执行不需要对上下文有细微差别的理解的简单任务,例如解析文本、纠正语法或简单分类。通常可以通过为输入提供更多上下文来提高 Ada 的性能。对于涉及频繁 API 调用的用例,Ada 可能是首选模型;通过正确的设置配置,它可以获得类似于更大模型的结果。您对 API 参数进行的试验越多,您就会越了解哪些设置适用于您的用例。
基于在这四个主要模型上,OpenAI 推出了一系列InstructGPT模型,这些模型比原始 GPT-3 更能理解指令并遵循指令,同时毒性更小,更真实。它们是使用来自 OpenAI 对齐研究的技术开发的。这些模型经过人工循环训练,现在部署为 OpenAI API 上的默认语言模型。
图2-8和2-9展示了 InstructGPT 和 GPT 系列 Davinci 引擎针对相同输入生成的两个输出。
图 2-8。InstructGPT Davinci 模型生成的输出
图 2-9。GPT Davinci 模型生成的输出
我们的输入:
Write a story about AI for a 5 year old.
指示GPT 输出:
- Robot was very happy. He had just been born, and he was already the smartest
- robot in the world. He could do anything that any other robot could do, but he
- could also think for himself.
GPT 输出:
- This project is an attempt to make an AI that can produce fictional stories.
- It is a work in progress.
- Fictionality
- The aim of this project is to create an AI that can create fictional stories.
为了让构建提示的过程真正高效,OpenAI 决定公开推出四种模型的 InstructGPT 版本:text-davinci-001、text-curie-001、text-babbage-001 和 text-ada-001。有了明确的说明,这些模型可以产生比基本模型更好的结果,现在是API 的默认模型。本系列是弥合人类思维方式与模型运作方式之间差距的重要一步。
这Playground 是一个图形 Web 界面,它在后台调用 OpenAI API,但还有其他几种调用 API 的方法。为此,您需要熟悉它的端点:在调用它们时来回通信的远程 API。在本节中,您将熟悉八个 API 端点的功能和用法。
这列表引擎端点,也称为元数据端点,提供可用引擎列表以及与每个引擎关联的特定元数据,例如所有者和可用性。要访问它,您可以使用 HTTP GET 方法调用以下 URI,而无需传递任何请求参数:
GET https://api.openai.com/v1/engines
什么时候您向检索引擎端点提供引擎名称,它会返回有关该引擎的详细元数据。要访问它,请使用 HTTP GET 方法调用以下 URI,而不传递任何请求参数:
GET https://api.openai.com/v1/engines/{engine_id}
完成是 GPT-3 最著名和使用最广泛的端点。它只是将文本提示作为输入并将完成的响应作为输出返回。它使用 HTTP POST 方法并且需要引擎 ID 作为 URI 路径的一部分。作为 HTTP 正文的一部分,完成端点接受上一节中讨论的几个附加参数。它的签名是:
发布 https://api.openai.com/v1/engines/{engine_id}/completions
这语义搜索端点使您能够以自然语言提供查询来搜索一组文档,这些文档可以是单词、句子、段落甚至更长的文本。它将根据文档与输入查询的语义相关程度对文档进行评分和排名。例如,如果您提供文档 [“school”、“hospital”、“park”] 和查询“the Doctor”,您将获得每个文档的不同相似度分数。
这相似度分数是一个正分数,通常在 0 到 300 之间(但有时会更高),其中 200 以上的分数通常表明文档在语义上与查询相似。相似度得分越高,文档在语义上与查询越相似(在此示例中,“医院”与“医生”最相似)。作为对 API 的请求的一部分,您最多可以提供 200 个文档。1
以下是语义搜索端点的签名:
POST https://api.openai.com/v1/engines/{engine_id}/completions
这文件端点可以跨不同的端点使用,例如答案、分类和语义搜索。它用于将文档或文件上传到 OpenAI 存储,该存储可通过 API 访问。同一个端点可以与不同的签名一起使用来执行以下任务:
列出文件
返回属于用户组织或链接到特定用户帐户的文件列表。这是一个 HTTP GET 调用,不需要随请求传递任何参数:
GET https://api.openai.com/v1/files
上传文件
上传包含要在各个端点使用的文档的文件。它将文档上传到 OpenAI 已经为用户组织分配的内部空间。这是一个 HTTP POST 调用,需要在 API 请求中添加文件路径:
POST https://api.openai.com/v1/files
检索文件
通过提供文件 ID 作为请求参数返回有关特定文件的信息:
GET https://api.openai.com/v1/files/{file_id}
删除文件
通过提供文件 ID 作为请求参数来删除特定文件:
DELETE https://api.openai.com/v1/files/{file_id}
这分类端点允许您利用一组标记的示例而无需微调。它使用提供的示例对查询进行分类,从而避免微调,进而消除对超参数调整的需要。您几乎可以将它用于任何机器学习分类任务。
这个端点提供了一个易于配置的“autoML”解决方案,可以很容易地适应不断变化的标签模式。作为请求的一部分,您最多可以提供 200 个带标签的示例,或者可以在查询期间提供预先上传的文件。除了提供 URI 路径之外,此端点还需要模型和查询以及示例。它的签名是:
POST https://api.openai.com/v1/classifications
GPT-3 的截至 2021 年底撰写本文时,问答端点仍处于测试阶段。当给出问题时,QA 端点会根据一组文档或训练示例中提供的信息生成答案。
例如,如果您想在一组 PDF 上实现 QA 端点,您只需使用 files 端点上传它们并提供文件 ID 和请求参数。answers 端点将使用这些文件作为上下文来回答任何查询。它还允许您通过以训练示例的形式提供(问题、答案)对列表来引导模型的上下文语气和响应。它首先搜索提供的文档或示例以查找相关上下文,然后将其与相关示例和问题结合以生成响应。它的签名是:
POST https://api.openai.com/v1/answers
其他API 的实验端点是embeddings。嵌入是任何机器学习模型的核心,它允许您通过将文本转换为高维向量来从文本中捕获语义。目前,开发人员倾向于使用开源模型为他们的数据创建嵌入,这些嵌入可用于各种任务,如推荐、主题建模、语义搜索等。
OpenAI 意识到 GPT-3 在支持嵌入驱动的用例并提供最先进的结果方面具有巨大潜力。为输入数据生成嵌入非常简单,并且以 API 调用的形式进行包装。要创建表示输入文本的嵌入向量,您可以使用以下签名:
POST https://api.openai.com/v1/engines/{engine_id}/embeddings
要调用嵌入端点,您可以参考嵌入文档,根据您的用例选择引擎类型。每个引擎都有其特定的嵌入维度,Davinci 最大,Ada 最小。所有嵌入引擎均源自四个基本模型,并根据用例进行分类,以实现高效且成本友好用法。
OpenAI 的Irene Solaiman 和 Christy Dennison 的研究论文“ Process for Adapting Language Models to Society (PALMS) with Values-Targeted Datasets ”(2021 年 6 月)带领公司推出了首个微调端点,让您能够通过为您的特定用例定制模型,从 GPT-3 中获得比以前更多的可能。(我们将在第 6 章讨论更多关于 PALMS 的内容。)自定义 GPT-3 可以提高 GPT-3 能够针对您的特定用例执行的任何自然语言任务的性能。
让我们先解释一下它是如何工作的。
OpenAI以半监督方式在专门准备的数据集上预训练 GPT-3 。当只给出几个例子的提示时,它通常可以直觉你正在尝试执行什么任务并生成一个合理的完成。正如您在第 1 章中所了解的,这称为少样本学习。
用户现在可以根据自己的数据微调 GPT-3,创建适合其项目的模型的自定义版本。定制使 GPT-3 可靠地用于各种用例,并使模型的运行成本更低、效率更高、速度更快。微调是关于调整整个模型,使其每次都以您希望的方式执行。您可以使用任何形状和大小的现有数据集,或根据用户反馈逐步添加数据。
模型的能力和知识将被缩小并集中在用于微调的数据集的内容和语义上。这反过来又会限制创造力和主题选择的范围,这将有利于下游任务,如对内部文档进行分类,或任何涉及内部术语的用例。它通过将 GPT-3 的注意力集中在微调数据上并限制其知识库来工作。
对模型进行微调后,您将不再需要在提示中提供示例。这可以节省成本、缩短响应时间并提高输出的质量和可靠性。自定义 GPT-3 似乎比使用即时设计可以实现更好的结果,因为在此过程中您可以提供更多示例。
通过不到一百个示例,您已经可以开始看到微调 GPT-3 的好处,并且随着您添加更多数据,性能会继续提高。在 PALMS 研究论文中,OpenAI 展示了使用少于 100 个示例进行微调可以提高 GPT-3 在某些任务上的性能。OpenAI 还发现,示例数量每增加一倍,就会线性地提高质量。
自定义 GPT-3 可提高输出的可靠性,提供更一致的结果,您可以依靠这些结果用于生产用例。现有的 OpenAI API 客户发现,定制 GPT-3 可以显着降低不可靠输出的频率,并且越来越多的客户可以用他们的性能数据来证明这一点。让我们看一下定制了 GPT-3 的四家公司。
看守税帮助独立承包商和自由职业者纳税。它使用各种模型来提取文本并对交易进行分类,然后识别容易错过的税收冲销,以帮助客户直接从应用程序报税。通过自定义 GPT-3,Keeper Tax 的准确率从 85% 提高到 93%。由于每周一次向其模型添加 500 个新的训练示例,它不断改进,这导致每周准确度提高约 1%。
可行的帮助公司从客户反馈中获得洞察力。通过定制 GPT-3,Viable 能够将大量非结构化数据转换为可读的自然语言报告,并提高其报告的可靠性。因此,总结客户反馈的准确性从 66% 提高到 90%。如需深入了解 Viable 的发展历程,请参阅我们在第 4 章对 Viable 首席执行官的采访。
萨那实验室是人工智能在学习领域的开发和应用的全球领导者。该公司的平台通过利用最新的 ML 突破来个性化内容,为企业提供个性化的学习体验。通过使用自己的数据自定义 GPT-3,Sana 的问题和内容生成从语法正确但一般的响应变为高度准确的响应。这带来了 60% 的改进,为用户提供了更加个性化的体验。
引出是人工智能研究助理,使用学术论文的发现帮助直接回答研究问题。助手从大量研究论文中找到最相关的摘要,然后应用 GPT-3 生成论文对问题的声明。GPT-3 的自定义版本优于提示设计,并在三个方面进行了改进:结果更容易理解 24%,准确率提高 17%,整体提高 33%。
要开始自定义 GPT-3,您只需使用您提供的文件在 OpenAI 命令行工具中运行一个命令。您的自定义版本将开始训练,然后立即在 OpenAI API 中可用。
在非常高的层次上,为您的应用程序定制 GPT-3 涉及以下三个步骤:
准备新的训练数据并将其上传到 OpenAI 服务器
使用新的训练数据微调现有模型
使用微调模型
训练数据是模型作为微调输入的内容。您的训练数据必须是 JSONL 文档,其中每一行是对应于训练示例的提示完成对。对于模型微调,您可以提供任意数量的示例。强烈建议您创建一个以价值为目标的数据集(我们将在第 6 章中对其进行定义和讨论),以便为模型提供高质量的数据和广泛的表示。微调通过更多示例来提高性能,因此您提供的示例越多,结果就越好。
您的 JSONL 文档应如下所示:
- {"prompt": "prompt text", "completion": "ideal generated text"}
- {"prompt": "prompt text", "completion": "ideal generated text"}
- {"prompt": "prompt text", "completion": "ideal generated text"}
- ...
其中提示文本应包含您想要完成的确切提示文本,并且理想的生成文本应包含您希望 GPT-3 生成的所需完成文本的示例。
您可以使用 OpenAI 的 CLI 数据准备工具轻松地将您的数据转换为这种文件格式。CLI 数据准备工具接受不同格式的文件;唯一的要求是它们包含提示和完成列/键。您可以传递 CSV、TSV、XLSX、JSON 或 JSONL 文件,该工具会将输出保存到 JSONL 文件中,以便进行微调。为此,请使用以下命令:
openai tools fine_tunes.prepare_data -f LOCAL_FILE
其中LOCAL_FILE是您准备转换的文件。
一次如上所述准备好训练数据后,您可以在 OpenAI CLI 的帮助下继续进行微调工作。为此,您需要以下命令:
openai api fine_tunes.create -t TRAIN_FILE_ID_OR_PATH -m BASE_MODEL
其中BASE_MODEL是您开始的基本模型的名称(Ada、Babbage、Curie 或 Davinci)。运行这个命令会做几件事:
使用 files 端点上传文件(如本章前面所述)
使用命令中的请求配置微调模型
流式传输事件日志,直到微调作业完成
日志流有助于实时了解正在发生的事情并在发生任何事件/故障时做出响应。流式传输可能需要几分钟到几小时,具体取决于队列中的作业数量和数据集的大小。
一次模型微调成功,可以开始使用了!您现在可以将此模型指定为完成端点的参数,并使用 Playground 向它发出请求。
小费
微调作业完成后,您的模型可能需要几分钟才能准备好处理请求。如果对您的模型的完成请求超时,很可能是因为您的模型仍在加载中。如果发生这种情况,请在几分钟后重试。
您可以通过使用以下命令将模型名称作为完成请求的模型参数传递来开始发出请求:
openai api completions.create -m FINE_TUNED_MODEL -p YOUR_PROMPT
其中FINE_TUNED_MODEL是您的模型名称,YOUR_PROMPT是您要在此请求中完成的提示。
您也可以在对新微调模型的这些请求上继续使用本章中讨论的所有完成端点参数,例如温度、频率惩罚、存在惩罚等。
笔记
这些请求没有指定引擎。这是 OpenAI 计划在未来跨其他 API 端点标准化的预期设计和东西。
了解更多信息,参考 OpenAI 的微调文档。
前深入了解不同的提示如何使用令牌,让我们更仔细地看看令牌是什么。
我们已经告诉过您,标记是单词或字符的数字表示。使用标记作为标准度量,GPT-3 可以处理从几个单词到整个文档的训练提示。
对于常规英文文本,1 个标记由大约 4 个字符组成。它转换为大约四分之三的单词,因此对于 100 个标记,大约有 75 个单词。作为参考,莎士比亚的作品集大约有 900,000 字,相当于 120 万个代币。
为了保持 API 调用的延迟,OpenAI 对提示和完成施加了 2,048 个令牌(约 1,500 个字)的限制。
为了进一步了解如何在 GPT-3 的上下文中计算和使用令牌并保持在 API 设置的限制范围内,让我们来看看您可以测量令牌计数的方法。
在 Playground 中,当您在界面中输入文本时,您可以在右下角的页脚中看到令牌计数实时更新。它显示点击生成按钮后文本提示将使用的令牌数。每次与 Playground 交互时,您都可以使用它来监控您的代币消耗(见图 2-10)。
图 2-10。操场上的令牌计数
衡量代币消耗的另一种方法是使用 GPT-3 Tokenizer 工具(图 2-11),它可以让您从字符中可视化标记的形成。您可以通过一个简单的文本框与 Tokenizer 进行交互,您可以在其中键入提示文本,Tokenizer 会向您显示令牌和字符计数以及详细的可视化。
图 2-11。OpenAI 的 Tokenizer 工具
为了在对不同端点的 API 调用中集成令牌计数指标,您可以修补 logprobs 和 echo 属性以及 API 请求,以获取使用的令牌的完整列表。
在里面上一节我们讨论了token,它是 OpenAI 用来确定 API 调用定价的最小可替代单位。令牌比测量训练提示中使用的单词或句子的数量具有更大的灵活性,并且由于令牌的粒度,它们可以很容易地处理并用于测量各种训练提示的定价。
每次您从 Playground 或以编程方式调用 API 时,API 都会在后台计算训练提示中使用的令牌数量以及生成的完成,并根据使用的令牌总数对每次调用收费。
OpenAI 通常每 1,000 个代币收取固定费用,费用取决于 API 调用中使用的执行引擎。达芬奇是最强大和最昂贵的,而居里、巴贝奇和艾达则更便宜、更快。
表 2-2显示了在编写本章时(2021 年 12 月)各种 API 引擎的定价。
模型 | 每 1,000 个代币的价格 |
---|---|
Davinci (most powerful) | $0.0600 |
Curie | $0.0060 |
Babbage | $0.0012 |
Ada (fastest) | $0.0008 |
该公司致力于“随用随付”的云定价模式。如需更新定价,请查看在线定价表。
OpenAI 没有监控每个 API 调用的令牌,而是提供了一个报告仪表板来监控每日累积令牌使用情况。根据您的使用情况,它可能类似于图 2-12。
图 2-12。API 使用仪表板
在图 2-12中,您可以看到一个显示每日令牌消耗的条形图。仪表板可帮助您监控组织的令牌使用和成本,以便您可以调节 API 使用并保持在预算范围内。还有一个选项可以监控累积使用情况并获取每个 API 调用的令牌计数明细。这应该为您提供足够的灵活性来为您的组织创建有关令牌消费和定价的策略。现在您已经了解了 Playground 和 API 的来龙去脉,我们将看看 GPT-3 在典型语言建模任务上的表现。
GPT-3 是NLP 领域的高度先进和复杂的继任者,使用核心 NLP 方法和深度神经网络构建和训练。对于任何基于 AI 的建模方法,模型性能的评估方式如下:首先,针对特定任务(如分类、问答、文本生成等)在训练数据上训练模型;然后您使用测试数据(新的、以前看不见的数据)验证模型性能。
以类似的方式,有一套标准的 NLP 基准来评估 NLP 模型的性能并得出相对的模型排名或比较。这个对比,或相对排名,允许您为特定的 NLP 任务(业务问题)挑选最佳模型。
在本节中,我们将讨论 GPT-3 在一些标准 NLP 任务上的性能,如图 2-13 所示,并将其与类似模型在相应 NLP 任务上的性能进行比较。
图 2-13。常规 NLP 任务
文本分类是将文本分类为有组织的组的过程。通过使用 NLP,文本分类可以自动分析文本,然后根据其上下文分配一组预定义的标签或类别。
文本分类涉及分析作为输入提供的文本,并为其分配标签、分数或其他表征文本的属性。文本分类的一些常见示例是情感分析、主题标签和意图检测。您可以使用多种方法让 GTP-3 对文本进行分类,范围从零样本分类(您不给模型提供任何示例)到单样本和少样本分类(您展示一些模型示例)。
现代的长期以来,人工智能一直致力于开发能够对他们从未见过的数据执行预测功能的模型。这个重要的研究领域被称为零样本学习。同样,零样本分类是一种分类任务,模型对一段文本进行分类不需要事先对标记数据进行训练或微调。GPT-3 目前为看不见的数据生成结果,这些结果要么优于或与针对特定目的进行微调的最先进的 AI 模型相媲美。要使用 GPT-3 执行零样本分类,我们必须为其提供兼容的提示。这是一个零样本分类的示例,其目标是执行事实检查分析,以确定推文中包含的信息是正确还是不正确。图 2-14显示了基于零样本示例的非常令人印象深刻的信息正确性分类结果。
图 2-14。零样本分类示例
这是我们的提示:
- Analyze the tweet in terms of information correctness.
- Tweet: "More than 50% of global scientists don't believe in climate change."
- Analysis:
和输出:
The tweet is incorrect.
这文本分类的另一种方法是通过在单个或几个训练示例上微调 AI 模型,分别称为单次或少次文本分类。当您提供如何对文本进行分类的示例时,模型可以根据这些示例了解有关对象类别的信息。这是零样本分类的超集,允许您通过为模型提供三到四个多样化示例来对文本进行分类。这对于需要一定程度的上下文设置的下游用例特别有用。
让我们看一下下面的few-shot分类示例。我们要求模型执行推文情感分析分类,并给它三个推文示例来说明每个可能的标签:正面、中性和负面。如图2-15 所示,该模型配备了基于几个示例的详细上下文,能够非常轻松地执行下一条推文的情感分析。
笔记
当您从书中重新创建提示示例或创建自己的提示时,请确保提示中有足够的行距。段落后的附加行可能会导致非常不同的结果,因此您需要尝试一下,看看什么最适合您。
图 2-15。小样本分类示例
这是我们的提示:
- Analyze the tweet in terms of its sentiment. Depending on the sentiment, classify
- it as positive, neutral, or negative.
-
- Tweet: "I'm seriously worried that super intelligent AI will be disappointed in
- humans."
- Sentiment analysis(positive, neutral, negative): negative
-
- Tweet: "I cannot wait for super intelligent AI to emerge and deepen our
- understanding of the Universe."
- Sentiment analysis(positive, neutral, negative): positive
-
- Tweet: "I think it is neither super likely nor super unlikely that the super
- intelligent AI will emerge one day."
- Sentiment analysis(positive, neutral, negative): neutral
-
- Tweet: "Super intelligent AI is going to be the most exciting discovery in human
- history."
- Sentiment analysis(positive, neutral, negative):
positive
后了解 GPT-3 的小样本分类后,让我们更深入地研究使用批量分类的分类,它使您能够在单个 API 调用中对输入样本进行批量分类,而不是每次 API 调用仅对一个示例进行分类。它适用于您希望一次对多个示例进行分类的应用程序,就像我们检查的推文情感分析任务一样,但要连续分析几条推文。
与少样本分类一样,您希望为模型提供足够的上下文以实现所需的结果,但需要采用批量配置格式。在这里,我们使用批量配置格式的各种示例定义不同类别的推文情感分类(图2-16和2-17)。然后我们要求模型分析下一批推文。
图 2-16。批次分类示例(第 1 部分)
图 2-17。批次分类示例(第 2 部分)
这是我们的提示:
- Analyze tweets in terms of their sentiment. Depending on their sentiment,
- classify them as positive, neutral, or negative.
- Tweet: "I’m seriously worried that super intelligent AI will be disappointed in
- humans."
- Sentiment analysis(positive, neutral, negative): negative
- ###
- Tweet: "I cannot wait for super intelligent AI to emerge and deepen our
- understanding of the Universe."
- Sentiment analysis(positive, neutral, negative): positive
- ###
- Tweet: "I think it is neither super likely nor super unlikely that the super
- intelligent AI will emerge one day."
- Sentiment analysis(positive, neutral, negative): neutral
- ###
- Tweet: "Super intelligent AI is going to be the most exciting discovery in human
- history."
- Sentiment analysis(positive, neutral, negative): positive
- ###
-
- Tweet:
- 1. "I'm seriously worried that super intelligent AI will be disappointed in
- humans."
- 2. "I cannot wait for super intelligent AI to emerge and deepen our understanding
- of the Universe."
- 3. "I think it is neither super likely nor super unlikely that the super
- intelligent AI will emerge one day."
- 4. "Super intelligent AI is going to be the most exciting discovery in human
- history."
- 5. "This is the latest report on the state of the AI"
-
- Tweet sentiment:
- 1. negative
- 2. positive
- 3. neutral
- 4. positive
- 5. neutral
-
- Tweet:
- 1. "I can't stand bad techno music"
- 2. "This is a tweet"
- 3. "I can't wait for going to the Moon!!!"
- 4. "AI is super cute ❤️"
- 5. "Got VERY ANGRY now!!! "
- Tweet sentiment:
- 1.
和输出:
1. negative 2. neutral 3. positive 4. positive 5. negative
命名实体识别 (NER)是一种信息提取任务,旨在将非结构化文本中提到的命名实体定位和分类为预定义的类别,例如人名、组织、位置、时间表达、数量、货币价值、百分比等。
NER 有助于使响应更加个性化和相关,但当前最先进的方法需要大量数据进行训练,然后才能开始预测。另一方面,GPT-3 可以开箱即用地识别人、地点和组织等一般实体,而无需人工提供一个训练示例。
在以下示例中,我们使用了编写本书时处于测试阶段的模型的 davinci-instruct-series 版本,该模型收集提示以训练和改进未来的 OpenAI API 模型。我们给它一个简单的任务:从示例电子邮件中提取联系信息。它在第一次尝试时就成功完成了任务(图 2-18)。
图 2-18。NER 示例
这是我们的输入:
- Extract the name and mailing address from this email:
-
- Shubham,
-
- It was great to talk to you the other day!
- I'm SO looking forward to start working on our book.
- Here's my address 1307 Roosevelt Street, San Francisco CA 94107
-
- Best,
- Sandra Kublik
-
- Name and mailing address:
- Sandra Kublik
- 1307 Roosevelt Street, San Francisco CA 94107
文本摘要是一种针对冗长文本生成简明准确摘要的技术,同时专注于传达有用信息的部分,而不会丢失整体含义。基于 GPT-3 的文本摘要旨在将冗长的 tl;dr 2文本转换为其压缩版本。手动完成此类任务通常困难且成本高。使用 GPT-3,只需输入几秒钟!
可以训练 NLP 模型来理解文档并在生成摘要文本之前识别传达重要事实和信息的部分。然而,这样的模型需要大量的训练样本才能学习上下文并开始总结看不见的输入。
GPT-3的抽象概括是解决信息抽取问题的关键。通过生成摘要而不是仅仅提取关键信息,GPT-3 可以提供对文本的更全面和准确的理解。它对文本摘要使用零样本或少样本方法,使其适用于各种用例。使用 GPT-3,您可以根据用例对文本进行多种总结:基本总结、单行总结或年级总结。让我们快速浏览一下这些方法。
大多数情况下,该模型能够以评论摘要的形式生成不错的结果,但有时它会根据先前的上下文输出不相关的结果。为避免获得不需要的结果的问题,您可以将“best of”参数设置为 3,这将始终为您提供 API 生成的三个结果中的最佳结果。在图 2-19所示的示例中,经过几次尝试和较小的参数调整,我们得到了不错的结果。
图 2-19。文本摘要示例
这是我们的提示:
- The problem is that when it works, it works, but when it doesn't, it really
- doesn't. Luckily, the game's low points like the horrible binary stealth system
- and the bugs and lack of QoL are either fixable or vastly outweighed by the good
- bits, and the overall tally still ends up being much higher than the average of
- many other games out there. That's helped a lot by the moment-to-moment gameplay,
- which pays off just as much as the story beats; the movement system lets you
- climb almost any short object, vehicles are weighty to drive, and have fantastic
- interior and exterior designs, and guns feel properly loud and heavy. Its story
- and narrative kept me glued to the screen, and everything – from sex scenes
- and romance options to Keanu Reeves trying to kill you or help you throughout
- the game – are remarkably well done. Cyberpunk 2077 is a game crafted with love,
- and it shows.
- tl;dr
和输出:
- Cyberpunk 2077 is a game crafted with love, and it shows. The story is great,
- the gameplay is great, the worldbuilding is great. It's not perfect by any means,
- but it's still one of the best games I've played in years.
- The Good:
- - Great story and characters
- - Amazing worldbuilding
- - Excellent gunplay and movement system
- The Bad:
- - Binary stealth system (sometimes you're seen no matter what) - Bugs
由于许多人每天花费数小时阅读和编写电子邮件,因此对它们进行总结是 GPT-3 广泛需要的用例。让我们看看 GPT-3 是如何将一封三段式的电子邮件总结为一行的(图 2-20)。
图 2-20。电子邮件摘要示例
为了达到预期的效果,我们粘贴了完整的电子邮件,然后在末尾简单地添加了“一句话总结:”。我们还包括一个“。” 停止序列告诉模型它应该在一个句子之后停止其摘要生成。
我们的提示:
- Hey Greg,
-
- We are Sandra and Shubham. We are the co-authors of a GPT-3 based book that
- aims to be a go-to manual for API users. It will provide the readers with the
- knowledge to get started with GPT-3 as well as the context of the growing
- ecosystem surrounding it. The book will be released by O'Reilly publishing
- house by early 2022.
-
- We'd like to connect and explore the possibility of collaboration with OpenAI
- to evangelize access to API for people from all backgrounds and enable them to
- build exciting new solutions using GPT-3. We would appreciate your input to
- ensure we accurately represent OpenAI's stance on GPT-3 and inform our readers
- on the upcoming advancements/features of the API.
-
- It will be great if we can catch up sometime this week to discuss it further?
-
- Best,
- S&S
- one-sentence summary:
和输出:
- We're writing a book on GPT-3 and would like to connect with OpenAI to get a
- better understanding of the API and the future developments.
前随着 GPT-3 的引入,人们普遍认为 AI 模型能够与回答特定问题或处理特定任务的人类进行简短对话。然而,这些模型还不够复杂,无法处理复杂的文本生成任务,每当遇到复杂或抽象的事情时,它们就会开始忘记对话。
在自然语言生成的复杂世界中,GPT-3 动摇了语言模型仅限于琐碎任务的概念。文本生成是 GPT-3 的最大优势。它能够生成与人类书写的文本几乎无法区分的文本内容。GPT-3 使用来自训练数据集的数十亿单词进行训练,以生成文本以响应各种提示。据OpenAI 称,它平均每天产生 45 亿个单词。
在接下来的两个示例中,我们尝试使用 GPT-3 为个人生产力应用启动和社交媒体帖子创建内容。我们只给模型提供最小的上下文,它在第一次拍摄时会产生图2-21和2-22中的许多响应。
图 2-21。文章生成示例
我们的提示:
Here are the top 5 tips for personal productivity.
和输出:
- 1. Develop a routine
-
- Work can be overwhelming. You don't need to remember every little detail.
- By having a routine, you will be able to work more efficiently.
-
- 2. Avoid multitasking
-
- If you are multitasking, you are bound to miss something. It is better to
- work on one task at a time.
-
- 3. Take breaks
-
- It is true that if you do not take breaks, you will be more productive. However,
- if you take breaks too often you will get tired and stressed. If you work more
- effectively, you will shorten the time needed to complete a task.
-
- 4. Learn to delegate
-
- If you have a lot of work to do, you should not do everything on your own.
- Delegate some of the work to others.
-
- 5. Prioritize
-
- Prioritize what you have to do and do the most important tasks first. Don't
- worry about the small things.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。
社交媒体帖子生成
图 2-22。社交媒体帖子生成示例
这是我们的提示:
和输出: