我们还年轻,可不想看到这个世界处在毫无自由、隐私的边缘。
上个月,我非常荣幸地在新加坡政府科技局(GovTech)组织的首届 GPT-4 提示工程大赛中脱颖而出,这场比赛吸引了超过 400 名杰出的参与者。
提示工程是一门将艺术与科学巧妙融合的学科 — 它不仅关乎技术的理解,更涉及创造力和战略思考。这里分享的是我在实践中学到的一些提示工程策略,这些策略能够精准地驱动任何大语言模型为你服务,甚至做得更多!
作者的话: 在写作本文时,我特意避开了那些已经广泛讨论和记录的常规提示工程技巧。相反,我更希望分享一些我在实验中获得的新洞见,以及我个人在理解和应用这些技巧时的独到见解。希望你能从中获得乐趣!
本文涵盖以下主题,其中 🔵 代表初学者友好的技巧,而 🔴 代表高级策略。
在使用大语言模型时,有效的提示构建至关重要。CO-STAR 框架,由新加坡政府科技局数据科学与 AI 团队创立,是一个实用的提示构建工具。它考虑了所有影响大语言模型响应效果和相关性的关键因素,帮助你获得更优的反馈。
这里有一个 CO-STAR 框架为何有用的现实案例。
假设你担任社交媒体经理,需要草拟一条 facebook 帖子,用以推广公司的新产品。 未使用 CO-STAR 的快速提示可能是这样的:
这是 GPT-4 的回答:
这一输出虽足够,但显得过于泛化,缺乏必要的细节和针对性吸引力,未能真正触及公司目标受众的心。
下面是一个应用 CO-STAR 模板的示例,它提醒我们在制定提示时,要考虑到任务的其它方面,特别是之前快速提示中缺少的风格
、语调
和受众
:
通过运用 CO-STAR 框架,GPT-4 的响应变得更具针对性和效果:
CO-STAR 框架指引您以有组织的方式提供所有关键任务信息,确保响应完全针对您的需求并进行优化。
分隔符是特殊的符号,它们帮助大语言模型 (LLM) 辨识提示中哪些部分应当被视为一个完整的意义单元。
这非常关键,因为你的提示是作为一个长的 Token 序列一次性传给模型的。通过设置分隔符,可以为这些 Token 序列提供结构,使特定部分得到不同的处理。
需要注意的是,对于简单的任务,分隔符对大语言模型的回应质量可能无显著影响。但是,任务越复杂,合理使用分隔符进行文本分段对模型的反应影响越明显。
分隔符可以是任何不常见组合的特殊字符序列,如:
选择哪种特殊字符并不重要,关键是这些字符足够独特,使得模型能将其识别为分隔符,而非常规标点符号。
这里是一个分隔符使用的示例:
在上述示例中,使用 ###
分隔符来分隔不同的部分,通过大写的章节标题如 对话示例
和 输出示例
进行区分。引言部分说明了要对 {{{CONVERSATIONS}}}
中的对话进行情绪分类,而这些对话在提示的底部给出,没有任何解释文本,但分隔符的存在让模型明白这些对话需要被分类。 GPT-4 的输出正如请求的那样,仅给出情绪分类:
使用 XML 标签作为分隔符是一种方法。XML 标签是被尖括号包围的,包括开启标签和结束标签。例如,{tag}
和{/tag}
。这种方法非常有效,因为大语言模型已经接受了大量包含 XML 格式的网页内容的训练,因此能够理解其结构。
以下是利用 XML 标签作为分隔符对同一提示进行结构化的例子:
在指令中使用的名词与 XML 标签的名词一致,如 conversations
、classes
和 examples
,因此使用的 XML 标签分别是 {conversations}
、{classes}
、{example-conversations}
和 {example-classes}
。这确保了模型能够清晰地理解指令与使用的标签之间的关系。 通过这种结构化的分隔符使用方式,可以确保 GPT-4 精确地按照您的期望响应:
_在开始前,我们需指出,本节内容仅适用于具备系统提示功能的大语言模型 (LLM),与文章中其他适用于所有大语言模型的部分不同。显然,具有此功能的最知名的大语言模型是 chatgpt,因此我们将以 ChatGPT 为例进行说明。_
首先,我们来厘清几个术语:在讨论 ChatGPT 时,这三个术语「系统提示」、「系统消息」和「自定义指令」几乎可以互换使用。这种用法让许多人(包括我自己)感到混淆,因此 openai 发表了一篇文章,专门解释了这些术语。简要总结如下:
图片来自 Enterprise DNA Blog
尽管这三个术语表达的是相同的概念,但不必因术语的使用而感到困扰。下面我们将统一使用「系统提示」这一术语。现在,让我们一探究竟!
系统提示是您向大语言模型提供的关于其应如何响应的额外指示。这被视为一种额外的提示,因为它超出了您对大语言模型的常规用户提示。
在对话中,每当您提出一个新的提示时,系统提示就像是一个过滤器,大语言模型会在回应您的新提示之前自动应用这一过滤器。这意味着在对话中每次大语言模型给出回应时,都会考虑到这些系统提示。
系统提示一般包括以下几个部分:
例如,系统提示可能是这样的:
每一部分对应的内容如下图所示:
系统提示已经概括了任务的总体要求。在上述示例中,任务被定义为仅使用特定文本进行问题解答,同时指导 LLM 按照{"问题":"答案"}
的格式进行回答。
这种情况下,每个用户提示就是您想用该文本回答的具体问题。
例如,用户提示可能是"这篇文本主要讲了什么?"
,LLM 的回答将是{"这篇文本主要讲了什么?":"文本主要讲述了……"}
。
但我们可以将这种任务进一步推广。通常,与只询问一个文本相比,你可能会有多个文本需要询问。这时,我们可以将系统提示的首句从
改为
如此,每个用户提示将包括要问答的文本和问题,例如:
此处,我们使用 XML 标签来分隔信息,以便以结构化方式向 LLM 提供所需的两个信息。XML 标签中的名词,text
和 question
,与系统提示中的名词相对应,以便 LLM 理解这些标签是如何与指令相关联的。
总之,系统提示应提供整体任务指令,而每个用户提示则需要提供执行该任务所需的具体细节。在这个例子中,这些细节就是文本和问题。
在之前的讨论中,我们通过系统提示来设定规则,这些规则一经设定,将在整个对话中保持不变。但如果你想在对话的不同阶段实施不同的规则,应该怎么做呢?
对于直接使用 ChatGPT 用户界面的用户来说,目前还没有直接的方法可以实现这一点。然而,如果你通过编程方式与 ChatGPT 互动,那么情况就大不相同了!随着对开发有效 LLM 规则的关注不断增加,一些允许你通过编程方式设定更为详细和动态的规则的开源软件包也应运而生。
特别推荐的一个是由 NVIDIA 团队开发的NeMo Guardrails。这个工具允许你配置用户与 LLM 之间的预期对话流程,并在对话的不同环节设定不同的规则,实现规则的动态调整。这无疑是探索对话动态管理的一个很好的资源,值得一试!
你可能已经听说过 OpenAI 在 ChatGPT 的 GPT-4 中为付费账户提供的高级数据分析插件。它让用户可以上传数据集到 ChatGPT 并直接在数据集上执行编码,实现精准的数据分析。
但是,你知道吗?并不总是需要依赖这类插件来有效地使用大语言模型 (LLM) 分析数据集。我们首先来探讨一下仅利用 LLM 进行数据分析的优势与限制。
正如你可能已经知道的,LLMs 在执行精确的数学计算方面有所限制,这让它们不适合需要精确量化分析的任务,比如:
正是为了执行这些量化任务,OpenAI 推出了高级数据分析插件,以便通过编程语言在数据集上运行代码。 那么,为什么还有人想仅用 LLMs 来分析数据集而不用这些插件呢?
LLMs 在识别模式和趋势方面表现出色。这得益于它们在庞大且多样化的数据上接受的广泛训练,能够洞察到复杂的模式,这些模式可能不是一眼就能看出来的。 这使它们非常适合执行基于模式查找的任务,例如:
对于这些基于模式的任务,单独使用 LLMs 可能实际上会在更短的时间内比使用编程代码产生更好的结果!接下来,我们将通过一个例子来详细说明这一点。
我们将使用一个流行的实际Kaggle 数据集,该数据集专为客户个性分析而设计,帮助公司对客户基础进行细分,从而更好地了解客户。 为了之后验证 LLM 分析的方便,我们将这个数据集缩减至 50 行,并仅保留最相关的几列。缩减后的数据集如下所示,每一行代表一位客户,各列展示了客户的相关信息:
设想你是公司营销团队的一员,你的任务是利用这份客户信息数据集来指导营销活动。这是一个分两步的任务:首先,利用数据集生成有意义的客户细分;其次,针对每个细分提出最佳的市场营销策略。
这是一个实际的商业问题,其中第一步的模式识别能力是 LLM 可以大显身手的地方。 我们将按以下方式设计任务提示,采用四种提示工程技术:
下面是 GPT-4 的回复,我们将继续将数据集以 CSV 字符串的形式传递给它。
随后,GPT-4 按照我们要求的标记符报告格式回复了分析结果:
为了简洁,我们选择两个由大语言模型生成的客户群体进行验证——“年轻家庭”和“挑剔的爱好者”。
年轻家庭
– 大语言模型生成的描述:出生于 1980 年后,已婚或同居,中等偏低的收入,育有孩子,常做小额消费。
– 此群体包括的数据行:3、4、7、10、16、20 – 深入查看这些数据行的详细信息,结果显示:
年轻家庭的完整数据 — 作者图片
这些数据完美对应大语言模型确定的用户描述。该模型甚至能够识别包含空值的数据行,而无需我们预先处理!
挑剔的爱好者
– 大语言模型生成的描述:年龄跨度广泛,不限婚姻状况,高收入,孩子情况不一,高消费水平。
– 此群体包括的数据行:2、5、18、29、34、36 – 深入查看这些数据行的详细信息,结果显示:
挑剔的爱好者的完整数据 — 作者图片
这些数据再次精准匹配大语言模型确定的用户描述!
本例展示了大语言模型在识别模式、解读及简化多维数据集以提炼出有意义的洞见方面的强大能力,确保其分析结果扎根于数据的真实情况。
为了全面考虑,我使用同一提示尝试了相同的任务,不过这次我让 ChatGPT 通过编程方式进行分析,启用了其高级数据分析插件。插件应用 K-均值等聚类算法直接对数据集进行处理,以便划分不同的客户群体,并据此制定营销策略。
尽管数据集仅含 50 行,多次尝试均显示错误信息且未产生任何结果:
当前情况表明,虽然高级数据分析插件能够轻松完成一些简单任务,如统计描述或生成图表,但在执行需要较大计算量的高级任务时,有时可能因为计算限制或其他原因而发生错误,导致无法输出结果。
答案因分析的具体类型而异。
对于需要精确的数学运算或复杂的规则处理的任务,传统的编程方法依然更加适用。
而对于依赖模式识别的任务,传统的编程和算法处理可能更加困难且耗时。大语言模型在这类任务中表现优异,能提供包括分析附件在内的额外输出,并能生成 Markdown 格式的完整分析报告。
总的来说,是否采用大语言模型取决于任务本身的性质,需要平衡其在模式识别上的强项与传统编程技术提供的精确度和特定性。
在本节结束前,让我们重新审视用于生成此数据分析的提示,并详细解析关键的提示工程技巧:
大语言模型(LLM)擅长处理简单的任务,对于复杂的任务则表现不佳。因此,在面对复杂任务时,把它分解成一步步简单的指令是至关重要的。这种方法的核心思想是,明确告知 LLM 你自己执行该任务时会采取的每一个步骤。
例如,具体步骤如下:
这样的分步指导,比起直接要求 LLM「对客户进行分组并提出营销策略」的方式,能显著提高其输出的准确性。
在提供步骤时,我们会用大写字母标记每个步骤的输出,这样做是为了区分指令中的变量名和其他文本,方便后续引用这些中间输出。
例如数据聚类(CLUSTERS)
、聚类描述(CLUSTER_INFORMATION)
、聚类命名(CLUSTER_NAME)
、营销策略(MARKETING_IDEAS)
和策略解释(RATIONALE)
。
此处我们请求一个 Markdown 格式的报告,以增强响应的可读性和结构性。利用中间步骤的变量名,可以明确报告的构架。
此外,你还可以让 ChatGPT 将报告以可下载文件形式提供,便于你在编写最终报告时参考使用。
在我们的首个提示中,你会发现我们并没有直接将数据集交给大语言模型(LLM)。反而,提示只给出了数据集分析的任务指令,并在底部添加了这样的话:
随后 ChatGPT 表示它已理解,并在下一个提示中,我们通过 CSV 字符串的形式将数据集传递给它:
但为什么需要将指令与数据集分开处理呢?
这样做可以帮助大语言模型更清晰地理解各自的内容,降低遗漏信息的风险,尤其是在指令较多且复杂的任务中。
你可能遇到过这样的情况:在一个长的提示中提出的某个指令被「偶然遗忘」了——例如,你请求一个 100 字的回答,但大语言模型却给出了更长的段落。
通过先接收指令,再处理这些指令所对应的数据集,大语言模型可以更好地消化它应该做的事情,然后再执行相关的数据操作。
值得注意的是,这种指令与数据集的分离只能在可以维护对话记忆的聊天型大语言模型中实现,而非那些没有这种记忆功能的完成型模型。
在本文结束之前,我想分享一些关于这次非凡旅程的个人思考。
首先,我要衷心感谢 GovTech Singapore 精心策划这场精彩的比赛。如果你对 GovTech 如何组织这场独一无二的比赛感兴趣,可以阅读 Nicole Lee——比赛的主要组织者撰写的这篇文章。
其次,我要向那些出色的竞争对手们致以最高的敬意,每个人都展现了特别的才能,让这场比赛既充满挑战又富有成效!
我永远不会忘记决赛那一刻,我们在舞台上激烈竞争,现场观众的欢呼声——这是我将一直珍视的记忆。 对我而言,这不只是一场比赛;这是一次才华、创造力及学习精神的盛会。我对未来充满期待,并激动于即将到来的一切!
撰写本文让我感到非常愉快,如果你在阅读时也享受这份乐趣,希望你能花一点时间点赞并关注! 期待下一次的相遇!