Open WangShuXian6 opened 1 year ago
本文是一篇全面指南,介绍了各种提示技术,用于从 ChatGPT 中生成高质量的答案。 我们将探讨如何使用不同的提示工程技术来实现不同的目标。ChatGPT 是一款最先进的语言模型,能够生成类似人类的文本。>然而,理解如何正确地向 ChatGPT 提问以获得我们所需的高质量输出非常重要。而这正是本文的目的。
无论您是普通人、研究人员、开发人员,还是只是想在自己的领域中将 ChatGPT 作为个人助手的人,本文都是为您编写的。我使用简单易懂的语言,提供实用的解释,并在每个提示技术中提供了示例和提示公式。通过本文,您将学习如何使用提示工程技术来控制 ChatGPT 的输出,并生成符合您特定需求的文本。
在本文中,我们还提供了如何结合不同的提示技术以实现更具体结果的示例。我也希望您能像我写作时一样,享受阅读本文并从中获得知识。
什么是 Prompt 工程? Prompt 工程是创建提示或指导像 ChatGPT 这样的语言模型输出的过程。它允许用户控制模型的输出并生成符合其特定需求的文本。
ChatGPT 是一种先进的语言模型,能够生成类似于人类的文本。它建立在 Transformer 架构上,可以处理大量数据并生成高质量的文本。
然而,为了从 ChatGPT 中获得最佳结果,重要的是要了解如何正确地提示模型。 提示可以让用户控制模型的输出并生成相关、准确和高质量的文本。 在使用 ChatGPT 时,了解它的能力和限制非常重要。
该模型能够生成类似于人类的文本,但如果没有适当的指导,它可能无法始终产生期望的输出。
这就是 Prompt 工程的作用,通过提供清晰而具体的指令,您可以引导模型的输出并确保其相关。
Prompt 公式是提示的特定格式,通常由三个主要元素组成:
任务:对提示要求模型生成的内容进行清晰而简洁的陈述。 指令:在生成文本时模型应遵循的指令。 角色:模型在生成文本时应扮演的角色。
在本文中,我们将探讨可用于 ChatGPT 的各种 Prompt 工程技术。我们将讨论不同类型的提示,以及如何使用它们实现您想要的特定目标。
现在,让我们开始探索“指令提示技术”,以及如何使用它从 ChatGPT 中生成高质量的文本。
指令提示技术是通过为模型提供具体指令来引导 ChatGPT 的输出的一种方法。这种技术对于确保输出相关和高质量非常有用。
要使用指令提示技术,您需要为模型提供清晰简洁的任务,以及具体的指令以供模型遵循。
例如,如果您正在生成客户服务响应,您将提供任务,例如“生成响应客户查询”的指令,例如“响应应该专业且提供准确的信息”。
提示公式:“按照以下指示生成[任务]:[指令]”
示例: 生成客户服务响应:
任务:生成响应客户查询 指令:响应应该专业且提供准确的信息 提示公式:“按照以下指示生成专业且准确的客户查询响应:响应应该专业且提供准确的信息。”
生成法律文件:
任务:生成法律文件 指令:文件应符合相关法律法规 提示公式:“按照以下指示生成符合相关法律法规的法律文件:文件应符合相关法律法规。”
使用指令提示技术时,重要的是要记住指令应该清晰具体。这将有助于确保输出相关和高质量。可以将指令提示技术与下一章节中解释的“角色提示”和“种子词提示”相结合,以增强 ChatGPT 的输出。
角色提示技术是通过为 ChatGPT 指定一个特定的角色来引导其输出的一种方式。这种技术对于生成针对特定上下文或受众的文本非常有用。
要使用角色提示技术,您需要为模型提供一个清晰具体的角色。
例如,如果您正在生成客户服务回复,您可以提供一个角色,如“客户服务代表”。
提示公式:“作为[角色]生成[任务]”
示例: 生成客户服务回复:
任务:生成对客户查询的回复 角色:客户服务代表 提示公式:“作为客户服务代表,生成对客户查询的回复。”
生成法律文件:
任务:生成法律文件 角色:律师 提示公式:“作为律师,生成法律文件。”
将角色提示技术与指令提示和种子词提示结合使用可以增强 ChatGPT 的输出。
下面是一个示例,展示了如何将指令提示、角色提示和种子词提示技术结合使用:
任务:为新智能手机生成产品描述 指令:描述应该是有信息量的,具有说服力,并突出智能手机的独特功能 角色:市场代表 种子词:“创新的” 提示公式:“作为市场代表,生成一个有信息量的、有说服力的产品描述,突出新智能手机的创新功能。该智能手机具有以下功能[插入您的功能]”
在这个示例中,指令提示用于确保产品描述具有信息量和说服力。角色提示用于确保描述是从市场代表的角度书写的。而种子词提示则用于确保描述侧重于智能手机的创新功能。
标准提示是一种简单的方法,通过为模型提供一个特定的任务来引导 ChatGPT 的输出。例如,如果您想生成一篇新闻文章的摘要,您可以提供一个任务,如“总结这篇新闻文章”。
提示公式:“生成一个[任务]”
例如: 生成新闻文章的摘要:
任务:总结这篇新闻文章 提示公式:“生成这篇新闻文章的摘要”
生成一篇产品评论:
任务:为一款新智能手机撰写评论 提示公式:“生成这款新智能手机的评论” 此外,标准提示可以与其他技术(如角色提示和种子词提示)结合使用,以增强 ChatGPT 的输出。
以下是如何将标准提示、角色提示和种子词提示技术结合使用的示例:
任务:为一台新笔记本电脑撰写产品评论 说明:评论应客观、信息丰富,强调笔记本电脑的独特特点 角色:技术专家 种子词:“强大的” 提示公式:“作为一名技术专家,生成一个客观而且信息丰富的产品评论,强调新笔记本电脑的强大特点。”
在这个示例中,标准提示技术用于确保模型生成产品评论。角色提示用于确保评论是从技术专家的角度写的。而种子词提示用于确保评论侧重于笔记本电脑的强大特点。
零样本、一样本和少样本提示是用于从 ChatGPT 生成文本的技术,最少或没有任何示例。当特定任务的数据有限或任务是新的且未定义时,这些技术非常有用。
当任务没有可用的示例时,使用零样本提示技术。模型提供一个通用任务,根据对任务的理解生成文本。
当任务只有一个示例可用时,使用一样本提示技术。模型提供示例,并根据对示例的理解生成文本。
当任务只有有限数量的示例可用时,使用少样本提示技术。模型提供示例,并根据对示例的理解生成文本。
提示公式:“基于[数量]个示例生成文本”
例如: 为没有可用示例的新产品编写产品描述:
任务:为新的智能手表编写产品描述 提示公式:“基于零个示例为这款新智能手表生成产品描述”
使用一个示例生成产品比较:
任务:将新款智能手机与最新的 iPhone 进行比较 提示公式:“使用一个示例(最新的 iPhone)为这款新智能手机生成产品比较”
使用少量示例生成产品评论:
任务:为新的电子阅读器撰写评论 提示公式:“使用少量示例(3 个其他电子阅读器)为这款新电子阅读器生成评论” 这些技术可用于根据模型对任务或提供的示例的理解生成文本。
“让我们思考一下”提示是一种技巧,可鼓励 ChatGPT 生成反思和思考性的文本。这种技术适用于撰写论文、诗歌或创意写作等任务。
“让我们思考一下”提示的公式非常简单,即“让我们思考一下”后跟一个主题或问题。
例如: 生成一篇反思性论文:
任务:就个人成长主题写一篇反思性论文 提示公式:“让我们思考一下:个人成长”
生成一首诗:
任务:写一首关于季节变化的诗 提示公式:“让我们思考一下:季节变化”
这个提示要求对特定主题或想法展开对话或讨论。发言者邀请 ChatGPT 参与讨论相关主题。
模型提供了一个提示,作为对话或文本生成的起点。
然后,模型使用其训练数据和算法生成与提示相关的响应。这种技术允许 ChatGPT 根据提供的提示生成上下文适当且连贯的文本。
要使用“让我们思考一下提示”技术与 ChatGPT,您可以遵循以下步骤:
确定您要讨论的主题或想法。 制定一个明确表达主题或想法的提示,并开始对话或文本生成。 用“让我们思考”或“让我们讨论”开头的提示,表明您正在启动对话或讨论。
以下是使用此技术的一些提示示例:
提示:“让我们思考气候变化对农业的影响” 提示:“让我们讨论人工智能的当前状态” 提示:“让我们谈谈远程工作的好处和缺点” 您还可以添加开放式问题、陈述或一段您希望模型继续或扩展的文本。
提供提示后,模型将使用其训练数据和算法生成与提示相关的响应,并以连贯的方式继续对话。
这种独特的提示有助于 ChatGPT 以不同的视角和角度给出答案,从而产生更具动态性和信息性的段落。
使用提示的步骤简单易行,可以真正提高您的写作水平。尝试一下,看看效果如何吧。
自洽提示是一种技术,用于确保 ChatGPT 的输出与提供的输入一致。这种技术对于事实核查、数据验证或文本生成中的一致性检查等任务非常有用。
自洽提示的提示公式是输入文本后跟着指令“请确保以下文本是自洽的”。
或者,可以提示模型生成与提供的输入一致的文本。
提示示例及其公式: 示例 1:文本生成
任务:生成产品评论 指令:评论应与输入中提供的产品信息一致 提示公式:“生成与以下产品信息一致的产品评论[插入产品信息]”
示例 2:文本摘要
任务:概括一篇新闻文章 指令:摘要应与文章中提供的信息一致 提示公式:“用与提供的信息一致的方式概括以下新闻文章[插入新闻文章]”
示例 3:文本完成
任务:完成一个句子 指令:完成应与输入中提供的上下文一致 提示公式:“以与提供的上下文一致的方式完成以下句子[插入句子]”
示例 4:
事实核查: 任务:检查给定新闻文章的一致性 输入文本:“文章中陈述该城市的人口为 500 万,但后来又说该城市的人口为 700 万。” 提示公式:“请确保以下文本是自洽的:文章中陈述该城市的人口为 500 万,但后来又说该城市的人口为 700 万。” 数据验证: 任务:检查给定数据集的一致性 输入文本:“数据显示 7 月份的平均温度为 30 度,但最低温度记录为 20 度。” 提示公式:“请确保以下文本是自洽的:数据显示 7 月份的平均温度为 30 度,但最低温度记录为 20 度。”
种子词提示是一种通过提供特定的种子词或短语来控制 ChatGPT 输出的技术。种子词提示的提示公式是种子词或短语,后跟指令“请根据以下种子词生成文本”。
示例: 文本生成:
任务:编写一篇有关龙的故事 种子词:“龙” 提示公式:“请根据以下种子词生成文本:龙”
语言翻译:
任务:将一句话从英语翻译成西班牙语 种子词:“你好” 提示公式:“请根据以下种子词生成文本:你好”
这种技术允许模型生成与种子词相关的文本并对其进行扩展。这是一种控制模型生成文本与某个特定主题或背景相关的方式。
种子词提示可以与角色提示和指令提示相结合,以创建更具体和有针对性的生成文本。通过提供种子词或短语,模型可以生成与该种子词或短语相关的文本,并通过提供有关期望输出和角色的信息,模型可以以特定于角色或指令的风格或语气生成文本。这样可以更好地控制生成的文本,并可用于各种应用程序。
以下是提示示例及其公式: 示例 1:文本生成
任务:编写一首诗 指令:诗应与种子词“爱”相关,并以十四行诗的形式书写。 角色:诗人 提示公式:“作为诗人,根据以下种子词生成与“爱”相关的十四行诗:”
示例 2:文本完成
任务:完成一句话 指令:完成应与种子词“科学”相关,并以研究论文的形式书写。 角色:研究员 提示公式:“作为研究员,请在与种子词“科学”相关且以研究论文的形式书写的情况下完成以下句子:[插入句子]”
示例 3:文本摘要
任务:摘要一篇新闻文章 指令:摘要应与种子词“政治”相关,并以中立和公正的语气书写。 角色:记者 提示公式:“作为记者,请以中立和公正的语气摘要以下新闻文章,与种子词“政治”相关:[插入新闻文章]”
知识生成提示是一种从 ChatGPT 中引出新的、原创的信息的技术。
知识生成提示的公式是“请生成关于 X 的新的和原创的信息”,其中 X 是感兴趣的主题。
这是一种利用模型预先存在的知识来生成新的信息或回答问题的技术。
要将此提示与 ChatGPT 一起使用,需要将问题或主题作为输入提供给模型,以及指定所生成文本的任务或目标的提示。
提示应包括有关所需输出的信息,例如要生成的文本类型以及任何特定的要求或限制。
以下是提示示例及其公式: 示例 1:知识生成
任务:生成有关特定主题的新信息 说明:生成的信息应准确且与主题相关 提示公式:“生成有关[特定主题]的新的准确信息”
示例 2:问答
任务:回答问题 说明:答案应准确且与问题相关 提示公式:“回答以下问题:[插入问题]”
示例 3:知识整合
任务:将新信息与现有知识整合 说明:整合应准确且与主题相关 提示公式:“将以下信息与有关[特定主题]的现有知识整合:[插入新信息]”
示例 4:数据分析
任务:从给定的数据集中生成有关客户行为的见解 提示公式:“请从这个数据集中生成有关客户行为的新的和原创的信息”
这种技术利用模型的现有知识来整合新信息或连接不同的信息片段。
这种技术对于将现有知识与新信息相结合,以生成更全面的特定主题的理解非常有用。
如何与 ChatGPT 一起使用:
模型应该提供新信息和现有知识作为输入,以及指定生成文本的任务或目标的提示。 提示应包括有关所需输出的信息,例如要生成的文本类型以及任何特定的要求或限制。
提示示例及其公式: 示例 1:知识整合
任务:将新信息与现有知识整合 说明:整合应准确且与主题相关 提示公式:“将以下信息与关于[具体主题]的现有知识整合:[插入新信息]”
示例 2:连接信息片段
任务:连接不同的信息片段 说明:连接应相关且逻辑清晰 提示公式:“以相关且逻辑清晰的方式连接以下信息片段:[插入信息 1] [插入信息 2]”
示例 3:更新现有知识
任务:使用新信息更新现有知识 说明:更新的信息应准确且相关 提示公式:“使用以下信息更新[具体主题]的现有知识:[插入新信息]”
这种技术向模型提供一个问题或任务以及一组预定义的选项作为潜在答案。
该技术对于生成仅限于特定选项集的文本非常有用,可用于问答、文本完成和其他任务。模型可以生成仅限于预定义选项的文本。
要使用 ChatGPT 的多项选择提示,需要向模型提供一个问题或任务作为输入,以及一组预定义的选项作为潜在答案。提示还应包括有关所需输出的信息,例如要生成的文本类型以及任何特定要求或限制。
提示示例及其公式: 示例 1:问答
任务:回答一个多项选择题 说明:答案应该是预定义的选项之一 提示公式:“通过选择以下选项之一回答以下问题:[插入问题] [插入选项 1] [插入选项 2] [插入选项 3]”
示例 2:文本完成
任务:使用预定义选项之一完成句子 说明:完成应该是预定义的选项之一 提示公式:“通过选择以下选项之一完成以下句子:[插入句子] [插入选项 1] [插入选项 2] [插入选项 3]”
示例 3:情感分析
任务:将文本分类为积极、中立或消极 说明:分类应该是预定义的选项之一 提示公式:“通过选择以下选项之一,将以下文本分类为积极、中立或消极:[插入文本] [积极] [中立] [消极]”
可解释的软提示是一种技术,可以在提供一定的灵活性的同时控制模型生成的文本。它通过提供一组受控输入和关于所需输出的附加信息来实现。这种技术可以生成更具解释性和可控性的生成文本。
提示示例及其公式: 示例 1:文本生成
任务:生成一个故事 指令:故事应基于一组给定的角色和特定的主题 提示公式:“基于以下角色生成故事:[插入角色]和主题:[插入主题]”
示例 2:文本完成
任务:完成一句话 指令:完成应以特定作者的风格为基础 提示公式:“以[特定作者]的风格完成以下句子:[插入句子]”
示例 3:语言建模
任务:以特定风格生成文本 指令:文本应以特定时期的风格为基础 提示公式:“以[特定时期]的风格生成文本:[插入上下文]”
控制生成提示是一种技术,可让模型在生成文本时对输出进行高度控制。
这可以通过提供一组特定的输入来实现,例如模板、特定词汇或一组约束条件,这些输入可用于指导生成过程。
以下是一些示例和它们的公式: 示例 1:文本生成
任务:生成一个故事 说明:该故事应基于特定的模板 提示公式:“根据以下模板生成故事:[插入模板]”
示例 2:文本补全
任务:完成一句话 说明:完成应使用特定的词汇 提示公式:“使用以下词汇完成以下句子:[插入词汇]:[插入句子]”
示例 3:语言建模
任务:以特定风格生成文本 说明:文本应遵循一组特定的语法规则 提示公式:“生成遵循以下语法规则的文本:[插入规则]:[插入上下文]” 通过提供一组特定的输入来指导生成过程,控制生成提示使得生成的文本更具可控性和可预测性。
问答提示是一种技术,可以让模型生成回答特定问题或任务的文本。通过将问题或任务与可能与问题或任务相关的任何其他信息一起作为输入提供给模型来实现此目的。
一些提示示例及其公式如下: 示例 1:事实问题回答
任务:回答一个事实性问题 说明:答案应准确且相关 提示公式:“回答以下事实问题:[插入问题]”
示例 2:定义
任务:提供一个词的定义 说明:定义应准确 提示公式:“定义以下词汇:[插入单词]”
示例 3:信息检索
任务:从特定来源检索信息 说明:检索到的信息应相关 提示公式:“从以下来源检索有关[特定主题]的信息:[插入来源]” 这对于问答和信息检索等任务非常有用。
概述提示是一种技术,允许模型在保留其主要思想和信息的同时生成给定文本的较短版本。
这可以通过将较长的文本作为输入提供给模型并要求其生成该文本的摘要来实现。
这种技术对于文本概述和信息压缩等任务非常有用。
如何在 ChatGPT 中使用:
应该向模型提供较长的文本作为输入,并要求其生成该文本的摘要。 提示还应包括有关所需输出的信息,例如摘要的所需长度和任何特定要求或限制。
提示示例及其公式: 示例 1:文章概述
任务:概述新闻文章 说明:摘要应是文章主要观点的简要概述 提示公式:“用一句简短的话概括以下新闻文章:[插入文章]”
示例 2:会议记录
任务:概括会议记录 说明:摘要应突出会议的主要决策和行动 提示公式:“通过列出主要决策和行动来总结以下会议记录:[插入记录]”
示例 3:书籍摘要
任务:总结一本文 说明:摘要应是书的主要观点的简要概述 提示公式:“用一段简短的段落总结以下书籍:[插入书名]”
对话提示是一种技术,允许模型生成模拟两个或更多实体之间对话的文本。通过为模型提供一个上下文和一组角色或实体,以及它们的角色和背景,并要求模型在它们之间生成对话。
因此,应为模型提供上下文和一组角色或实体,以及它们的角色和背景。还应向模型提供有关所需输出的信息,例如对话或交谈的类型以及任何特定的要求或限制。
提示示例及其公式: 示例 1:对话生成
任务:生成两个角色之间的对话 说明:对话应自然且与给定上下文相关 提示公式:“在以下情境中生成以下角色之间的对话[插入角色]”
示例 2:故事写作
任务:在故事中生成对话 说明:对话应与故事的角色和事件一致 提示公式:“在以下故事中生成以下角色之间的对话[插入故事]”
示例 3:聊天机器人开发
任务:为客服聊天机器人生成对话 说明:对话应专业且提供准确的信息 提示公式:“在客户询问[插入主题]时,为客服聊天机器人生成专业和准确的对话” 因此,这种技术对于对话生成、故事写作和聊天机器人开发等任务非常有用。
对抗性提示是一种技术,它允许模型生成抵抗某些类型的攻击或偏见的文本。这种技术可用于训练更为稳健和抵抗某些类型攻击或偏见的模型。
要在 ChatGPT 中使用对抗性提示,需要为模型提供一个提示,该提示旨在使模型难以生成符合期望输出的文本。提示还应包括有关所需输出的信息,例如要生成的文本类型和任何特定要求或约束。
提示示例及其公式: 示例 1:用于文本分类的对抗性提示
任务:生成被分类为特定标签的文本 说明:生成的文本应难以分类为特定标签 提示公式:“生成难以分类为[插入标签]的文本”
示例 2:用于情感分析的对抗性提示
任务:生成难以分类为特定情感的文本 说明:生成的文本应难以分类为特定情感 提示公式:“生成难以分类为具有[插入情感]情感的文本”
示例 3:用于语言翻译的对抗性提示
任务:生成难以翻译的文本 说明:生成的文本应难以翻译为目标语言 提示公式:“生成难以翻译为[插入目标语言]的文本”
聚类提示是一种技术,它可以让模型根据某些特征或特点将相似的数据点分组在一起。
通过提供一组数据点并要求模型根据某些特征或特点将它们分组成簇,可以实现这一目标。
这种技术在数据分析、机器学习和自然语言处理等任务中非常有用。
如何在 ChatGPT 中使用: 应该向模型提供一组数据点,并要求它根据某些特征或特点将它们分组成簇。提示还应包括有关所需输出的信息,例如要生成的簇数和任何特定的要求或约束。
提示示例及其公式: 示例 1:客户评论的聚类
任务:将相似的客户评论分组在一起 说明:应根据情感将评论分组 提示公式:“将以下客户评论根据情感分组成簇:[插入评论]”
示例 2:新闻文章的聚类
任务:将相似的新闻文章分组在一起 说明:应根据主题将文章分组 提示公式:“将以下新闻文章根据主题分组成簇:[插入文章]”
示例 3:科学论文的聚类
任务:将相似的科学论文分组在一起 说明:应根据研究领域将论文分组 提示公式:“将以下科学论文根据研究领域分组成簇:[插入论文]”
强化学习提示是一种技术,可以使模型从过去的行动中学习,并随着时间的推移提高其性能。要在 ChatGPT 中使用强化学习提示,需要为模型提供一组输入和奖励,并允许其根据接收到的奖励调整其行为。提示还应包括有关期望输出的信息,例如要完成的任务以及任何特定要求或限制。这种技术对于决策制定、游戏玩法和自然语言生成等任务非常有用。
提示示例及其公式: 示例 1:用于文本生成的强化学习
任务:生成与特定风格一致的文本 说明:模型应根据为生成与特定风格一致的文本而接收到的奖励来调整其行为 提示公式:“使用强化学习来生成与以下风格一致的文本[插入风格]”
示例 2:用于语言翻译的强化学习
任务:将文本从一种语言翻译成另一种语言 说明:模型应根据为生成准确翻译而接收到的奖励来调整其行为 提示公式:“使用强化学习将以下文本[插入文本]从[插入语言]翻译成[插入语言]”
示例 3:用于问答的强化学习
任务:回答问题 说明:模型应根据为生成准确答案而接收到的奖励来调整其行为 提示公式:“使用强化学习来回答以下问题[插入问题]”
课程学习是一种技术,允许模型通过先训练简单任务,逐渐增加难度来学习复杂任务。
要在 ChatGPT 中使用课程学习提示,模型应该提供一系列任务,这些任务逐渐增加难度。
提示还应包括有关期望输出的信息,例如要完成的最终任务以及任何特定要求或约束条件。
此技术对自然语言处理、图像识别和机器学习等任务非常有用。
提示示例及其公式: 示例 1:用于文本生成的课程学习
任务:生成与特定风格一致的文本 说明:模型应该在移动到更复杂的风格之前先在简单的风格上进行训练。 提示公式:“使用课程学习来生成与以下风格[插入风格]一致的文本,按照以下顺序[插入顺序]。”
示例 2:用于语言翻译的课程学习
任务:将文本从一种语言翻译成另一种语言 说明:模型应该在移动到更复杂的语言之前先在简单的语言上进行训练。 提示公式:“使用课程学习将以下语言[插入语言]的文本翻译成以下顺序[插入顺序]。”
示例 3:用于问题回答的课程学习
任务:回答问题 说明:模型应该在移动到更复杂的问题之前先在简单的问题上进行训练。 提示公式:“使用课程学习来回答以下问题[插入问题],按照以下顺序[插入顺序]生成答案。”
情感分析是一种技术,允许模型确定文本的情绪色彩或态度,例如它是积极的、消极的还是中立的。
要在 ChatGPT 中使用情感分析提示,模型应该提供一段文本并要求根据其情感分类。
提示还应包括关于所需输出的信息,例如要检测的情感类型(例如积极的、消极的、中立的)和任何特定要求或约束条件。
提示示例及其公式: 示例 1:客户评论的情感分析
任务:确定客户评论的情感 说明:模型应该将评论分类为积极的、消极的或中立的 提示公式:“对以下客户评论进行情感分析[插入评论],并将它们分类为积极的、消极的或中立的。”
示例 2:推文的情感分析
任务:确定推文的情感 说明:模型应该将推文分类为积极的、消极的或中立的 提示公式:“对以下推文进行情感分析[插入推文],并将它们分类为积极的、消极的或中立的。”
示例 3:产品评论的情感分析
任务:确定产品评论的情感 说明:模型应该将评论分类为积极的、消极的或中立的 提示公式:“对以下产品评论进行情感分析[插入评论],并将它们分类为积极的、消极的或中立的。” 这种技术对自然语言处理、客户服务和市场研究等任务非常有用。
命名实体识别(NER)是一种技术,它可以使模型识别和分类文本中的命名实体,例如人名、组织机构、地点和日期等。
要在 ChatGPT 中使用命名实体识别提示,需要向模型提供一段文本,并要求它识别和分类文本中的命名实体。 提示还应包括有关所需输出的信息,例如要识别的命名实体类型(例如人名、组织机构、地点、日期)以及任何特定要求或约束条件。
提示示例及其公式: 示例 1:新闻文章中的命名实体识别
任务:在新闻文章中识别和分类命名实体 说明:模型应识别和分类人名、组织机构、地点和日期 提示公式:“在以下新闻文章[插入文章]上执行命名实体识别,并识别和分类人名、组织机构、地点和日期。”
示例 2:法律文件中的命名实体识别
任务:在法律文件中识别和分类命名实体 说明:模型应识别和分类人名、组织机构、地点和日期 提示公式:“在以下法律文件[插入文件]上执行命名实体识别,并识别和分类人名、组织机构、地点和日期。”
示例 3:研究论文中的命名实体识别
任务:在研究论文中识别和分类命名实体 说明:模型应识别和分类人名、组织机构、地点和日期 提示公式:“在以下研究论文[插入论文]上执行命名实体识别,并识别和分类人名、组织机构、地点和日期。”
文本分类是一种技术,它可以让模型将文本分成不同的类别。这种技术对于自然语言处理、文本分析和情感分析等任务非常有用。
需要注意的是,文本分类和情感分析是不同的。情感分析特别关注于确定文本中表达的情感或情绪。这可能包括确定文本表达了积极、消极还是中性的情感。情感分析通常用于客户评论、社交媒体帖子和其他需要表达情感的文本。
要在 ChatGPT 中使用文本分类提示,模型需要提供一段文本,并要求它根据预定义的类别或标签进行分类。提示还应包括有关所需输出的信息,例如类别或标签的数量以及任何特定的要求或约束。
提示示例及其公式: 示例 1:对客户评论进行文本分类
任务:将客户评论分类为不同的类别,例如电子产品、服装和家具 说明:模型应根据评论的内容对其进行分类 提示公式:“对以下客户评论 [插入评论] 进行文本分类,并根据其内容将其分类为不同的类别,例如电子产品、服装和家具。”
示例 2:对新闻文章进行文本分类
任务:将新闻文章分类为不同的类别,例如体育、政治和娱乐 说明:模型应根据文章的内容对其进行分类 提示公式:“对以下新闻文章 [插入文章] 进行文本分类,并根据其内容将其分类为不同的类别,例如体育、政治和娱乐。”
示例 3:对电子邮件进行文本分类
任务:将电子邮件分类为不同的类别,例如垃圾邮件、重要邮件或紧急邮件 说明:模型应根据电子邮件的内容和发件人对其进行分类 提示公式:“对以下电子邮件 [插入电子邮件] 进行文本分类,并根据其内容和发件人将其分类为不同的类别,例如垃圾邮件、重要邮件或紧急邮件。”
文本生成提示与本文中提到的其他提示技术相关,例如:零、一、几次提示,受控生成提示,翻译提示,语言建模提示,句子补全提示等。这些提示都与生成文本有关,但它们在生成文本的方式和放置在生成文本上的特定要求或限制方面有所不同。文本生成提示可用于微调预训练模型或训练新模型以执行特定任务。
提示示例及其公式: 示例 1:故事创作的文本生成
任务:根据给定的提示生成故事 说明:故事应至少包含 1000 个单词,并包括一组特定的角色和情节。 提示公式:“根据以下提示[插入提示]生成一个至少包含 1000 个单词,包括角色[插入角色]和情节[插入情节]的故事。”
示例 2:语言翻译的文本生成
任务:将给定的文本翻译成另一种语言 说明:翻译应准确并符合习惯用语。 提示公式:“将以下文本[插入文本]翻译成[插入目标语言],并确保其准确且符合习惯用语。”
示例 3:文本完成的文本生成
任务:完成给定的文本 说明:生成的文本应与输入文本连贯一致。 提示公式:“完成以下文本[插入文本],并确保其连贯一致且符合输入文本。”
正如本文中所探讨的那样,快速工程是一种利用像 ChatGPT 这样的语言模型获得高质量答案的强大工具。通过精心设计各种技巧的提示,我们可以引导模型生成符合我们特定需求和要求的文本。
在第二章中,我们讨论了如何使用指令提示向模型提供清晰明确的指导。在第三章中,我们探讨了如何使用角色提示生成特定的语音或风格的文本。在第四章中,我们研究了如何使用标准提示作为微调模型性能的起点。我们还研究了几种高级提示技术,这些技术中的每一种都可以以不同的方式使用,以实现各种不同的结果。
随着您继续使用 ChatGPT 和其他语言模型,值得尝试不同的技巧组合,以找到最适合您特定用例的方法。
没有指导,模型就会失败,但在指令的丰富中有安全。
- GPT 11:14
Guidance 使您能够比传统的提示或链接更有效、更高效地控制现代语言模型。Guidance 程序允许您将生成、提示和逻辑控制交织在一个连续的流中,以匹配语言模型实际处理文本的方式。像 Chain of Thought 及其许多变体(例如,ART,Auto-CoT 等)的简单输出结构已被证明可以提高LLM的性能。GPT-4 等更强大的 LLM 的出现允许更丰富的结构,而 guidance
使该结构变得更简单、更便宜。
特点:
pip install guidance
通过在笔记本中实时流式传输复杂的模板和生成来加速您的提示开发周期。乍一看,Guidance 就像一个模板语言,就像标准的 Handlebars 模板一样,您可以进行变量插值(例如,{{proverb}}
)和逻辑控制。但与标准的模板语言不同,guidance 程序具有明确定义的线性执行顺序,该顺序直接对应于语言模型处理的令牌顺序。这意味着在执行的任何时候,语言模型都可以用于生成文本(使用 {{gen}}
命令)或做出逻辑控制流决策。这种生成和提示的交织允许精确的输出结构,产生清晰和可解析的结果。
import guidance
# 设置用于执行 guidance 程序的默认语言模型
guidance.llm = guidance.llms.OpenAI("text-davinci-003")
# 定义一个 guidance 程序,以适应对模型指令的谚语
program = guidance("""Tweak this proverb to apply to model instructions instead.
{{proverb}}
- {{book}} {{chapter}}:{{verse}}
UPDATED
Where there is no guidance{{gen 'rewrite' stop="\\n-"}}
- GPT {{#select 'chapter'}}9{{or}}10{{or}}11{{/select}}:{{gen 'verse'}}""")
# 在特定的谚语上执行程序
executed_program = program(
proverb="Where there is no guidance, a people falls,\nbut in an abundance of counselors there is safety.",
book="Proverbs",
chapter=11,
verse=14
)
程序执行后,所有生成的变量现在都很容易访问:
executed_program["rewrite"]
', a model fails,\nbut in an abundance of instructions there is safety.'
Guidance 支持基于 API 的聊天模型,如 GPT-4,以及通过基于角色标签的统一 API(例如,{{#system}}...{{/system}}
)支持开放聊天模型,如 Vicuna。这允许交互式对话开发,将丰富的模板和逻辑控制与现代聊天模型相结合。
# 连接到像 GPT-4 或 Vicuna 这样的聊天模型
gpt4 = guidance.llms.OpenAI("gpt-4")
# vicuna = guidance.llms.transformers.Vicuna("your_path/vicuna_13B", device_map="auto")
experts = guidance('''
{{#system~}}
You are a helpful and terse assistant.
{{~/system}}
{{#user~}}
I want a response to the following question:
{{query}}
Name 3 world-class
experts (past or present) who would be great at answering this?
Don't answer the question yet.
{{~/user}}
{{#assistant~}}
{{gen 'expert_names' temperature=0 max_tokens=300}}
{{~/assistant}}
{{#user~}}
Great, now please answer the question as if these experts had collaborated in writing a joint anonymous answer.
{{~/user}}
{{#assistant~}}
{{gen 'answer' temperature=0 max_tokens=500}}
{{~/assistant}}
''', llm=gpt4)
experts(query='How can I be more productive?')
当在一个 Guidance 程序中使用多个生成或 LLM-指导的控制流语句时,我们可以通过在提示过程中最优地重用 Key/Value 缓存来显著提高推理性能。这意味着 Guidance 只要求 LLM 生成下面的绿色文本,而不是整个程序。这将此提示的运行时间减半,与标准生成方法相比。
# 我们在这里使用 LLaMA,但任何 GPT-风格的模型都可以
llama = guidance.llms.Transformers("your_path/llama-7b", device=0)
# 我们可以预定义有效的选项集
valid_weapons = ["sword", "axe", "mace", "spear", "bow", "crossbow"]
# 定义提示
character_maker = guidance("""以下是以 JSON 格式为 RPG 游戏创建的角色配置文件。
```json
{
"id": "{{id}}",
"description": "{{description}}",
"name": "{{gen 'name'}}",
"age": {{gen 'age' pattern='[0-9]+' stop=','}},
"armor": "{{#select 'armor'}}leather{{or}}chainmail{{or}}plate{{/select}}",
"weapon": "{{select 'weapon' options=valid_weapons}}",
"class": "{{gen 'class'}}",
"mantra": "{{gen 'mantra' temperature=0.7}}",
"strength": {{gen 'strength' pattern='[0-9]+' stop=','}},
"items": [{{#geneach 'items' num_iterations=5 join=', '}}"{{gen 'this' temperature=0.7}}"{{/geneach}}]
}```""")
# 生成一个角色
character_maker(
id="e1f491f7-7ab8-4dac-8c20-c92b5e7d883d",
description="A quick and nimble fighter.",
valid_weapons=valid_weapons, llm=llama
)
上述提示通常需要超过2.5秒才能在使用 LLaMA 7B 的 A6000 GPU 上完成。如果我们运行相同的提示,但将其适配为单个生成调用(今天的标准做法),则需要大约5秒才能完成(其中4秒用于令牌生成,1秒用于提示处理)。这意味着 Guidance 加速为此提示提供了 2 倍的速度提升。实际上,确切的加速系数取决于您特定提示的格式和模型的大小(较大的模型受益更多)。目前只支持 Transformers LLM 的加速。有关更多详细信息,请参见笔记本。
大多数语言模型使用的标准贪婪令牌化会引入一种微妙而强大的偏见,这可能会对您的提示产生各种意想不到的后果。通过我们称为“令牌修复”的过程,guidance
自动消除了这些令人惊讶的偏见,使您能够专注于设计您想要的提示,而无需担心令牌化的副作用。
考虑以下示例,我们试图生成一个 HTTP URL 字符串:
# 我们使用 StableLM作为一个开放的例子,但这些问题影响所有模型不同程度
guidance.llm = guidance.llms.Transformers("stabilityai/stablelm-base-alpha-3b", device=0)
# 我们关闭令牌修复,使 guidance 充当正常的提示库
program = guidance('''The link is <a href="http:{{gen max_tokens=10 token_healing=False}}''')
program()
注意 LLM 生成的输出没有用明显的下一个字符(两个前斜杠)完成 URL。而是在中间创建了一个包含空格的无效 URL 字符串。为什么?因为字符串 "://" 是它自己的令牌 (1358
),所以一旦模型看到一个冒号本身 (令牌 27
),它就会假设下一个字符不能是 "//";否则,分词器不会使用 27
,而会使用 1358
(令牌 "://")。
这种偏见不仅限于冒号字符 - 它无处不在。对于上面使用的 StableLM 模型,10k 最常见令牌中的 70% 是更长可能令牌的前缀,因此当它们是提示中的最后令牌时会导致令牌边界偏见。例如,":" 令牌 27
有 34 个可能的扩展," the" 令牌 1735
有 51 个扩展,而 " " (空格) 令牌 209
有 28,802 个扩展。
guidance
通过将模型备份一个令牌,然后允许模型向前步进,同时将其约束为只生成前缀与最后令牌匹配的令牌,从而消除了这些偏见。这个“令牌修复”过程消除了令牌边界偏见,允许任何提示自然完成:
guidance('The link is <a href="http:{{gen max_tokens=10}}')()
为了展示输出结构的价值,我们从 BigBench 中采取了一个简单的任务,目标是确定给定的句子是否包含时代错误(由于时间段不重叠而不可能的陈述)。下面是一个简单的两步提示,其中包含了人工制作的思考链序列。
Guidance 程序,像标准的 Handlebars 模板一样,允许变量插值(例如,{{input}}
)和逻辑控制。但与标准的模板语言不同,guidance 程序具有与语言模型处理的令牌顺序直接对应的独特线性执行顺序。这意味着在执行的任何时候,语言模型都可以用于生成文本({{gen}}
命令)或做出逻辑控制流决策({{#select}}...{{or}}...{{/select}}
命令)。这种生成和提示的交织允许精确的输出结构,提高了准确性,同时还产生了清晰和可解析的结果。
import guidance
# 设置用于执行 guidance 程序的默认语言模型
guidance.llm = guidance.llms.OpenAI("text-davinci-003")
# 定义一些示例
examples = [
{'input': 'I wrote about shakespeare',
'entities': [{'entity': 'I', 'time': 'present'}, {'entity': 'Shakespeare', 'time': '16th century'}],
'reasoning': 'I can write about Shakespeare because he lived in the past with respect to me.',
'answer': 'No'},
{'input': 'Shakespeare wrote about me',
'entities': [{'entity': 'Shakespeare', 'time': '16th century'}, {'entity': 'I', 'time': 'present'}],
'reasoning': 'Shakespeare cannot have written about me, because he died before I was born',
'answer': 'Yes'}
]
# 定义 guidance 程序
structure_program = guidance(
'''给出一个句子,告诉我它是否包含了时代错误(即根据与实体相关的时间周期,它是否可能发生)。
----
{{~! 显示几个示例 ~}}
{{~#each examples}}
句子: {{this.input}}
实体和日期:{{#each this.entities}}
{{this.entity}}: {{this.time}}{{/each}}
推理: {{this.reasoning}}
时代错误: {{this.answer}}
---
{{~/each}}
{{~! 在最后放置真正的问题 }}
句子: {{input}}
实体和日期:
{{gen "entities"}}
推理:{{gen "reasoning"}}
时代错误:{{#select "answer"}} 是的{{or}} 不是{{/select}}''')
# 执行程序
out = structure_program(
examples=examples,
input='霸王龙咬了我的狗'
)
所有生成的程序变量现在都可以在执行的程序对象中找到:
out["answer"]
' 是的'
我们在验证集上计算准确率,并将其与上面相同的两个示例的结果进行比较,没有输出结构,以及与此处报告的最佳结果进行比较。下面的结果与现有文献一致,即使是非常简单的输出结构也会显著提高性能,甚至与更大的模型相比也是如此。 | 模型 | 准确率 |
---|---|---|
有指导示例的少量学习,没有CoT输出结构 | 63.04% | |
PALM (3-shot) | 约 69% | |
Guidance | 76.01% |
大型语言模型非常擅长生成有用的输出,但不能保证这些输出遵循特定的格式。当我们想要使用语言模型的输出作为另一个系统的输入时,这可能会导致问题。例如,如果我们想要使用语言模型生成一个 JSON 对象,我们需要确保输出是有效的 JSON。借助guidance
,我们可以同时加速推理速度并确保生成的 JSON 始终有效。下面我们为游戏生成一个随机的角色配置文件,每次都具有完美的语法:
# 本地加载模型(我们在这里使用 LLaMA)
guidance.llm = guidance.llms.Transformers("your_local_path/llama-7b", device=0)
# 我们可以预定义有效的选项集
valid_weapons = ["sword", "axe", "mace", "spear", "bow", "crossbow"]
# 定义提示
program = guidance("""以下是以 JSON 格式为 RPG 游戏创建的角色配置文件。
```json
{
"description": "{{description}}",
"name": "{{gen 'name'}}",
"age": {{gen 'age' pattern='[0-9]+' stop=','}},
"armor": "{{#select 'armor'}}leather{{or}}chainmail{{or}}plate{{/select}}",
"weapon": "{{select 'weapon' options=valid_weapons}}",
"class": "{{gen 'class'}}",
"mantra": "{{gen 'mantra'}}",
"strength": {{gen 'strength' pattern='[0-9]+' stop=','}},
"items": [{{#geneach 'items' num_iterations=3}}
"{{gen 'this'}}",{{/geneach}}
]
}```""")
# 执行提示
program(description="一个快速而灵活的战士。", valid_weapons=valid_weapons)
# 我们还有一个有效的 Python 字典
out.variables()
现代的聊天风格模型如 ChatGPT 和 Alpaca 是通过特殊令牌来训练的,这些令牌为提示的不同区域标记出"角色"。Guidance 通过角色标签支持这些模型,这些标签会自动映射到当前 LLM 的正确令牌或 API 调用。下面我们展示了一个基于角色的 guidance 程序如何简化多步推理和计划。
import guidance
import re
# 我们在这里使用 GPT-4,但你也可以使用 gpt-3.5-turbo
guidance.llm = guidance.llms.OpenAI("gpt-4")
# 我们将在 guidance 程序中调用的自定义函数
def parse_best(prosandcons, options):
best = int(re.findall(r'Best=(\d+)', prosandcons)[0])
return options[best]
# 使用角色标签(如 `{{#system}}...{{/system}}`)定义 guidance 程序
create_plan = guidance('''
{{#system~}}
你是一个有用的助手。
{{~/system}}
{{! 生成五种可能的方法来实现一个目标 }}
{{#block hidden=True}}
{{#user~}}
我想要{{goal}}。
{{~! 生成可能的选项 ~}}
你能否为我生成一种实现这个目标的方法?
请确保选项非常简短,最多一行。
{{~/user}}
{{#assistant~}}
{{gen 'options' n=5 temperature=1.0 max_tokens=500}}
{{~/assistant}}
{{/block}}
{{! 为每个选项生成利弊,并选择最好的选项 }}
{{#block hidden=True}}
{{#user~}}
我想要{{goal}}。
你能否评论以下每个选项的利弊,并选择最好的选项?
---{{#each options}}
选项 {{@index}}: {{this}}{{/each}}
---
请简要讨论每个选项(利弊各一行),并以 Best=X 结束,其中 X 是最好的选项。
{{~/user}}
{{#assistant~}}
{{gen 'prosandcons' temperature=0.0 max_tokens=500}}
{{~/assistant}}
{{/block}}
{{! 生成一个计划来实现选择的选项 }}
{{#user~}}
我想要{{goal}}。
{{~! 创建一个计划 }}
这是我的计划:
{{parse_best prosandcons options}}
请详细说明这个计划,并告诉我如何最好地实现它。
{{~/user}}
{{#assistant~}}
{{gen 'plan' max_tokens=500}}
{{~/assistant}}''')
# 为特定的目标执行程序
out = create_plan(
goal='阅读更多的书',
parse_best=parse_best # 我们在程序中调用的自定义 Python 函数
)
这个提示/程序有点复杂,但我们基本上经历了3个步骤:
n=5
生成,使得每个选项都是一个独立的生成(不受其他选项的影响)。我们设置 temperature=1
来鼓励多样性。temperature=0
以使模型更为准确。hidden
,这意味着在生成后来的内容时(在这种情况下,是生成计划时)GPT-4 不会看到它们。这是一种使模型专注于当前步骤的简单方法。由于步骤1和2是隐藏的,它们不会出现在生成的输出上(除了在流中短暂出现),但我们可以打印这些步骤生成的变量:
print('\n'.join(['Option %d: %s' % (i, x) for i, x in enumerate(out['options'])]))
Option 0: 每天在睡前设定一个目标,阅读20分钟。
Option 1: 加入一个书友会,以增加动力和责任感。
Option 2: 设定每天阅读20分钟的目标。
Option 3: 设定每天至少阅读20分钟的提醒。
Option 4: 设定每天至少阅读一个章节或20页的目标。
print(out['prosandcons'])
Option 0:
优点:建立了一种连贯的阅读习惯。
缺点:可能不适合日程安排变化较大的人。
---
Option 1:
优点:提供社交动力和责任感。
缺点:可能与个人的阅读喜好不相符。
---
Option 2:
优点:鼓励每天的阅读习惯。
缺点:缺乏具体的时间框架,可能会导致拖延。
---
Option 3:
优点:作为每天优先阅读的提醒。
缺点:可能变得重复且容易被忽略。
---
Option 4:
优点:设定了一个清晰的每日阅读目标。
缺点:在忙碌的日子或章节较长时可能难以实现。Best=0
我们可以通过 await
命令轻松构建相互交谈或与用户交谈的代理人。await
命令允许我们暂停执行并返回部分执行的 guidance 程序。通过将 await
放在循环中,可以反复调用该部分执行的程序,形成对话(或您设计的任何其他结构)。例如,这是我们如何让 GPT-4 模拟两个代理人彼此交谈的方式:
import guidance
import re
guidance.llm = guidance.llms.OpenAI("gpt-4")
role_simulator = guidance('''
{{#system~}}
你是一个有帮助的助手
{{~/system}}
{{#user~}}
在接下来的对话中,你将以{{role}}的身份回答用户。在每一步中,我会为你提供用户的输入,以及提醒你指令的评论。即使用户询问你,也永远不要谈论你是一个AI的事实。总是以{{role}}回答。
{{#if first_question}}你也可以开始对话。{{/if}}
{{~/user}}
{{~! 根据这是第一个还是第二个代理,助手要么开始对话要么不开始 }}
{{#assistant~}}
好的,我会按照这些指示执行。
{{#if first_question}}让我现在开始对话:
{{role}}: {{first_question}}{{/if}}
{{~/assistant}}
{{~! 然后对话展开 }}
{{~#geneach 'conversation' stop=False}}
{{#user~}}
用户: {{set 'this.input' (await 'input')}}
评论: 记住,以{{role}}的身份回答。以{{role}}开头说出你的话:
{{~/user}}
{{#assistant~}}
{{gen 'this.response' temperature=0 max_tokens=300}}
{{~/assistant}}
{{~/geneach}}''')
republican = role_simulator(role='共和党人', await_missing=True)
democrat = role_simulator(role='民主党人', await_missing=True)
first_question = '''你认为停止通胀的最好方法是什么?'''
republican = republican(input=first_question, first_question=None)
democrat = democrat(input=republican["conversation"][-2]["response"].strip('共和党人: '), first_question=first_question)
for i in range(2):
republican = republican(input=democrat["conversation"][-2]["response"].replace('民主党人: ', ''))
democrat = democrat(input=republican["conversation"][-2]["response"].replace('共和党人: ', ''))
print('民主党人: ' + first_question)
for x in democrat['conversation'][:-1]:
print('共和党人:', x['input'])
print()
print(x['response'])
民主党人: 你认为停止通胀的最好方法是什么?
共和党人: 停止通胀的最好方法是实施良好的财政政策,例如减少政府支出,降低税收,并促进经济增长。此外,联邦储备委员会应专注于维持稳定的货币政策以控制通胀。
民主党人: 我同意良好的财政政策对于控制通胀很重要。作为一个民主党人,我会强调投资于教育、医疗和基础设施的重要性,以促进长期经济增长。此外,我们应确保联邦储备委员会对货币政策采取平衡的方法,既要控制通胀,也要促进充分的就业。
...
共和党人: 找到财政责任和投资于我们国家未来之间的平衡非常重要。然而,我们认为通过自由市场原则,例如降低税收和减少监管,是实现长期经济增长和创造就业的最好方法。这种方法鼓励企业扩张和创新,从而带来更繁荣的经济。渐进式的税收制度有时会阻碍增长和投资,所以我们主张一个更简单、更公平的税收制度,以促进经济增长。关于联邦储备委员会,虽然促进充分就业很重要,但我们不能忽视控制通胀以保持稳定和可预测的经济环境的主要目标。
民主党人: 我理解你对自由市场原则的看法,但是民主党人认为,一定程度的政府干预是必要的,以确保一个公平和公正的经济。我们支持渐进式的税收制度以减少收入不平等,并为有需要的人提供必要的服务。此外,我们认为监管对于保护消费者、工人和环境是重要的。至于联邦储备委员会,我们同意控制通胀非常重要,但我们也认为促进充分就业应该是一个优先考虑的问题。通过在这些目标之间找到平衡,我们可以为所有美国人创造一个更加包容和繁荣的经济。
最后一个示例 这里。
以下所有示例都在 这个笔记本 中。
模板语法基于 Handlebars,并附带了一些额外的内容。
当调用 guidance
时,它会返回一个程序:
prompt = guidance('''什么是{{example}}?''')
prompt
什么是{{example}}?
可以通过传递参数来执行该程序:
prompt(example='真理')
什么是真理?
参数可以是可迭代的:
people = ['John', 'Mary', 'Bob', 'Alice']
ideas = [{'name': 'truth', 'description': '事实的状态'},
{'name': 'love', 'description': '深深的感情'},]
prompt = guidance('''人员列表:
{{#each people}}- {{this}}
{{~! 这是一个注释. ~ 会移除标签前后的所有相邻空白,具体取决于你将其放在何处}}
{{/each~}}
想法列表:
{{#each ideas}}{{this.name}}: {{this.description}}
{{/each}}''')
prompt(people=people, ideas=ideas)
注意 {{/each}}
后的特殊字符 ~
。
你可以在任何标签前后添加它以移除所有相邻的空白。还要注意注释语法:{{! 这是一个注释 }}
。
你还可以在其他提示/程序中包含提示/程序;例如,这是如何重写上面的提示:
prompt1 = guidance('''人员列表:
{{#each people}}- {{this}}
{{/each~}}''')
prompt2 = guidance('''{{>prompt1}}
想法列表:
{{#each ideas}}{{this.name}}: {{this.description}}
{{/each}}''')
prompt2(prompt1=prompt1, people=people, ideas=ideas)
gen
标签用于生成文本。你可以使用底层模型支持的任何参数。
执行提示调用生成提示:
import guidance
# 设置默认的 llm。也可以将不同的 llm 作为参数传递给 guidance(),通过 guidance(llm=...)
guidance.llm = guidance.llms.OpenAI("text-davinci-003")
prompt = guidance('''海滩最好的事情是{{~gen 'best' temperature=0.7 max_tokens=7}}''')
prompt = prompt()
prompt
guidance
会缓存所有具有相同参数的 OpenAI 生成。如果你想清除缓存,可以调用 guidance.llms.OpenAI.cache.clear()
。
你可以使用 select
标签从一系列选项中选择:
prompt = guidance('''以下句子冒犯了吗?请用一个单词回答,"是","否" 或 "可能"。
句子: {{example}}
回答:{{#select "answer" logprobs='logprobs'}} 是{{or}} 否{{or}} 可能{{/select}}''')
prompt = prompt(example='我讨厌墨西哥卷饼')
prompt
prompt['logprobs']
{' 是': -1.5689583, ' 否': -7.332395, ' 可能': -0.23746304}
提示可能包含多个生成或选择,将按顺序执行:
prompt = guidance('''针对以下电子邮件生成回应:
{{email}}。
回应:{{gen "response"}}
上述回应有冒犯之处吗?请用一个单词回答,"是" 或 "否"。
回答:{{#select "answer" logprobs='logprobs'}} 是{{or}} 否{{/select}}''')
prompt = prompt(email='我讨厌墨西哥卷饼')
prompt
prompt['response'], prompt['answer']
("太糟糕了!墨西哥卷饼是我最喜欢的食物之一。", ' 否')
你可以在 block
或 gen
标签中使用 hidden
标签生成文本,而不显示它或在后续生成中使用它:
prompt = guidance('''{{#block hidden=True}}针对以下电子邮件生成回应:
{{email}}。
回应:{{gen "response"}}{{/block}}
我会向你展示一封电子邮件和回应,你会告诉我是否冒犯。
电子邮件: {{email}}。
回应: {{response}}
上述回应有冒犯之处吗?请用一个单词回答,"是" 或 "否"。
回答:{{#select "answer" logprobs='logprobs'}} 是{{or}} 否{{/select}}''')
prompt = prompt(email='我讨厌墨西哥卷饼')
prompt
注意,隐藏块内的内容不会显示在输出中(或被 select
使用),即使我们在后续生成中使用了生成的 response
变量。
n>1
生成如果你使用 n>1
,变量将包含一个列表(还有一个可让你浏览列表的可视化):
prompt = guidance('''海滩最好的事情是 {{~gen 'best' n=3 temperature=0.7 max_tokens=7}}''')
prompt = prompt()
prompt['best']
[' 那是个很好的地方,', ' 能在阳光下放松,', " 那是个很好的地方,"]
你可以使用生成的变量作为参数调用任何Python函数。当执行提示时,将调用函数:
def aggregate(best):
return '\n'.join(['- ' + x for x in best])
prompt = guidance('''海滩最好的事情是 {{~gen 'best' n=3 temperature=0.7 max_tokens=7 hidden=True}}
{{aggregate best}}''')
prompt = prompt(aggregate=aggregate)
prompt
await
暂停执行await
标签将暂停程序执行,直到提供该变量:
prompt = guidance('''针对以下电子邮件生成回应:
{{email}}.
回应:{{gen "response"}}
{{await 'instruction'}}
{{gen 'updated_response'}}''', stream=True)
prompt = prompt(email='你好呀')
prompt
注意,由于最后一个 gen
依赖于 instruction
,所以它没有被执行。现在我们提供 instruction
:
prompt = prompt(instruction='请将上面的回应翻译成葡萄牙语。')
prompt
现在程序已执行到最后。
回声,流。待办事项 @SCOTT
如果你使用的是仅允许 ChatCompletion(gpt-3.5-turbo
或 gpt-4
)的 OpenAI LLM,你可以使用特殊标签 {{#system}}
, {{#user}}
, 和 {{#assistant}}
:
prompt = guidance(
'''{{#system~}}
你是一个有用的助手。
{{~/system}}
{{#user~}}
{{conversation_question}}
{{~/user}}
{{#assistant~}}
{{gen 'response'}}
{{~/assistant}}''')
prompt = prompt(conversation_question='生命的意义是什么?')
prompt
由于不允许部分完成,你不能在助手块内使用输出结构,但你仍然可以在外面设置一个结构。这里有一个例子(也在这里):
experts = guidance(
'''{{#system~}}
你是一个有用的助手。
{{~/system}}
{{#user~}}
我想要以下问题的回答:
{{query}}
谁是3位世界级的专家(过去或现在),他们能很好地回答这个问题?
请暂时不要回答问题或对其发表评论。
{{~/user}}
{{#assistant~}}
{{gen 'experts' temperature=0 max_tokens=300}}
{{~/assistant}}
{{#user~}}
很好,现在请像这些专家合作撰写了一个联合匿名回答一样回答这个问题。
换句话说,不要透露他们的身份,也不要透露有一个专家小组在回答这个问题。
如果专家意见不一,只需在答案本身中呈现他们的不同立场作为替代方案(例如,'有些人可能会争辩... 其他人可能会争辩...')。
请用 ANSWER: 开始你的回答。
{{~/user}}
{{#assistant~}}
{{gen 'answer' temperature=0 max_tokens=500}}
{{~/assistant}}''')
experts(query='生命的意义是什么?')
你可以使用隐藏块来隐藏一些对后续生成不需要的对话历史:
prompt = guidance(
'''{{#system~}}
你是一个有用的助手。
{{~/system}}
{{#block hidden=True~}}
{{#user~}}
请讲一个笑话
{{~/user}}
{{#assistant~}}
{{gen 'joke'}}
{{~/assistant}}
{{~/block~}}
{{#user~}}
下面的笑话好笑吗?为什么或为什么不?
{{joke}}
{{~/user}}
{{#assistant~}}
{{gen 'funny'}}
{{~/assistant}}''')
prompt()
geneach
创建代理你可以结合 await
标签和 geneach
(用于生成列表的标签)轻松创建一个代理:
prompt = guidance(
'''{{#system~}}
你是一个有用的助手
{{~/system}}
{{~#geneach 'conversation' stop=False}}
{{#user~}}
{{set 'this.user_text' (await 'user_text')}}
{{~/user}}
{{#assistant~}}
{{gen 'this.ai_text' temperature=0 max_tokens=300}}
{{~/assistant}}
{{~/geneach}}''')
prompt= prompt(user_text ='嗨,你好')
prompt
注意到对话的下一轮仍然被模板化,并且对话列表的最后一个元素是一个占位符:
prompt['conversation']
[{'user_text': '嗨,你好', 'ai_text': '你好!今天我能为你做些什么?如果你有任何问题或需要帮助,随时提出。'}, {}]
然后我们可以再次执行提示,它会生成下一轮对话:
prompt = prompt(user_text = '生命的意义是什么?')
prompt
在此处查看更复杂的示例。
请参阅此笔记本中的“使用搜索API”示例。
GPT Prompt 提示词工程