目录:
- 1、Prompt frameWork
- 2、Prompt 结构化格式
- 3、如何写好结构化 Prompt ?
- 4、Zero-Shot Prompts
- 5、Few-Shot Prompting
- 6、自洽性Self-Consistency
- 7、Program-Aided Language Models
1、Prompt frameWork
结构化、模板化编写大模型 Prompt 范式的思想目前已经广为传播并应用;结构化 Prompt 的思想通俗点来说就是像写文章一样写 Prompt。
结构化 Prompt 可以有各种各样的模板,你可以像用 PPT 模板一样选择或创造自己喜欢的模板。
1、目前觉得写得最清晰的是 Elavis Saravia 总结的框架,他认为一个 prompt 里需包含以下几个元素:
- Instruction(必须): 指令,即你希望模型执行的具体任务。
- Context(选填): 背景信息,或者说是上下文信息,这可以引导模型做出更好的反应。
- Input Data(选填): 输入数据,告知模型需要处理的数据。
- Output Indicator(选填): 输出指示器,告知模型我们要输出的类型或格式。
在写 prompt 的时候,并不一定要包含所有4个元素,而是可以根据自己的需求排列组合。
2、**CRISPE Prompt框架:**Matt Nigh 的 CRISPE Framework,这个 framework 更加复杂,但完备性会比较高,比较适合用于编写 prompt 模板,代表的含义:
- **CR:**Capacity and Role(能力与角色)。你希望 ChatGPT 扮演怎样的角色。
- **I:**Insight(洞察力),背景信息和上下文(坦率说来我觉得用 Context 更好)
- **S:**Statement(指令),你希望 ChatGPT 做什么。
- **P:**Personality(个性),你希望 ChatGPT 以什么风格或方式回答你
- **E:**Experiment(尝试),要求 ChatGPT 为你提供多个答案
最终写出来的 Prompt 是这样的
Act as an expert on software development on the topic of machine learning frameworks, and an expert blog writer. The audience for this blog is technical professionals who are interested in learning about the latest advancements in machine learning. Provide a comprehensive overview of the most popular machine learning frameworks, including their strengths and weaknesses. Include real-life examples and case studies to illustrate how these frameworks have been successfully used in various industries. When responding, use a mix of the writing styles of Andrej Karpathy, Francois Chollet, Jeremy Howard, and Yann LeCun.
这类思维框架只呈现了 Prompt 的内容框架,但没有提供模板化、结构化的 prompt 形式
2、Prompt 结构化格式
日常的文章结构是通过字号大小、颜色、字体等样式来标识的,ChatGPT 接收的输入没有样式,因此借鉴 markdown,yaml 这类标记语言的方法或者json 这类数据结构实现 prompt 的结构表达都可以
例如用标识符 # 标识一级标题,##标识二级标题,以此类推。 尤其是使用 json, yaml 这类成熟的数据结构,对 prompt 进行工程化开发特别友好。
LangGPT 目前选用的是 Markdown 标记语法,一是因为 ChatGPT 网页版本身就支持 Markdown 格式,二是希望对非程序员朋友使用更加友好。程序员朋友推荐使用yaml, json 等进行结构化 prompt 开发。
下面示例 Prompt 中使用到的一些属性词介绍
此外:好的属性词也很关键,你可以定义、添加、修改自己的属性词,比如:
- # Role【角色】:设置角色名称,一级标题,作用范围为全局
- ## Background【背景】 :背景描述
- ## Attention【注意事项】:注意事项
- ## Profile【描述】: 描述,二级标题,作用范围为段落
-
- Author【作者】:XXX 设置 Prompt 作者名,保护 Prompt 原作权益
-
- Version【版本】:1.0 设置 Prompt 版本号,记录迭代版本
-
- Language【语言】::中文 设置语言,中文还是 English
-
- Description【描述】: 一两句话简要描述角色设定,背景,技能等
-
- ## Skill【技能】:技能 设置技能,下面分点仔细描述
- ## Goals【目标】:目标
- ## Constrains/Rules【约束/规则】:约束
- ## Workflow【工作流程】:设置工作流程,如何和用户交流,交互
- ## Output Format【输出格式】:输出格式
- ## Suggestions【建议】:建议
- ## Initialization 【初始化】 设置初始化步骤,强调 prompt 各内容之间的作用和联系,定义初始化行为。
3、如何写好结构化 Prompt ?
1、构建全局思维链
对大模型的 Prompt 应用CoT 思维链方法的有效性是被研究和实践广泛证明了的。
一个好的结构化 Prompt 模板,某种意义上是构建了一个好的全局思维链。 如 LangGPT 中展示的模板设计时就考虑了如下思维链:
- Role (角色) -> Profile(角色简介) ---> Profile 下的 skill (角色技能) -> Rules (角色要遵守的规则) -> Workflow (满足上述条件的角色的工作流程) -> Initialization (进行正式开始工作的初始化准备) -> 开始实际使用
结构化 prompt 方法将久经考验的逻辑思维链路融入了结构中,大大降低了思维链路的构建难度。
2、保持上下文语义一致性
包含两个方面,一个是格式语义一致性,一个是内容语义一致性。
- **格式语义一致性:**是指标识符的标识功能前后一致。 最好不要混用,比如 # 既用于标识标题,又用于标识变量这种行为就造成了前后不一致,这会对模型识别 Prompt 的层级结构造成干扰。
- **内容语义一致性:**是指思维链路上的属性词语义合适。 例如 LangGPT 中的 Profile 属性词,原来是 Features,但实践+思考后我更换为了 Profile,使之功能更加明确:即角色的简历。
3、有机结合其他 Prompt 技巧
结构化 Prompt 编写思想是一种方法,与其他例如 CoT, ToT, Think step by step 等技巧和方法并不冲突,构建高质量 Prompt 时,将这些方法结合使用,结构化方式能够更便于各个技巧间的协同组织,汇总现有的一些方法:
-
- 细节法:给出更清晰的指令,包含更多具体的细节
-
- 分解法:将复杂的任务分解为更简单的子任务 (Let's think step by step, CoT,LangChain等思想)
-
- 记忆法: 构建指令使模型时刻记住任务,确保不偏离任务解决路径(system 级 prompt)
-
- 解释法:让模型在回答之前进行解释,说明理由 (CoT 等方法)
-
- 投票法:让模型给出多个结果,然后使用模型选择最佳结果 (ToT 等方法)
-
- 示例法:提供一个或多个具体例子,提供输入输出示例 (one-shot, few-shot 等方法)
4、结构化 Prompt 对不同模型的适用性
- 例如 LangGPT 助手的 GPT-3.5 版本(如下),就将原本的多级结构降维为二级结构(1. 2. 3. 为一级,- 为二级)
- 同时参考 AutoGPT 中的提示词使用了 4.Goals, 5.Constraints 等属性词。
5、结构化 Prompt 的局限性
结构化 Prompt 依赖于基座模型能力,并不能解决模型本身的问题,结构化 Prompt 并不能突破大模型 Prompt 方法本身的局限性。已知的无法解决的问题:
-
- 大模型本身的幻觉问题
-
- 大模型本身知识老旧问题
-
- 大模型的数学推理能力弱问题 (解数学问题)
-
- 大模型的视觉能力弱问题(构建 SVG 矢量图等场景)
-
- 大模型字数统计问题(不论是字符数和 token 数,大模型都无法统计准确。需要输出指定字数时,将数值设定的高一些,后期自己调整一下,比如希望他输出100字文案,告诉他输出150字。)
-
- 同一 Prompt 在不同模型间的性能差异问题
4、Zero-Shot Prompts
Zero-shot Prompt 【零样本提示】:传统的自然语言处理技术通常需要在大量标注数据上进行有监督的训练,以便模型可以对特定任务或领域进行准确的预测或生成输出。
相比之下,Zero-Shot Prompting 的方法更为灵活和通用,因为它不需要针对每个新任务或领域都进行专门的训练。相反,它通过使用预先训练的语言模型和一些示例或提示,来帮助模型进行推理和生成输出。
1、缺点:
- Zero-Shot Prompting 技术依赖于预训练的语言模型,这些模型可能会受到训练数据集的限制和偏见。比如在使用 文心一言 的时候,它常常会在一些投资领域,使用男性的「他」,而不是女性的「她」。那是因为训练 文心一言 的数据里,提到金融投资领域的内容,多为男性。
- 由于 Zero-Shot Prompting 技术的灵活性和通用性,它的输出有时可能不够准确,或不符合预期。这可能需要对模型进行进一步的微调或添加更多的提示文本来纠正。
2、Zero-Shot Chain of Thought
基于上述的缺点,研究人员就找到了一个叫 Chain of Thought 的技巧
这个技巧使用起来非常简单,只需要在问题的结尾里放一句Let's think step by step (让我们一步步地思考),模型输出的答案会更加准确。
这个技巧来自于 Kojima 等人 2022 年的论文Large Language Models are Zero-Shot Reasoners。
在论文里提到,当我们向模型提一个逻辑推理问题时,模型返回了一个错误的答案,但如果我们在问题最后加入 Let's think step by step 这句话之后,模型就生成了正确的答案:
论文原理简单理解:
- 1.首先各位要清楚像 文心一言 这类产品,它是一个统计语言模型 ,本质上是基于过去看到过的所有数据,用统计学意义上的预测结果进行下一步的输出(这也就是为什么你在使用 文心一言 的时候,它的答案是一个字一个字地吐出来,而不是直接给你的原因,因为答案是一个字一个字算出来的)
- 2.当它拿到的数据里有逻辑,它就会通过统计学的方法将这些逻辑找出来,并将这些逻辑呈现给你,让你感觉到它的回答很有逻辑。
- 3.在计算的过程中,模型会进行很多假设运算(不过暂时不知道它是怎么算的)。比如解决某个问题是从 A 到 B 再到 C,中间有很多假设。
- 4.它第一次算出来的答案错误的原因,只是因为它在中间跳过了一些步骤(B)。而让模型一步步地思考,则有助于其按照完整的逻辑链(A > B > C)去运算,而不会跳过某些假设,最后算出正确的答案。
按照论文里的解释,零样本思维链涉及两个补全结果,左侧气泡表示基于提示输出的第一次的结果,右侧气泡表示其收到了第一次结果后,将最开始的提示一起拿去运算,最后得出了正确的答案:
(乔平均每分钟出25拳。一场战斗持续5轮3分钟。他打了多少拳?)
5、Few-Shot Prompting
Few-Shot Prompting :给模型一些示例,从而让模型返回更符合我们需求的答案。
这个方法最早是 Brown 等人在 2020 年发现的,论文:Language Models are Few-Shot Learners; 即像 文心一言 这类统计语言模型,其实并不懂意思,只是懂概率。
通过向大语言模型展示一些少量的样例,并在样例中解释推理过程,大语言模型在回答提示时也会显示推理过程。这种推理的解释往往会引导出更准确的结果。
下面是论文里的案例,使用方法很简单,在技巧2 的基础上,再将逻辑过程告知给模型即可。从下面这个案例里,你可以看到加入解释后,输出的结果就正确了。
-
Roger 有5个网球。他又买了2罐网球。每个罐子有3个网球。他现在有多少个网球?
-
自助餐厅有23个苹果。如果他们用20个做了午餐,再买6个,他们有多少个苹果?
根据Min等人 Min et al. (2022), 的研究结果,以下是一些关于少样本演示/示例的提示:
- 标签空间和演示文本分布对于性能都很重要(无论个别输入的标签是否正确)
- 无论您是否只使用随机标签,所使用的格式也对性能起关键作用,这要比没有标签好得多
- 其他结果显示,从真实标签分布(而不是均匀分布)中选择随机标签也有所帮助
理解起来有点难,找一个 prompt 案例家解释
在上述的案例里,每一行,我都写了一句话和一个情感词,并用 情感分类 分开,但我给这些句子都标记了错误的答案,比如第一句其实应该是 积极的 才对。但:
- 1.即使我给内容打的标签是错误的(比如第一句话,其实应该是 积极的),对于模型来说,它仍然会知道需要输出什么东西。
- 换句话说,模型知道 情感分类: 后要输出一个衡量该句子表达何种感情的词(积极的 或 负面的)。
- 这就是前面论文提到的,即使我给的标签是错误的,或者换句话说,是否基于事实,并不重要。标签和输入的文本,以及格式才是关键因素。
- 2.只要给了示例,即使随机的标签,对于模型生成结果来说,都是有帮助的。这就是前面论文里提到的内容。
-
- 最后,需要记住,思维链仅在使用大于等于 100B 参数的模型时,才会生效。
6、自洽性Self-Consistency
Self-Consistency 自洽是对 Chain of Thought 的一个补充,它能让模型生成多个思维链,然后取最多数答案的作为最终结果。
按照 Xuezhi Wang 等人在 2022 年发表的论文 https://arxiv.org/pdf/2203.11171.pdf表明。当我们只用一个逻辑链进行优化时,模型依然有可能会算错,所以 XueZhi Wang 等人提出了一种新的方法,让模型进行多次运算,然后选取最多的答案作为最终结果:
-
bakes muffins:烤松饼
查阅多份资料,我发现这个自洽性可能更多的用于评估模型的优劣,好的模型一般自洽性会比较高。
7、PAL Models
PAL Models,全称为 Program-Aided(辅助) Language Models。这个方法来自于 2022 年,Luyu Gao 等人的研究 https://arxiv.org/pdf/2211.10435.pdf,根据他们的研究,在 LLM 模型中,即使使用了前面提到的 Chain of Thought 的方法,也未必能拿到答案,论文中使用的 prompt 是这样的:
-
面包师烤了200个面包,早晨卖了93个,下午卖了39个,退回6个,问题还剩余多少个?
参考资料