新智元报道
编辑:Henry 乔杨新加坡(GovTech)举办了首届GPT-4提示工程竞赛,Sheila Teo很幸运地取得了胜利。
具体操作如下:
(C)上下文:提供任务的上下文信息
这有助于LLM了解正在讨论的具体情景,确保其答复具有相关性。
(O)目标:确定你希望LLM执行的任务是什么
明确你的目标有助于LLM把回答的重点放在实现这一具体目标上。
(S)风格:指明你希望LLM使用的写作风格
这可以是某个名人的写作风格,也可以是某个行业的某个专家,如商业分析专家或首席执行官。这将引导LLM以符合你需求的方式和用词做出回复。
(T)语气:确定回复的态度
这可确保LLM的回复与所需的情感或情绪背景产生共鸣。例如,正式的、幽默的、善解人意的等。
(A)受众:确定回复的对象
根据受众(如某一领域的专家、初学者、儿童等)量身定制LLM的回复,确保其在所需的语境中是恰当的、可以理解的。
(R)回复:提供回复格式
这可确保LLM按照下游任务所需的准确格式输出。例如,列表、JSON、专业报告等。大多数LLM应用程序都会以编程方式LLM回复进行下游操作,对于这些应用程序来说,JSON输出格式是最理想的。
CO-STAR的实际应用下面是一个真实的例子,说明CO-STAR框架为什么有用。假设你是一名社交媒体经理,你需要帮助起草一篇Facebook帖子来宣传公司的新产品。没有CO-STAR的提示工程是这样的:在Facebook上写一篇文章,为我公司的新产品做广告。我的公司名为Alpha,产品名为Beta,是一种新型超快速吹风机。下面是GPT-4的输出结果:介绍Alpha公司革命性的Beta吹风机!
- 告别冗长乏味的吹发过程!阿尔法隆重推出贝塔型吹风机,这是我们在护发技术方面的最新创新。
- 超快吹干:得益于先进、强劲的电机,Beta可以将你的吹干时间缩短一半。让你更快做好准备,有更多时间做自己喜欢的事情!
这种输出方式虽然够用,但却非常普通,缺乏必要的细微差别和有针对性的吸引力,无法引起公司受众的共鸣。
下面是一个使用CO-STAR模板的示例,它提醒你将任务的其他方面融入你的提示中,特别是之前的快速提示中缺少的「风格」、「语气」和「受众」方面:#上下文#我想为我公司的新产品做广告。我的公司名叫Alpha,产品名叫Beta,是一种新型超快吹风机。通过应用CO-STAR,GPT-4的回复变得更有针对性、更有效:
#目标#为我创建一个Facebook帖子,目的是让人们点击产品链接购买它。
#风格#效仿戴森等宣传类似产品的成功公司的写作风格。
#语气#有说服力的。
#受众#我公司在Facebook上的受众通常是老一代人。请针对这部分受众通常对美发产品的要求,量身定制你的帖子。
#回复#Facebook上的帖子,简明扼要而又富有感染力。
用Alpha Beta拥抱轻松优雅--智慧一代的超快吹风机。
使用Alpha Beta,重新找回简单有效的护发乐趣。我们的最新创新产品不仅仅是一款吹风机,它还是一个承诺,为那些热爱生活的人提供快速、轻柔、可靠的头发造型。
- 简单直观:告别复杂的小工具。Alpha Beta为舒适和简便而设计,非常适合那些看中直接、无忧技术的人。
- 省心技术:我们知道你的时间非常宝贵。因此,Alpha Beta可以大大缩短吹干时间,让你有更多时间享受生活的乐趣。使用Alpha Beta,让每一天都成为美好的一天。体验精致与简约的完美融合。
CO-STAR框架指导你有条不紊地向LLM提供有关任务的所有关键信息,确保根据你的需求提供量身定制的优化回复。
2. 使用分隔符将提示词分段
>>> >>>
以上示例使用分隔符####进行分节,分节标题EXAMPLE CONVERSATIONS(示例对话)和EXAMPLE OUTPUTS(示例输出)用大写字母区分。序言指出,要分类的对话被分在<<<CONVERSATIONS>>>内,这些对话随后在提示的底部提供给LLM,但没有任何解释性文字,但由于分隔符<<< and>>>的存在,LLM明白这些是它应该分类的对话。下面是GPT-4的输出结果,其中给出了情感分类,但没有像我们要求的那样输出任何其他前言文本:将<<<CONVERSATIONS>>中每段对话的情绪分类为「积极」或「消极」。给出情感分类,无需任何其他前言文本。
###
对话示例
[Agent]:早上好,有什么能帮你的吗?
[顾客]:这个产品太糟糕了,和广告上说的完全不一样!
[顾客]:我非常失望,希望全额退款。
[Agent]:早上好,有什么可以帮你?
[顾客]:你好,我只想说你们的产品留下了深刻印象。它超出了我的预期!
###
输出示例
「消极」
「积极」
###
<<<
[Agent]:你好,欢迎来到我们的支持中心。有什么可以帮你的吗?
[顾客]:你好!我只是想让你们知道我收到了我的订单,而且太棒了。
[Agent]:很高兴听到这个消息!我们很高兴你对购买的产品感到满意。还有什么需要我帮忙的吗?
[顾客]:没有了。我只想给你一些积极的反馈。谢谢你们的优质服务。
[Agent]:你好,感谢你的联系。有什么可以帮你?
[顾客]:我对最近购买的产品非常失望。和我预期的完全不一样。
[Agent]:很遗憾听到这个消息。能否请你提供更多详细信息,以便我提供帮助?
[顾客]:产品质量很差,而且到货很晚。我真的不满意。
>>>
「积极」
「消极」
将分隔符用作XML标签
使用分隔符的另一种方法是将其作为XML标签。XML标签是用角括号括起来的带有开头和结尾的标签。<tag>和</tag>就是一个例子。
这种方法很有效,因为LLM已经接受过大量XML网页内容的训练,并学会了理解其格式。下面是同样的提示,但结构上使用XML标签作为分隔符:根据给出的示例,将以下对话的情感分为两类。在没有任何其他前言文本。
<类>
积极
消极
</类>
<对话示例>
[Agent]:早上好,有什么可以帮你?
[顾客]:这个产品太糟糕了,和广告上说的完全不一样!
[顾客]:我非常失望,希望全额退款。
[Agent]:早上好,有什么可以帮你?
[顾客]:你好,我只想说你们的产品留下了深刻印象。它超出了我的预期!
</对话示例>
<示例类>
积极
消极
</示例类>
<对话>
[Agent]:你好!欢迎来到我们的支持中心。有什么可以帮你?
[顾客]:你好!我只是想让你们知道我收到了我的订单,而且太棒了。
[Agent]:很高兴听到这个消息!还有什么需要我帮忙的吗?
[顾客]:没有了。我只想给你一些积极的反馈。谢谢你们的优质服务!
[Agent]:你好,感谢你的联系。有什么可以帮你?
[顾客]:我对最近购买的产品非常失望。和我预期的完全不一样。
[Agent]:很遗憾听到这个消息。能否请你提供更多详细信息,以便我提供帮助?
[顾客]:产品的质量很差,而且很晚才送到。我对这次经历非常不满意。
</对话>
在XML标签中,使用与你在说明中用来描述它们的词相同的名词,是有好处的。
用给出的例子,将以下对话的情感分为两类,不要使用任何其他序言文本。其中我们使用了名词「对话」、「分类」和「示例」。因此,我们用作分隔符的XML标签是<对话>、<类>、<示例-对话> 和 <示例-类>,确保LLM理解你的指令与用作分隔符的XML标签之间的关系。同样,通过使用分隔符,以清晰、有条理的方式对指令进行分段,可确保GPT-4按你希望的方式作出回复:
「积极」
「消极」
3. 使用LLM护栏创建系统提示
「系统提示」和 「系统消息」是通过聊天完成API以编程方式与ChatGPT进行交互时使用的术语。
另一方面,「自定义指令」是通过ChatGPT用户界面与ChatGPT交互时使用的术语。
你将使用此文本回答问题:「插入文本」。你将以这种格式回复一个JSON对象:{「问题」:「答案」}。如果文本中没有足够的信息来回答问题,请不要编造信息,并将答案填写为 「NA」。你只能回答与「插入范围」相关的问题。切勿回答任何与年龄、性别和宗教信仰等人口统计信息相关的问题。
在这种情况下,聊天的每个用户提示都是你希望使用文本回答的问题。例如,用户提示可能是「文本是关于什么的」而LLM会回答{文本是关于什么的?文本是关于......}。但是,让我们进一步概括这个任务示例。在这种情况下,我们可以将上述系统提示的第一行编辑为:你将使用此文本回答问题:[插入文本]。
你将以这种格式回复一个JSON对象:{「问题」:「答案」}。
现在,聊天的每个用户提示,都会包括要回答问题的文本和要回答的问题,例如:[插入文本]:在这里,我们还使用XML标签作为分隔符,以便有条理地向LLM提供所需的2条信息。XML标签「文本」和「问题」中使用的名词,与系统提示中使用的名词相对应,这样LLM就能理解标签与系统提示指令之间的关系。总之,系统提示应给出总体任务指令,而每个用户提示应提供你需要任务执行的具体细节。在本例中,这些具体内容就是文本和问题。你将使用此文本回答问题:[插入文字]。
至
你将使用提供的文本回答问题。
4. 仅使用LLM(无需插件或代码)分析数据集
你可能听说过OpenAI在ChatGPT的GPT-4中推出的高级数据分析插件,高级(付费)账户可以使用该插件。
它允许用户将数据集上传到ChatGPT,并直接在数据集上运行代码,从而进行精确的数据分析。
但你知道吗,使用LLM分析数据集并不一定需要这样的插件?让我们先来了解一下单纯使用LLMs分析数据集的优势和局限性。
提示:
#上下文#
我是卖酒的。我有一个关于客户信息的数据集:[出生年份、婚姻状况、收入、孩子数量、距上次购买的天数、消费金额]。
#############
#目标#
我希望你利用这个数据集将我的客户分组,然后告诉我如何针对每个组别开展营销活动。请按以下步骤操作,不要使用代码:
1. 聚类:使用数据集的列对数据集的行进行聚类,使同一聚类中的客户具有相似的列值,而不同聚类中的客户具有明显不同的列值。确保每一行只属于一个聚类。
对于找到的每个聚类:
2. CLUSTER_INFORMATION:根据数据集列描述聚类。
3. 聚类名称:解释[CLUSTER_INFORMATION]以获得该聚类客户的简短名称。
4. marketing_ideas:产生向该客户聚类推销我的产品的想法。
5. RATIONALE:解释为什么[MARKETING_IDEAS]与该客户聚类相关且有效。
#############
#风格#
商业分析报告
#############
#语气#
专业、技术
#############
#受众#
我的商业伙伴。让他们相信你的营销策略是经过深思熟虑的,并有充分的数据支持。
#############
#回复:markdown报告#
<对于[CLUSTERS]>中的每个聚类
- 客户聚类:[CLUSTER_NAME]
- 简介:[CLUSTER_INFORMATION]
- 营销理念:[RATIONALE]
- 原因:[RATIONALE]
<附件>
列出属于每个聚类的行号列表,以支持你的分析。使用这些表头:[[CLUSTER_NAME],行列表]。
#############
#开始分析#
如果你能理解,请向我索要我的数据集。
LLM擅长完成简单的任务,但对于复杂的任务就不那么擅长了。因此,对于像这样的复杂任务,重要的是要把任务分解成简单的步骤说明,让LLM遵循。这样做的目的是,向LLM提供你自己执行任务时会采取的步骤。
在本例中,步骤如下:
不要简单地把总体任务交给LLM,而是让它「把客户分成几组,然后就如何向每组客户进行营销提出想法」。请按以下步骤操作,不要使用代码:
1. CLUSTERS:使用数据集的列对数据集的行进行聚类,使同一聚类中的客户具有相似的列值,而不同聚类中的客户具有明显不同的列值。确保每一行只属于一个聚类。
对于找到的每个聚类
2. CLUSTER_INFORMATION:根据数据集列描述聚类。
3. CLUSTER_NAME:解释[CLUSTER_INFORMATION]以获得该聚类客户的简短名称。
4. MARKETING_IDEAS:产生向该客户聚类推销我的产品的想法。
5. RATIONALE:解释为什么[MARKETING_IDEAS]与该客户聚类相关且有效。
有了循序渐进的指导,LLM就更有可能取得正确的结果。
事实上,你甚至可以随后要求ChatGPT以可下载文件的形式提供报告,以便你在撰写最终报告时参考其答复。 技巧 4:将任务指令与数据集分开你会注意到,在第一个提示中,我们从未将数据集交给LLM。相反,提示中只给出了数据集分析的任务说明,并将其添加到了底部:#回复:markdown报告#
<对于[CLUSTERS]>中的每个聚类
- 客户聚类:[CLUSTER_NAME]
- 简介:[CLUSTER_INFORMATION]
- 营销理念:[MARKETING_IDEAS]
- 原因:[RATIONALE]
<附件>
列出属于每个聚类的行号列表,以支持你的分析。使用这些表头:[[CLUSTER_NAME],行列表]。
ChatGPT随后回复说它能理解,我们在下一个提示中将数据集作为CSV字符串传递给它:#开始分析#
如果你能理解,请向我检索我的数据集。