背景
LLM的本质
为了深入探讨大规模预训练模型(LLM)的优秀性,首先需要阐述其基本概念。从技术层面分析,LLM可以被视为一种统计语言模型,其核心在于利用过去观测到的数据为未来的输出提供预测。在文本生成过程中,LLM通常根据给定的上下文预测下一个单词或字符,并从预测的概率分布中进行采样,这也就意味着LLM的输出是不稳定的。
Prompt的研究意义
近年来,自然语言处理(NLP)领域信赖Prompt作为一种重要的研究方法。在BERT模型的时代背景下,预训练和微调(Pretrain+Finetune)范式已成为解决问题的首选策略。然而,随着GPT-3系列模型的问世,大规模预训练模型为NLP任务带来了创新性的解决方案。得益于其强大的上下文学习能力,零样本学习(Zero-shot Learning)和少样本学习(Few-shot Learning)成为可行的处理方法。
因此,Prompt已逐渐成为微调范式的替代策略,这使得激发大规模预训练模型潜能以及提高其在复杂任务场景下的性能成为当前研究的焦点。在这个过程中,Prompt扮演着关键角色,其应用范畴不仅局限于设计提示词,还涉及到与大规模预训练模型的交互和研发的各种技能及技术。
Prompt Engineering的重要性
提示工程(Prompt Engineering)在实现与大规模预训练模型的互动、连接以及理解模型能力方面发挥着重要作用。通过提示工程,用户能够有效提高大规模预训练模型的安全性,同时为模型赋予新的能力。例如,利用专业领域知识和外部工具,有望进一步提升大规模语言模型在特定任务中的表现和性能。
综上所述,Prompt作为一个富有价值的研究方向,既有助于挖掘大规模预训练模型的潜在潜能,也在实际应用中增强模型的安全性和性能发挥了决定性作用。深入研究提示工程及相关技术,预计将为自然语言处理领域带来更高效、更广泛的应用前景。
书写原则
在My AI项目攻坚阶段,项目同学在多次实践和不断讨论之后整理了一套行之有效的prompt书写规范My AI Prompt Template规范 。除此之外,个人还有以下三点感悟:
Context, not control :
虽然通过指令微调让模型学会了一些指令跟随能力,但是语言模型的本质能力是续写。永远去陈述事实,让模型去理解上下文。避免说不要做什么,而是说要做什么。
- Wrong:
以下是代理与客户之间的对话。不要询问用户名或密码。不要重复。 客户:我无法登录我的帐户。 代理人:
- BETTER:
以下是代理与客户之间的对话。代理将尝试诊断问题并提出解决方案,同时避免询问任何与 PII 相关的问题。不要询问用户名或密码等 PII,而是让用户参阅帮助文章 www.samplewebsite.com/help/faq 客户:我无法登录我的帐户。 代理人:
Straight and clear
所谓大道至简,过于繁杂的修饰往往会掩埋真实的意图。好的提示词最好是具体和直接,也就是坦诚清晰——越直接,信息传递就越有效。
- Wrong:
写一款产品描述。要求该产品描述用词精简,相当简短,只有几句话,而不是太多。
- BETTER:
使用 3 到 5 句话的来描述该产品。
MarkDown is important
Markdown 的语法层级结构很好,适合编写 prompt,因此 LangGPT 的变量基于 markdown语法。实际上除 markdown外各种能实现标记作用,如 json,yaml, 甚至好好排版好格式 都可以。
变量为 Prompt 的编写带来了很大的灵活性。使用变量可以方便的引用角色内容,设置和更改角色属性。这是一般的 prompt 方法实现起来不方便的。
- Wrong:
文本 领域 实体映射
打开车门 设备控制 设备:车门
关闭空调 设备控制 设备:空调
导航到人民路 导航 POI:人民路
开车去郊野公园 导航 POI:郊野公园
- Better
文本 | 领域 | 实体映射 |
————– | ——– | ————- |
打开车门 | 设备控制 | 设备:车门 |
关闭空调 | 设备控制 | 设备:空调 |
导航到人民路 | 导航 | POI:人民路 |
开车去郊野公园 | 导航 | POI:郊野公园 |
Prompt要素
Prompt可以包含以下四个关键元素:
- 指令:为模型提供明确的任务或指令,确保模型了解预期的执行内容;
- 上下文:为语言模型提供外部信息或额外的背景信息,使其能够更有效地产生响应;
- 输入数据:包含用户输入的问题或内容;
- 输出指示:规定期望的输出类型或格式。
需要注意的是,所需的提示格式会因期望语言模型完成的任务类型而异,以上关键元素并非在所有情况下都必须使用。
示例
你是一个优秀的物理学教授,正在审阅学生的论文。 // 上下文
请提取出以下论文的要点 //指令
以下是"""
{论文内容} //输入数据
"""
请以列表的形式展示。 //输出指示
Prompt相关概念
Zero Shot
如今,随着大量数据的训练和指令的调整,大型语言模型(LLM)已能执行零样本(Zero-Shot)任务。对于预训练或指令微调中,大型语言模型本身所具备的任务,例如连续写作,概括和总结,我们通过零样本的提示可以实现良好的效果。
示例:
从下面的文本中提取关键字。
文本:{text}
关键字:
- Zero-Shot技术依赖于预训练的语言模型,这些模型可能会受到训练数据集的限制和偏见。例如,在使用ChatGPT时,它常常会在一些投资领域使用男性的”他”,而非女性的”她”。这是因为在训练ChatGPT的数据中,提及金融投资领域的内容通常与男性相关。
- 由于 Zero-Shot的输出格式更加贴近自然语言的格式。如果对于输出格式有特殊要求,如进行某些分类任务,采用少量样本(few-shot)的方式可能更为合适。
Few Shot
当零样本(zero-shot)方法无法有效应用时,我们可以尝试一种名为少样本提示(few-shot prompting)的技术手段。该方法旨在利用上下文进行学习,通过在推理过程中的问题描述(prompt)中提供少量示例来引导模型,从而达到更优的性能表现。这些示例将作为后续答案生成的参考,可以促使模型从有限的样本中进行类比推理并进行举一反三。
示例
从下面相应的文本中提取关键词。
文本 1:Stripe 提供 API,Web 开发人员可以使用这些 API 将支付处理集成到他们的网站和移动应用程序中。
关键词 1:Stripe、支付处理、API、Web 开发人员、网站、移动应用程序
##
文本 2:OpenAI 训练了非常擅长理解和生成文本的尖端语言模型。我们的 API 提供对这些模型的访问,并且可用于解决几乎任何涉及处理语言的任务。
关键词2:OpenAI、语言模型、文本处理、API。
##
文本 3:{text}
关键字 3:
在实施few shot时,选择合适数量的示例至关重要。通常情况下,增加推理问题中的上下文数量(in-context),即“shot”的数量,可以提升模型的性能表现。然而,相关研究表明,在超过一样本(one-shot)之后,边际收益会迅速衰减。特别地,对于性能较强的模型,边际收益将进一步降低。因此,我们建议在实际应用中谨慎平衡示例数量与所需性能表现的关系。
图3-1: 关于shots数量的 消融实验
Chain of Thoutht(CoT)
在Wei等人(2022)的研究中,他们提出了一种名为链式思考(Chain of Thought,简称CoT)的提示方法,通过操作演绎推理的中间步骤,实现了复杂推理能力的表现。此方法可与少样本提示相结合,以便在回答复杂问题之前进行更深入的分析。近年的一项新研究零样本CoT((Kojima等人, 2022) 更进一步提及“Let’s think step by step”,这一想法得到了广泛关注与讨论。
为了解释CoT为何有效,作者在文章中对此进行了详细阐述。简言之,模型在进行计算的过程中会涉及许多假设型运算(尚未得知具体计算方式)。以从 A 到 B 再到 C 的推理过程为例,其中包含多个假设。模型得出错误答案的原因往往是在推理过程中跳过了部分步骤(如 B),而采用逐步思考的方法有助于使模型依照完整的逻辑链(A > B > C)进行运算,这样就能够避免跳过某些假设,从而得出正确答案。
prompt示例:
A man takes a wolf, a sheep, and a cabbage to the riverside and wants to cross the river with the only boat. he can take only one item with him on the boat each time. he cannot leave the wolf and sheep on either side of the river at the same time, because the wolf would eat the sheep. he cannot leave the sheep and cabbage on either side of the river at the same time, because the sheep would eat the cabbage. now the question is, at least how many times the man needs to cross the river in order to have all three items moved to the other side of the river?
Let's work this out in a step by step way to be sure we have the right answer.
然而,请注意不要滥用CoT方法。使用CoT的前提条件是模型具备一定的推理能力。针对倾向于对话类的问题,CoT的影响可能较小甚至产生负作用。然而, 在需求较高推理能力的任务上, CoT却能发挥巨大帮助。判断是否需要使用CoT的一个简单标准是任务是否足够复杂,即其是否需要进行多个步骤的分解。
Self-Consistency
也许在提示工程中更高级的技术之一是Self-Consistency。由Wang等人(2022)(opens in a new tab)提出,Self-Consistency旨在“替换CoT使用的greedy decoding”。当我们只用一个逻辑链进行优化时,模型依然有可能会算错,所以作者提出了一种新的方法,让模型进行多次运算,然后选取最多的答案作为最终结果。如果CoT可以类比为机器学习中的boosting方法的话,Self of Consistency是可以类比为bagging方法。其想法是通过少样本CoT采样多个不同的推理路径,并使用生成结果选择最一致的答案。这有助于提高CoT提示在涉及算术和常识推理的任务中的性能。
Meta-Prompt
未来人工智能的发展方向应该是需要实现自主学习,自我修正。Meta-Prompt的核心在于使用一个通用的prompt来构建一个可以自我反思、改进的agent。Meta-Prompt的关键原则是让agent反思自己的表现,并相应地修改自己的指令,同时使用一个总体的Meta-Prompt。
整体agent的运行程序是一个循环过程,按照以下步骤进行:
- 与LLM进行对话,用户提供requests, instructions, and feedback.
- 对话完成后,使用Meta-Prompt生成self-criticism 以及 new instruction.
示例
Assistant has just had the below interactions with a User. Assistant followed their "system: Instructions" closely. Your job is to critique the Assistant's performance and then revise the Instructions so that Assistant would quickly and correctly respond in the future.
####
{hist}
####
Please reflect on these interactions.
You should first critique Assistant's performance. What could Assistant have done better? What should the Assistant remember about this user? Are there things this user always wants? Indicate this with "Critique: ...".
You should next revise the Instructions so that Assistant would quickly and correctly respond in the future. Assistant's goal is to satisfy the user in as few interactions as possible. Assistant will only see the new Instructions, not the interaction history, so anything important must be summarized in the Instructions. Don't forget any important details in the current Instructions! Indicate the new Instructions by "Instructions: ...".
写在最后
-
坚持不懈的精神
- 不要轻言放弃。从Lark LLM Prompt Platform的设计理念可以看出,prompt跟写代码一样的,我们需要构建置信的评测集,需要做好版本管理与发布。写好一个Prompt绝非一日之功。
-
少谈一点主义,多谈一点问题。
- 具体的问题还是要具体分析,没有一套放之四海而皆准的prompt。借用一鸣说过的话:“方法论大多时候只是作为参考,过度依赖方法论只是思维上的偷懒。”