去年 11 月 8 日,新加坡政府科技局(GovTech)组织举办了首届 GPT-4 提示工程(Prompt Engineering)竞赛。数据科学家 Sheila Teo 最终夺冠,成为最终的提示女王(Prompt Queen)。之后,Teo 发布了一篇题为《我如何赢得了新加坡 GPT-4 提示工程赛》的博客文章,慷慨分享了其获胜法门。机器之心对这篇文章进行了不改变原义的翻译与整理,以帮助我们的读者同样成为 LLM 提示工程达人。
以下是博客原文内容。
上个月,我非常荣幸地赢得了新加坡首届 GPT-4 提示工程竞赛;该竞赛由新加坡政府科技局组织,汇聚了 400 多名优秀的参赛者。
提示工程是一门融合了艺术和科学的学科 —— 它既需要对技术的理解,也需要创造力和战略思维。这篇文章汇编了我一路以来学习到的提示工程策略,这些策略能让 LLM 切实完成你想完成的恣意并做到更多!
作者注:写作本文时,我试图摆脱已在网上被广泛讨论和整理成文档的传统提示工程技术。相反,我的目标是分享我通过实验学习到的新见解以及对理解和处理某些技术的一些不同的个人看法。希望你会喜欢这篇文章!
本文包含以下内容,其中 🔵 是指适合初学者的提示工程技术,而 🔴 是指进阶技术。
1. [🔵] 利用 CO-STAR 框架来搭建 prompt 的结构
2. [🔵] 利用分隔符为 prompt 设置分节
3. [🔴] 利用 LLM 防护围栏创建系统 prompt
4. [🔴] 仅利用 LLM 综合数据集,不利用插件或代码 —— 附带一个实操示例:利用 GPT-4 综合一个真实的 Kaggle 数据集。
1. [🔵] 利用 CO-STAR 框架来搭建 prompt 的结构
为了让 LLM 给出最优相应,为 prompt 设置有效的结构至关重要。CO-STAR 框架是一种可以方便用于设计 prompt 结构的模板,这是新加坡政府科技局的数据科学与 AI 团队的创意成果。该模板考虑了会影响 LLM 相应的有效性和相关性的方方面面,从而有助于得到更优的相应。
CO-STAR 框架
其工作方式为:
(C) 上下文(Context):供应与恣意有关的背景信息。这有助于 LLM 理解正在讨论的具体场景,从而确保其相应是相关的。
(O) 目标(Objective):定义你希望 LLM 执行的恣意。明晰目标有助于 LLM 将自己相应重点放在完成具体恣意上。
(S) 风格(Style):指定你希望 LLM 利用的写作风格。这可能是一位具体名人的写作风格,也可以是某种职业专家(比如商业综合师或 CEO)的风格。这能引导 LLM 利用符合你需求的方式和词语给出相应。
(T) 语气(Tone):设定相应的态度。这能确保 LLM 的相应符合所需的情感或情绪上下文,比如正式、幽默、善解人意等。
(A) 受众(Audience):确定相应的目标受众。针对具体受众(比如领域专家、初学者、孩童)定制 LLM 的相应,确保其在你所需的上下文中是适当的和可被理解的。
(R) 相应(Response):供应相应的格式。这能确保 LLM 输入你的下游恣意所需的格式,比如列表、JSON、专业报告等。对于大多数通过程序化方法将 LLM 相应用于下游恣意的 LLM 应用而言,理想的输入格式是 JSON。
CO-STAR 的一个实际应用
这里通过一个实际案例说明 CO-STAR 为什么有用。假设你是一位社交媒体管理者,你需要帮助草拟一篇 Facebook 帖文,其內容是宣传你公司的新产品。
如果不利用 CO-STAR,那么你可能会利用这样的 prompt:
Write a facebook post to advertise my company’s new product. My company’s name is Alpha and the product is called Beta, a new ultra-fast hairdryer.
GPT-4 的输入如下:
Introducing the Revolutionary Beta Hairdryer by Alpha!
– Say goodbye to long, tedious hair drying sessions! Alpha is proud to unveil the Beta, our latest innovation in haircare technology.
– Ultra-Fast Drying: The Beta is designed to cut your drying time in half, thanks to its advanced, powerful motor. Get ready faster and enjoy more time doing what you love!
Shop Now: [Link to product page]
这个结果也许够用了,但却只是泛泛而谈,缺乏具体的细节和有针对性的吸引力,而这些是吸引目标受众所必需的。
那如果利用 CO-STAR 模板呢?CO-STAR 会提醒你将恣意涉及的其它方面也整合进 prompt 之中,具体来说就是上面的简单 prompt 中缺失的 STYLE、TONE、AUDIENCE 方面:
# CONTEXT #
I want to advertise my company’s new product. My company’s name is Alpha and the product is called Beta, which is a new ultra-fast hairdryer.
# OBJECTIVE #
Create a Facebook post for me, which aims to get people to click on the product link to purchase it.
# STYLE #
Follow the writing style of successful companies that advertise similar products, such as Dyson.
# TONE #
Persuasive
# AUDIENCE #
My company’s audience profile on Facebook is typically the older generation. Tailor your post to target what this audience typically looks out for in hair products.
# RESPONSE #
The Facebook post, kept concise yet impactful.
通过利用 CO-STAR,GPT-4 的相应会变得明显更有针对性、效果更好:
Embrace Effortless Elegance with Alpha Beta — The Ultra-Fast Hairdryer for the Wise Generation.
Rediscover the joy of simple, effective hair care with Alpha Beta. Our latest innovation is more than just a hairdryer; it’s a promise of swift, gentle, and reliable hair styling for those who appreciate the finer things in life.
– Easy and Intuitive Use: Say goodbye to complicated gadgets. Alpha Beta is
crafted for comfort and simplicity, perfect for those who value straightforward,
hassle-free technology.
– Time-Saving Technology: We understand your time is precious. That’s why Alpha Beta cuts down drying time significantly, giving you more moments to enjoy life’s pleasures.
Make every day a good hair day with Alpha Beta. Experience the blend of sophistication and simplicity today.
[Your Product Link Here]
CO-STAR 框架能引导用户以一种结构化的方式向 LLM 供应有关你的恣意所有关键信息,从而确保得到完全符合你的需求的定制化的更优的相应。
2. [🔵] 利用分隔符为 prompt 设置分节
图片由 DALL・E 3 生成
分隔符是一种特殊 token,可帮助 LLM 分辨 prompt 的哪些部分应被视为单个含义单元。这很重要,因为输入 LLM 的整个 prompt 是单个的 token 长序列。分隔符能将 prompt 中不同部分隔离开,从而为这个 token 序列供应结构,让其中各个部分能被区别对待。
需要说明的是,如果恣意很简单,那么分隔符对 LLM 的相应质量的影响不大。但是,恣意越复杂,利用分隔符分节对 LLM 相应的影响就越大。
用特殊字符当分隔符
分隔符可以利用任何通常不会同时出现的特殊字符序列,举些例子:###、===、>>>
特殊字符的数量和类型并不重要,只要它们足够独特即可,这样才能让 LLM 将它们理解成内容分隔符,而不是普通的标点符号。
下面通过一个例子说明如何在 prompt 中利用分隔符:
Classify the sentiment of each conversation in <<<CONVERSATIONS>>> as
‘Positive’ or ‘Negative’. Give the sentiment classifications without any other preamble text.
###
EXAMPLE CONVERSATIONS
[Agent]: Good morning, how can I assist you today?
[Customer]: This product is terrible, nothing like what was advertised!
[Customer]: I’m extremely disappointed and expect a full refund.
[Agent]: Good morning, how can I help you today?
[Customer]: Hi, I just wanted to say that I’m really impressed with your
product. It exceeded my expectations!
EXAMPLE OUTPUTS
Negative
Positive
###
<<<
[Agent]: Hello! Welcome to our support. How can I help you today?
[Customer]: Hi there! I just wanted to let you know I received my order, and
it’s fantastic!
[Agent]: That’s great to hear! We’re thrilled you’re happy with your purchase.
Is there anything else I can assist you with?
[Customer]: No, that’s it. Just wanted to give some positive feedback. Thanks
for your excellent service!
[Agent]: Hello, thank you for reaching out. How can I assist you today?
[Customer]: I’m very disappointed with my recent purchase. It’s not what I expected at all.
[Agent]: I’m sorry to hear that. Could you please provide more details so I can help?
[Customer]: The product is of poor quality and it arrived late. I’m really
unhappy with this experience.
>>>
上面例子中利用的分隔符是 ###,同时每一节都带有完全大写的标题以示区分,如 EXAMPLE CONVERSATIONS 和 EXAMPLE OUTPUTS。前置说明部分陈述了要分类的对话是在 <<<CONVERSATIONS>>> 中,这些对话是在 prompt 末尾供应,也不带任何解释说明文本,但由于有了 <<< 和 >>> 这样的分隔符,LLM 就能理解这就是要分类的对话。
GPT-4 对此 prompt 给出的输入如下,其给出的情感分类结果不带任何附加文本,这符合我们的要求:
Positive
Negative
用 XML 标签当分隔符
另一种方法是利用 XML 标签作为分隔符。XML 标签是利用尖括号括起来的成对标签,包括开始和结束标签。比如 <tag> 和 </tag>。这很有效,因为 LLM 在训练时就看过了大量用 XML 标注的网络内容,已经学会了理解其格式。
下面用 XML 标签作为分隔符重写上面的 prompt:
Classify the sentiment of the following conversations into one of two classes, using the examples given. Give the sentiment classifications without any other
preamble text.
<classes>
Positive
Negative
</classes>
<example-conversations>
[Agent]: Good morning, how can I assist you today?
[Customer]: This product is terrible, nothing like what was advertised!
[Customer]: I’m extremely disappointed and expect a full refund.
[Agent]: Good morning, how can I help you today?
[Customer]: Hi, I just wanted to say that I’m really impressed with your
product. It exceeded my expectations!
</example-conversations>
<example-classes>
Negative
Positive
</example-classes>
<conversations>
[Agent]: Hello! Welcome to our support. How can I help you today?
[Customer]: Hi there! I just wanted to let you know I received my order, and
it’s fantastic!
[Agent]: That’s great to hear! We’re thrilled you’re happy with your purchase.
Is there anything else I can assist you with?
[Customer]: No, that’s it. Just wanted to give some positive feedback. Thanks
for your excellent service!
[Agent]: Hello, thank you for reaching out. How can I assist you today?
[Customer]: I’m very disappointed with my recent purchase. It’s not what I
expected at all.
[Agent]: I’m sorry to hear that. Could you please provide more details so I
can help?
[Customer]: The product is of poor quality and it arrived late. I’m really
unhappy with this experience.
</conversations>
为了达到更好的效果,在 XML 标签中利用的名词应该与指令中用于描述它们的名词一样。在上面的 prompt 中,我们给出的指令为:
Classify the sentiment of the following conversations into one of two classes, using the examples given. Give the sentiment classifications without any other preamble text.
其中利用的名词有 conversations、classes 和 examples。也因此,后面的分隔 XML 标签就对应为 <conversations>、<classes>、<example-conversations> 和 <example-classes>。这能确保 LLM 理解指令与 XML 标签的关联。
同样的,利用这样的分隔符能以清晰的结构化方式对 prompt 进行分节,从而确保 GPT-4 输入的内容就刚好是你想要的结果:
Positive
Negative
3. [🔴] 利用 LLM 防护围栏创建系统提示
在深入之前,需要指出这一节的内容仅适用于具有 System Prompt(系统提示)功能的 LLM,而本文其它章节的内容却适用于任意 LLM。当然,具有这一功能的最著名 LLM 是 ChatGPT,因此这一节将利用 ChatGPT 作为示例进行说明。
图像由 DALL・E 3 生成
与 System Prompts 有关的术语
首先,我们先把术语搞清楚:对于 ChatGPT,有大量资源利用 System Prompts、System Messages 和 Custom Instructions 这三个术语,而且很多时候它们的意思似乎差不多。这给很多人(包括我)带来了困扰,以至于让 OpenAI 都专门发了一篇文章来解释这些它们。简单总结一下:
System Prompts 和 System Messages 是通过 ChatGPT 的 Chat Completions API 以程序化方式利用该 LLM 时利用的术语。
另一方面,Custom Instructions 是通过 https://chat.openai.com/ 的用户界面利用 ChatGPT 时的术语。
图片来自 Enterprise DNA 博客
不过整体而言,这三个术语指代的是同一对象,因此请不要过多纠结于此!我们这一节将利用 System Prompts 这个术语。现在继续深入吧!
System Prompts 是什么?
System Prompts 是指附加的额外 prompt,其作用是指示 LLM 理应的行为方式。之所以说这是额外附加的,是因为它位于「普通」prompt(也被称为用户 prompt)之外。
在一组聊天中,每一次你都要供应一个新的 prompt,System Prompts 的作用就像是一个 LLM 会自动应用的过滤器。这意味着,在一组聊天中,LLM 每次相应都要考虑 System Prompts。
应在何时利用 System Prompts?
你脑袋冒出的第一个问题可能是:我为什么应该在 System Prompts 中供应指令,毕竟我可以在一组聊天的第一个 prompt 中供应这些指令?
答案是因为 LLM 的对话记忆有局限。如果在一组对话的第一个 prompt 中供应这些指令,随着对话的进行,LLM 可能会「遗忘」你供应的第一个 prompt,其中的指令也就失效了。
另一方面,如果在 System Prompts 中供应这些指令,那么 LLM 就会自动将其与新的 prompt 一起纳入考量。这能确保随着对话进行,LLM 能持续接收这些指令,无论聊天变得多长。
总结一下:利用 System Prompts 供应你希望 LLM 在整个聊天过程中全程记住的指令。
System Prompts 应包含什么内容?
System Prompts 中的指令通常包含以下类别:
恣意定义,这样 LLM 在聊天过程中能一直记得要做什么。
输入格式,这样 LLM 能一直记得自己应该如何相应。
防护围栏,这样 LLM 能一直记得自己不应该如何相应。防护围栏(Guardrails)是 LLM 治理方面一个新兴领域,是指为 LLM 配置的可运行操作的边界。
举个例子,System Prompt 可能是这样的:
You will answer questions using this text: [insert text].
You will respond with a JSON object in this format: {“Question”: “Answer”}.
If the text does not contain sufficient information to answer the question, do not make up information and give the answer as “NA”.
You are only allowed to answer questions related to [insert scope]. Never answer any questions related to demographic information such as age, gender, and religion.
其中每部分的类别如下:
对上述 System Prompt 的分解
那么「普通」prompt 又该包含哪些内容呢?
现在你可能会想:看起来 System Prompt 中已经给出了大量信息。那么我们又该在「普通」prompt(也称为用户 prompt)中放什么内容?
System Prompt 会大致描述恣意概况。在上面的 System Prompt 示例中,恣意被定义为仅利用特定的文本进行问答,并指示 LLM 以 {"Question": "Answer"} 的格式进行相应。
You will answer questions using this text: [insert text].
You will respond with a JSON object in this format: {“Question”: “Answer”}.
在这个案例中,聊天中的每个用户 prompt 都只是你希望得到文本解答的问题。举个例子,用户 prompt 可能是这样「What is the text about?」。而 LLM 的相应会是这样:{"What is the text about?": "The text is about…"}。
但我们可以进一步泛化这个示例恣意。在实践中,你更可能会有多个希望得到解答的问题,而不只是一个。在这个案例中,我们可以将上述 System Prompt 的第一行从
You will answer questions using this text: [insert text].
改成
You will answer questions using the provided text.
现在,每个用户 prompt 中都既包含执行问答所基于的文本,也包含所要回答的问题。
<text>
[insert text]
</text>
<question>
[insert question]
</question>
这里,我们依然利用 XML 标签作为分隔符,以一种结构化的方式为 LLM 供应这两段所需信息。此处 XML 标签中利用的名词是 text 和 question,对应于 System Prompt 中利用的名词,这样一来 LLM 就能理解这些标签与 System Prompt 指令有何关联。
总结起来,System Prompt 应能给出整体的恣意指令,而每个用户 prompt 应供应你希望执行恣意时利用的确切细节。比如在这个案例中,这个确切的细节是文本和问题。
另:让 LLM 防护围栏变得动态化
在上面,防护围栏是通过 System Prompt 中的几句话添加的。然后,这些防护围栏在聊天的整个过程中就不变了。那如果你希望在对话的不同位置利用不同的防护围栏呢?
不幸的是,对于 ChatGPT 用户界面的用户,目前还没有能做到这一点的简单方法。但是,如果你通过编程方法与 ChatGPT 交互,你就很幸运了!现在人们对构建有效的 LLM 防护围栏的兴趣越来越大,有研究者开发了一些开源软件包,可让用户能以编程方式设置远远更加细节和动态的防护围栏。
英伟达团队开发的 NeMo Guardrails 尤其值得注意,这能让用户配置与 LLM 之间的期望对话流,从而在聊天的不同位置设置不同的防护围栏,实现随聊天不断演进的动态防护围栏。我强烈建议你研究看看!
4. [🔴] 仅利用 LLM 综合数据集,不利用插件或代码
图像由 DALL・E 3 生成
你可能听说过 OpenAI 为 GPT-4 版本的 ChatGPT 供应的 Advanced Data Analysis(高级数据综合)插件 —— 高级(付费用户)可以利用。这让用户可以向 ChatGPT 上传数据集,然后直接在数据集上运行代码,实现精准的数据综合。
但你知道吗,其实不利用这样的插件也能让 LLM 综合数据集?我们首先了解一下完全利用 LLM 综合数据集的优势和局限。
LLM 不擅长的数据集综合类型
你可能已经知道,LLM 执行准确数学计算的能力有限,这使得它们不适合需要对数据集进行精确定量综合的恣意,比如:
描述性统计数值计算:以定量方式总结数值列,利用的度量包括均值或方差。
相关性综合: 获得列之间的精确相关系数。
统计综合:比如假设测试,可以确定不同数据点分组之间是否存在统计学上的显著差异。
机器学习:在数据集上执行预测性建模,可以利用的方法包括线性回归、梯度提升树或神经网络。
正是为了在数据集上执行这样的定量综合恣意,OpenAI 才做了 Advanced Data Analysis 插件,这样才能借助编程语言来为这些恣意在数据集上执行代码。
那么,为什么还需要不利用插件、仅利用 LLM 来综合数据集呢?
LLM 擅长的数据集综合类型
LLM 擅长识别模式和趋势。这种能力源自 LLM 训练时利用的大量多样化数据,这让它们可以识别出可能并不显而易见的复杂模式。
这让他们非常适合处理基于模式发现的恣意,比如:
异常检测:基于一列或多列数值识别偏离正常模式的异常数据点。
聚类:基于列之间的相似特征对数据点进行分组。
跨列关系:识别列之间的综合趋势。
文本综合(针对基于文本的列): 基于主题或情绪执行分类。
趋势综合(针对具有时间属性的数据集):识别列之中随时间演进的模式、季节变化或趋势。
对于这些类型的基于模式的恣意,实际上相比于利用代码,仅利用 LLM 可能还能在更短的时间内得到更好的结果。下面通过一个示例来完整演示一番。
仅利用 LLM 来综合 Kaggle 数据集
该示例会利用一个常用的真实世界 Kaggle 数据集,该数据集是为客户个性综合恣意收集整理的,其中的恣意目标是对客户群进行细分,以更好地了解客户。
为了方便后面验证 LLM 的综合结果,这里仅取用一个子集,其中包含 50 行和最相关的列。之后,用于综合的数据集如下所示,其中每一行都代表一个客户,列则描述了客户信息:
数据集的前三行
假设你在该公司的宣传团队工作。你的恣意利用这个客户信息数据集来指导营销工作。这个恣意分为两步:第一步,利用数据集生成有意义的细分客户群。第二步,针对每个细分群生成最好的营销策略。现在,这个问题就成了模式发现(第一步)的实际业务问题,这也正是 LLM 擅长的能力。
下面针对这个恣意草拟一个 prompt,这里用到了 4 种提示工程技术(后面还有更多!):
1. 将复杂恣意分解为简单步骤
2. 索引每一步的中间输入
3. 设置 LLM 的相应的格式
4. 将指令与数据集分离开
System Prompt:
I want you to act as a data scientist to analyze datasets. Do not make up information that is not in the dataset. For each analysis I ask for, provide me with the exact and definitive answer and do not provide me with code or instructions to do the analysis on other platforms.
Prompt:
# CONTEXT #
I sell wine. I have a dataset of information on my customers: [year of birth, marital status, income, number of children, days since last purchase, amount spent].
#############
# OBJECTIVE #
I want you use the dataset to cluster my customers into groups and then give me ideas on how to target my marketing efforts towards each group. Use this step-by-step process and do not use code:
1. CLUSTERS: Use the columns of the dataset to cluster the rows of the dataset, such that customers within the same cluster have similar column values while customers in different clusters have distinctly different column values. Ensure that each row only belongs to 1 cluster.
For each cluster found,
2. CLUSTER_INFORMATION: Describe the cluster in terms of the dataset columns.
3. CLUSTER_NAME: Interpret [CLUSTER_INFORMATION] to obtain a short name for the customer group in this cluster.
4. MARKETING_IDEAS: Generate ideas to market my product to this customer group.
5. RATIONALE: Explain why [MARKETING_IDEAS] is relevant and effective for this customer group.
#############
# STYLE #
Business analytics report
#############
# TONE #
Professional, technical
#############
# AUDIENCE #
My business partners. Convince them that your marketing strategy is well thought-out and fully backed by data.
#############
# RESPONSE: MARKDOWN REPORT #
<For each cluster in [CLUSTERS]>
— Customer Group: [CLUSTER_NAME]
— Profile: [CLUSTER_INFORMATION]
— Marketing Ideas: [MARKETING_IDEAS]
— Rationale: [RATIONALE]
<Annex>
Give a table of the list of row numbers belonging to each cluster, in order to back up your analysis. Use these table headers: [[CLUSTER_NAME], List of Rows].
#############
# START ANALYSIS #
If you understand, ask me for my dataset.
GPT-4 的回复如下,我们继续以 CSV 字符串的形式向其传递数据集。
GPT-4 的相应结果
之后,GPT-4 以我们要求的 markdown 报告格式回复其综合结果:
GPT-4 的相应结果
验证 LLM 的综合结果
为了简单起见,我们将选取 LLM 生成的 2 个客户群来进行验证,即年轻家庭(Young Families)和高品位爱好者(Discerning Enthusiasts)。
年轻家庭
LLM 综合出的人群画像:1980 年后出生,已婚或同居,中低收入,频繁进行小额购买。
被 LLM 聚类到这一分组的行:3, 4, 7, 10, 16, 20
深入研究这些数据集,这些行的完整数据为:
年轻家庭的完整数据
其刚好对应于 LLM 识别出的人群画像。它甚至能在不事先预处理的情况下聚类空值行!
高品位爱好者
LLM 综合出的人群画像:年轻范围广,任意婚姻状况,高收入,不同的子女情况,购物支出高。
被 LLM 聚类到这一分组的行:2, 5, 18, 29, 34, 36
深入研究这些数据集,这些行的完整数据为:
高品位爱好者的完整数据
这同样与 LLM 识别出的人群画像非常符合!
这个例子彰显了 LLM 发现模式的能力,其能从多维度的数据集中解读和提炼出有意义的见解,这能确保其综合深深植根于数据集的事实真相。
如果利用 ChatGPT 的高级数据综合插件呢?
为了完整比较,我利用同样的 prompt 尝试了同样的恣意,但是让 ChatGPT 利用代码执行综合,这会激活其高级数据综合插件。这里的思路是让插件直接在数据集上运行 k – 均值聚类等聚类算法的代码,从而得到每个客户群,之后再合成每个聚类的人群画像,以供应营销策略。
但是,多次尝试都得到了以下报错信息,并没有输入,尽管这个数据集只有 50 行:
第一次尝试的报错信息,没有输入
第二次尝试的报错信息,没有输入
目前而言,利用高级数据综合插件只能执行更简单的数据集恣意,比如计算描述性统计信息或创建图表,但需要算法的更高级恣意有时可能会遭遇报错,无法得到输入结果,原因可能是计算限制等问题。
那么 LLM 适合在什么时候用来综合数据集?
答案是取决于综合的类型。
对于需要精准数学计算或基于规则的复杂处理的恣意,常规的编程方法依然更优。
对于基于模式识别的恣意,利用常规的编程和算法方法可能很困难且非常耗时。而 LLM 擅长这些恣意,而且甚至还能供应额外的输入,比如用于支撑其综合结果的附加说明,以 markdown 格式编写完整的综合报告。
最终,决定是否利用 LLM,取决于当前恣意的性质以及 LLM 的模式识别能力与传统编程技术供应的精确性和针对性之间的权衡。
现在回到提示工程!
本章节最后,我们回到用于生成数据集综合的 prompt,分解一下其中利用的关键性提示工程技术:
Prompt:
# CONTEXT #
I sell wine. I have a dataset of information on my customers: [year of birth, marital status, income, number of children, days since last purchase, amount spent].
#############
# OBJECTIVE #
I want you use the dataset to cluster my customers into groups and then give me ideas on how to target my marketing efforts towards each group. Use this step-by-step process and do not use code:
1. CLUSTERS: Use the columns of the dataset to cluster the rows of the dataset, such that customers within the same cluster have similar column values while customers in different clusters have distinctly different column values. Ensure that each row only belongs to 1 cluster.
For each cluster found,
2. CLUSTER_INFORMATION: Describe the cluster in terms of the dataset columns.
3. CLUSTER_NAME: Interpret [CLUSTER_INFORMATION] to obtain a short name for the customer group in this cluster.
4. MARKETING_IDEAS: Generate ideas to market my product to this customer group.
5. RATIONALE: Explain why [MARKETING_IDEAS] is relevant and effective for this customer group.
#############
# STYLE #
Business analytics report
#############
# TONE #
Professional, technical
#############
# AUDIENCE #
My business partners. Convince them that your marketing strategy is well thought-out and fully backed by data.
#############
# RESPONSE: MARKDOWN REPORT #
<For each cluster in [CLUSTERS]>
— Customer Group: [CLUSTER_NAME]
— Profile: [CLUSTER_INFORMATION]
— Marketing Ideas: [MARKETING_IDEAS]
— Rationale: [RATIONALE]
<Annex>
Give a table of the list of row numbers belonging to each cluster, in order to back up your analysis. Use these table headers: [[CLUSTER_NAME], List of Rows].
#############
# START ANALYSIS #
If you understand, ask me for my dataset.
技术 1:将复杂恣意分解为简单步骤
LLM 擅于执行简单恣意,并不很擅长复杂恣意。因此,对于这样的复杂恣意,一种很好的做法是将其分解成简单的逐步指示,以便 LLM 遵从。这里的思路是为 LLM 供应你希望采取的步骤。
在这个案例中,给出步骤的方式为:
Use this step-by-step process and do not use code:
1. CLUSTERS: Use the columns of the dataset to cluster the rows of the dataset, such that customers within the same cluster have similar column values while customers in different clusters have distinctly different column values. Ensure that each row only belongs to 1 cluster.
For each cluster found,
2. CLUSTER_INFORMATION: Describe the cluster in terms of the dataset columns.
3. CLUSTER_NAME: Interpret [CLUSTER_INFORMATION] to obtain a short name for the customer group in this cluster.
4. MARKETING_IDEAS: Generate ideas to market my product to this customer group.
5. RATIONALE: Explain why [MARKETING_IDEAS] is relevant and effective for this customer group.
这里并没有直接简单地给 LLM 供应一个整体的恣意描述,比如「将客户聚类成不同的客户群,然后针对每个客户群给出营销见解。」
通过利用逐步指示,LLM 更有可能给出正确结果。
技术 2:索引每一步的中间输入
在为 LLM 供应逐步过程时,我们给出了每一步的中间输入结果,其中用的大写变量名指代,即 CLUSTERS、CLUSTER_INFORMATION、CLUSTER_NAME、MARKETING_IDEAS 和 RATIONALE。
利用大写可以将这些变量名与指令主体区分开。然后,可以通过加方括号的形式 [变量名] 索引这些中间输入。
技术 3:设置 LLM 的相应的格式
这里我们要求输入 markdown 报告格式,这能美化 LLM 的相应结果。在这里,中间输入的变量名再次派上用场,可以更方便地指定报告的结构。
# RESPONSE: MARKDOWN REPORT #
<For each cluster in [CLUSTERS]>
— Customer Group: [CLUSTER_NAME]
— Profile: [CLUSTER_INFORMATION]
— Marketing Ideas: [MARKETING_IDEAS]
— Rationale: [RATIONALE]
<Annex>
Give a table of the list of row numbers belonging to each cluster, in order to back up your analysis. Use these table headers: [[CLUSTER_NAME], List of Rows].
事实上,你之后也可以让 ChatGPT 供应可下载的报告文件,让其直接完成你的最终报告。
将 GPT-4 的相应保存为一个文件
技术 4:将恣意指令与数据集分离开
可以看到,我们从未在第一个 prompt 中向 LLM 供应数据集。相反,该 prompt 只给出了数据集综合的恣意指令,最后再加上了以下内容:
# START ANALYSIS #
If you understand, ask me for my dataset.
然后,ChatGPT 答复它理解了,然后我们再在下一个 prompt 中以 CSV 字符串的形式将数据集传递给它。
GPT-4 的相应
但为什么要将恣意指令与数据集分离开?
这样做有助于 LLM 清晰理解每一部分,降低遗漏信息的可能性;尤其是当恣意更复杂时,例如例子中这个指令较长的恣意。你可能经历过 LLM「意外遗忘」长 prompt 中某个特定指令的情况,举个例子,如果你让 LLM 给出 100 词的相应,但其反馈的结果却长得多。而如果让 LLM 先接收指令,然后再接收指令处理的数据集,就能让 LLM 先消化其应当做的事情,之后再基于后面供应的数据集来执行它。
请注意,这种指令与数据集分离的操作仅适用于有对话记忆的聊天式 LLM,不适用于没有对话记忆的恣意完成式 LLM。
原文链接:https://towardsdatascience.com/how-i-won-singapores-gpt-4-prompt-engineering-competition-34c195a93d41