结构化 Prompt 编写
结构化 Prompt 编写
最近发现了一种编写 Prompt 的高阶方法,"结构化Prompt",作者开源成一个LangGPT项目,我实践下来效果确实不错,结构清晰,可读性强,易于迭代维护,全是优点,唯一的缺点是Token占用会稍多一些.
什么是结构化 Prompt ?
这里的"结构化"有两层意思,一层意思是编写Prompt时内容的结构化,也就是按照固定格式编写的模板.另一层意思是编写Prompt思维模式的结构化.
思维模式的结构化
知名的 CRISPE 提示词框架就是典型思维模式结构化,CRISPE 分别代表以下含义:
- CR:Capacity and Role(能力与角色)。你希望 ChatGPT 扮演怎样的角色。
- I:Insight(洞察力),背景信息和上下文(坦率说来我觉得用 Context 更好)。
- S:Statement(指令),你希望 ChatGPT 做什么。
- P:Personality(个性),你希望 ChatGPT 以什么风格或方式回答你。
- E:Experiment(尝试),要求 ChatGPT 为你提供多个答案。
按照这个思维框架写出来的提示词是这样的:
你是一位备受欢迎的儿童绘本画师,精通各种绘画技巧,包括线条的掌握、色彩运用、阴影和光影的表现,你将根据用户提供的故事脚本,生成绘本图画。
这类思维框架只呈现了 Prompt 的内容框架,但没有提供模板化、结构化的 prompt 形式。
使用结构化、模板化的 Prompt,写出来是这样的:
1.Expert: 顶级儿童绘本作家
2.Profile:
- Author: 0xYidaoban
- Version: 0.5
- Language: 中文
- Description: 你是一位备受欢迎的儿童绘本作家,熟悉各种儿童喜爱的绘本题材,你将根据用户要求生成绘本故事脚本。
3.Skills:
- 创造力:有丰富的想象力和创造力,能够创作出吸引孩子们的有趣故事和角色。
- 理解儿童心理:了解儿童的兴趣、需求和心理特点,能够创作出符合他们不同年龄阶段认知水平和情感需求的绘本作品。
- 语言表达能力:具备优秀的语言表达能力,能够用简洁、生动的语言描述故事情节,吸引孩子们的注意力并让他们容易理解。
- 情感共鸣:能够与儿童建立情感共鸣,理解他们的情感需求,并通过故事中的情节和角色传递积极的价值观和情感体验。
- 专业知识:对儿童文学和绘本创作有非常专业的知识储备,包括了解市场需求、了解不同年龄段儿童的阅读习惯。
4.Goals:
- 按照要求写出绘本故事脚本,故事脚本内容要符合要求的主题,年龄,性别.
- 一个完整的故事包含:故事主题,角色设定,场景设定,和主题设定
"引子:故事的开头需要引起孩子们的兴趣,可以通过一个引人入胜的场景、一个有趣的问题或一个引人注目的角色来吸引他们的注意力。",
"发展:故事的发展部分是故事的主体,其中包含了一系列有趣的情节和事件。这些情节和事件可以是主角面临的挑战、解决问题的过程、与其他角色的互动等。发展部分应该紧凑而有趣,让孩子们一直保持阅读的兴趣。",
"高潮:高潮是故事的最紧张和最关键的部分。在这一部分,主角通常会面临最大的困难或挑战,需要克服障碍并取得胜利。高潮部分的紧张气氛和悬念可以让孩子们更加投入到故事中。",
"解决:在高潮之后,故事需要有一个解决部分,主角通过智慧、勇气或其他方式解决问题,并取得成功。这一部分可以传递积极的价值观,如友谊、团队合作、勇敢等。",
"结尾:故事的结尾需要给孩子们一个满意的结束,可以是一个温馨的场景、一个意外的转折或一个令人惊喜的结局。结尾部分应该让孩子们感到满足,并留下一些回味和思考的余地。"
5.Constraints:
- 一次输出3个故事,给我选择.
- 故事脚本内容需要传递积极的价值观和情感体验.
- 故事脚本的长度符合常规绘本标准.
- 故事脚本包括角色、情节、冲突、解决方案等。
- 故事脚本的用词和表达方式使用符合年龄段词汇和表达.
6.Init:
- 年龄:{age},性别:{gender},主题:{subject}.
- 请基于以上信息按照<Goals>设定写出精彩的绘本故事.
基于上述 儿童绘本作家 prompt 例子,说明结构化 prompt 的几个概念:
- 标识符:#, <> 等符号(-, []也是),这两个符号依次标识标题,变量,控制内容层级,用于标识层次结构。
- 属性词:Expert, Profile, Init等等,属性词包含语义,是对模块下内容的总结和提示,用于标识语义结构。
标识符,属性词都是可替换的,可以替换为你喜欢的符号和内容。
结构化 Prompt 的优势
1. 结构清晰,可读性好
结构化方式编写出来的 Prompt 层级结构十分清晰,将结构在形式上和内容上统一了起来,可读性很好。
- Expert (角色) 作为 Prompt 标题统摄全局内容。
- Profile (简介)、Constraints(规则) 作为二级标题统摄相应的局部内容。
Language、Description 作为关键词统摄相应句子、段落。
结构化 prompt 的结构由形式控制,完全没有记忆负担。只要模型能力支持,可以做到二层,三层等更多、更丰富的层级结构。
结构化 Prompt 是自带使用文档 的,语义阅读十分清晰明了.加上Version版本号,完全可以使用 Git 等工具像管理代码一样对 prompt 进行版本管理。2. 激发大语言模型的能力
使用特定的属性词能够确保定向唤醒模型的深层能力。
实践发现让模型扮演某个角色其能大大提高模型表现,所以一级标题设置的就是 Expert(专家) 属性词,直接将 Prompt 固定为角色,确保定向唤醒模型的角色扮演能力。也可使用 Role(角色), Master(大师)等提示词替代 Expert,将 Prompt 固定为某一领域专家。
再比如 Constraints,规定了模型必须尽力去遵守的规则。比如在这里添加不准胡说八道的规则,缓解大模型幻觉问题。用 Rules(规则),中文的 规则 等词替代也可。
如何写出一个结构化 Prompt
1. 构建全局思维链
对大模型的提示词应用 CoT思维链方法的有效性是被实践广泛证明了的。
一个好的结构化 Prompt 模板,某种意义上是构建了一个好的全局思维链。 如 以上Prompt 中展示的模板就考虑了如下思维链:
Expert (角色) -> Profile(角色简介)—> Profile 下的 skill (角色技能) -> Constraints(角色要遵守的规则) -> Goals(满足上述条件的角色的工作流程) -> Init(进行正式开始工作的初始化准备).
一个好的 Prompt ,内容结构上最好也是逻辑清晰连贯的。结构化 prompt 方法将久经考验的逻辑思维链路融入了结构中,大大降低了思维链路的构建难度。
2. 保持上下文语义一致性
标识符的标识功能前后一致。 最好不要混用,比如 # 既用于标识标题,又用于标识变量这种行为就造成了前后不一致,这会对模型识别 Prompt 的层级结构造成干扰。
内容语义一致性是指思维链路上的属性词语义合适。
内容语义一致性还包括属性词和相应模块内容的语义一致。 例如 Constraints部分是角色需要遵守规则,则不宜将角色技能、描述大量堆砌在此。
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 等方法)
上面这些方法可以结合使用,以实现最佳效果。
结构化 Prompt 对不同模型版本的适用性
不同模型版本具有不同的能力维度,为了最大化模型性能,需要为不同模型开发相应的结构化Prompt。对于简单的基础Prompt(如一两句话),不同模型可能表现相似,但随着任务难度和Prompt复杂度的增加,不同模型的表现会有明显的差异。结构化Prompt的编写要求模型具备良好的指令遵循和结构识别分析能力。根据我的实践和周围朋友的反馈,GPT-4在这方面是最佳选择,Claude模型次之,GPT-3.5勉强可用,但表现不稳定。
如果有条件,我推荐使用GPT-4。然而,考虑到成本和可访问性的因素,许多人可能需要使用GPT-3.5模型。由于GPT-3.5模型的性能较弱,当你发现结构化Prompt在GPT-3.5上表现不佳时,可以尝试降低结构的复杂度、调整属性词,并迭代修改Prompt。例如,LangGPT助手的GPT-3.5版本将原本的多级结构降低为二级结构(1. 2. 3. 为一级,- 为二级),并参考AutoGPT中的提示词使用了"4.Goals"、"5.Constraints"等属性词。同时,根据Prompt的表现,不断修改和优化你的提示词。
总的来说,在模型能力允许的情况下,结构化Prompt确实可以提高Prompt的性能。然而,当结构化Prompt不符合实际需求时,仍然需要使用各种方法进行调试和修改。
结语
总之,结构化Prompt为Prompt设计带来了很大便利,有效提升了Prompt质量和应用效率。它通过引入结构化思维来有效激发语言模型的各项能力,实现Prompt与模型工作流程的高度匹配。与传统Prompt相比,结构化Prompt不但结构清晰易于理解,且可读性强,更重要的是可以很好地保证Prompt质量和可靠性。随着语言技术的不断成熟,相信结构化Prompt方法也将得到进一步丰富和扩充,为人类与机器之间的交互奠定更深厚的基础。