AI 学习资料 · LangGPT 结构化提示词
系统论述:构建高性能 Prompt 之路——结构化 Prompt
本页由 API GET 修改:收录云中江树《系统论述:构建高性能 Prompt 之路——结构化 Prompt》的正文主体、“局限性”和“结语”;删去了作者的个人联系方式、一段第三方的 CRISPE 英文示例、一段引自知乎想法的方法汇总、社区成员编写的“Prompt 工程师”提示词、相关文章列表和附录里的第三方模板;“对不同模型的适用性”一节压缩成编者摘要;给代码块加了语言标记,并加了编者注。2026-10-27 校对:正文里的“Prompt”“prompt”统一写作“提示词”(文章标题、外部链接名和代码块不变),“agents”改为“智能体”,并改正了几处错别字和标点。
编者注:本文写于 2023 年,文中的“ChatGPT”“GPT 模型”和模型对比反映的是当时的情况,读的时候重点看写法和思路。
前言
我算是最早在国内提结构化、模板化编写大模型提示词范式的人之一。2023 年 4 月在我自己的个人实践中发现这种结构化、模板化的方式对编写提示词十分友好,并且在大多数时候都表现不俗。2023 年 5 月份我将这种方法开源成 LangGPT 项目并在国内写文公开,受到了许多人的认可和喜爱,尤其在 GitHub、即刻、知乎等社区都有不小的反响。由于结构化提示词的出色性能表现,很多朋友都开始在实践中应用这种方法写提示词,其中不乏许多来自网易、字节等互联网大厂的朋友。
虽然结构化提示词的思想目前已经广为传播并应用,但是缺乏全面系统的资料。虽然也有许多解读文章传播,但内容质量良莠不齐,并且知识也较为破碎。于是写作本文,希望能成为一篇较为系统的高质量的结构化提示词论述文章,为学习提示词编写的朋友提供一些参考借鉴。
什么是结构化提示词?
结构化的思想很普遍,结构化内容也很普遍,我们日常写作的文章,看到的书籍都在使用标题、子标题、段落、句子等语法结构。结构化提示词的思想通俗点来说就是像写文章一样写提示词。
为了阅读、表达的方便,我们日常有各种写作的模板,用来控制内容的组织呈现形式。例如古代的八股文、现代的简历模板、学生实验报告模板、论文模板等等。所以结构化编写提示词自然也有各种各样优质的模板帮助你把提示词写得更轻松、性能更好。所以写结构化提示词可以有各种各样的模板,你可以像用 PPT 模板一样选择或创造自己喜欢的模板。
在这之前,虽然也有类似结构化思想,但是更多体现在思维上,缺乏在提示词上的具体体现。
例如知名的 CRISPE 框架,CRISPE 分别代表以下含义:
- CR:Capacity and Role(能力与角色)。你希望 ChatGPT 扮演怎样的角色。
- I:Insight(洞察力),背景信息和上下文(坦率说来我觉得用 Context 更好)。
- S:Statement(指令),你希望 ChatGPT 做什么。
- P:Personality(个性),你希望 ChatGPT 以什么风格或方式回答你。
- E:Experiment(尝试),要求 ChatGPT 为你提供多个答案。
最终写出来的提示词是这样的:
编者注:原文此处是一段按 CRISPE 框架写成的英文示例提示词,出自第三方,本站略去。
这类思维框架只呈现了提示词的内容框架,但没有提供模板化、结构化的提示词形式。
而我们所提倡的结构化、模板化提示词,写出来是这样的:
该示例来自 LangGPT 项目:https://github.com/yzfly/LangGPT/blob/main/README_zh.md
# Role: 诗人
## Profile
- Author: YZFly
- Version: 0.1
- Language: 中文
- Description: 诗人是创作诗歌的艺术家,擅长通过诗歌来表达情感、描绘景象、讲述故事,具有丰富的想象力和对文字的独特驾驭能力。诗人创作的作品可以是纪事性的,描述人物或故事,如荷马的史诗;也可以是比喻性的,隐含多种解读的可能,如但丁的《神曲》、歌德的《浮士德》。
### 擅长写现代诗
1. 现代诗形式自由,意涵丰富,意象经营重于修辞运用,是心灵的映现
2. 更加强调自由开放和直率陈述与进行“可感与不可感之间”的沟通。
### 擅长写七言律诗
1. 七言体是古代诗歌体裁
2. 全篇每句七字或以七字句为主的诗体
3. 它起于汉族民间歌谣
### 擅长写五言诗
1. 全篇由五字句构成的诗
2. 能够更灵活细致地抒情和叙事
3. 在音节上,奇偶相配,富于音乐美
## Rules
1. 内容健康,积极向上
2. 七言律诗和五言诗要押韵
## Workflow
1. 让用户以 "形式:[], 主题:[]" 的方式指定诗歌形式,主题。
2. 针对用户给定的主题,创作诗歌,包括题目和诗句。
## Initialization
作为角色 <Role>, 严格遵守 <Rules>, 使用默认 <Language> 与用户对话,友好的欢迎用户。然后介绍自己,并告诉用户 <Workflow>。
基于上述诗人提示词例子,说明结构化提示词的几个概念:
- 标识符:
#、<>等符号(-、[]也是),这两个符号依次标识标题、变量,控制内容层级,用于标识层次结构。这里采用了 Markdown 语法,#是一级标题,##是二级标题,Role用一级标题是告诉模型,我之后的所有内容都是描述你的,覆盖范围为全局,然后有几个#就是几级标题,如二级、三级标题等等。 - 属性词:
Role、Profile、Initialization等等,属性词包含语义,是对模块下内容的总结和提示,用于标识语义结构。
日常的文章结构是通过字号大小、颜色、字体等样式来标识的,ChatGPT 接收的输入没有样式,因此借鉴 Markdown、YAML 这类标记语言的方法或者 JSON 这类数据结构实现提示词的结构表达都可以,例如用标识符 # 标识一级标题,## 标识二级标题,以此类推。尤其是使用 JSON、YAML 这类成熟的数据结构,对提示词进行工程化开发特别友好。
LangGPT 目前选用的是 Markdown 标记语法,一是因为 ChatGPT 网页版本身就支持 Markdown 格式,二是希望对非程序员朋友使用更加友好。程序员朋友推荐使用 YAML、JSON 等进行结构化提示词开发。
属性词好理解,和学术论文中使用的摘要、方法、实验、结论的段落标题起的作用一样。
标识符、属性词都是可替换的,可以替换为你喜欢的符号和内容。
结构化提示词和传统的提示词写法在直观上就差异很大,那么为什么提倡用结构化方式编写提示词呢?
结构化提示词的优势
优势太多了,说一千道一万,归根结底还是结构化、模板化提示词的性能好!
这一点已经在许多朋友的日常使用甚至商业应用中得到证明。许多企业,乃至网易、字节这样的互联网大厂都在使用结构化提示词!
此外结构化、模板化提示词还有许多优势,这些优势某种意义上又是其在实际使用时表现卓越的原因。
优势一:层级结构:内容与形式统一
结构清晰,可读性好
结构化方式编写出来的提示词层级结构十分清晰,将结构在形式上和内容上统一了起来,可读性很好。
Role (角色)作为提示词标题统摄全局内容。Profile (简介)、Rules(规则)作为二级标题统摄相应的局部内容。Language、Description作为关键词统摄相应句子、段落。
结构丰富,表达性好
CRISPE 这类框架命中注定结构简单,因为过于复杂将难以记忆,大大降低实操性,因此其往往只有一层结构,这限制了提示词的表达。
结构化提示词的结构由形式控制,完全没有记忆负担。只要模型能力支持,可以做到二层、三层等更多、更丰富的层级结构。
那么为什么要用更丰富的结构?这么做有什么好处呢?
这种方式写出来的提示词符合人类的表达习惯,与我们日常写文章时有标题、段落、副标题、子段落等丰富的层级结构是一样的。
这种方式写出来的提示词符合 ChatGPT 的认知习惯,因为 ChatGPT 正是在大量的文章、书籍中训练得到,其训练内容的层级结构本来就是十分丰富的。
优势二:提升语义认知
结构化表达同时降低了人和 GPT 模型的认知负担,大大提高了人和 GPT 模型对提示词的语义认知。 对人来说,提示词内容一目了然,语义清晰,只需要照葫芦画瓢写提示词就行。如果使用 LangGPT 提供的提示词生成助手,还可以帮你生成高质量的初版提示词。
生成的初版提示词足以应对大部分日常场景,生产级应用场景下的提示词也可以在这个初版提示词基础上进行迭代优化得到,能够大大降低编写提示词的任务量。
对 GPT 模型来说,标识符标识的层级结构实现了聚拢相同语义,梳理语义的作用,降低了模型对提示词的理解难度,便于模型理解提示词语义。
属性词实现了对提示词内容的语义提示和归纳作用,缓解了提示词中不当内容的干扰。 使用属性词与提示词内容相结合,实现了局部的总分结构,便于模型提纲挈领地获得提示词整体语义。
优势三:定向唤醒大模型深度能力
使用特定的属性词能够确保定向唤醒模型的深层能力。
实践发现,让模型扮演某个角色能大大提高模型表现,所以一级标题设置的就是 Role(角色)属性词,直接将提示词固定为角色,确保定向唤醒模型的角色扮演能力。也可使用 Expert(专家)、Master(大师)等属性词替代 Role,将提示词固定为某一领域专家。
再比如 Rules,规定了模型必须尽力去遵守的规则。比如在这里添加不准胡说八道的规则,缓解大模型幻觉问题。添加输出内容必须积极健康的规则,缓解模型输出不良内容等。用 Constraints(约束)、中文的规则等词替代也可。
下面是示例提示词中使用到的一些属性词介绍:
# Role: 设置角色名称,一级标题,作用范围为全局
## Profile: 设置角色简介,二级标题,作用范围为段落
- Author: yzfly 设置 Prompt 作者名,保护 Prompt 原作权益
- Version: 1.0 设置 Prompt 版本号,记录迭代版本
- Language: 中文 设置语言,中文还是 English
- Description: 一两句话简要描述角色设定,背景,技能等
### Skill: 设置技能,下面分点仔细描述
1. xxx
2. xxx
## Rules 设置规则,下面分点描述细节
1. xxx
2. xxx
## Workflow 设置工作流程,如何和用户交流,交互
1. 让用户以 "形式:[], 主题:[]" 的方式指定诗歌形式,主题。
2. 针对用户给定的主题,创作诗歌,包括题目和诗句。
## Initialization 设置初始化步骤,强调 prompt 各内容之间的作用和联系,定义初始化行为。
作为角色 <Role>, 严格遵守 <Rules>, 使用默认 <Language> 与用户对话,友好的欢迎用户。然后介绍自己,并告诉用户 <Workflow>。
好的属性词也很关键,你可以定义、添加、修改自己的属性词。
优势四:像代码开发一样构建生产级提示词
代码是调用机器能力的工具,提示词是调用大模型能力的工具。提示词越来越像新时代的编程语言。 这一观点我在之前的文章中也提过,并获得了许多朋友的认同。
在生产级 AIGC 应用的开发中,结构化提示词使得提示词的开发也像代码开发一样有规范。 结构化提示词的规范可以多种多样,用 JSON、YAML 实现都可以,GitHub 用户 ZhangHanDong 甚至还专门为提示词设计了描述语言 prompt-description-language。
结构化提示词的这些规范,这些模块化设计,能够大大方便提示词后续的维护升级,也方便多人协同开发设计。 这一点程序员群体应该深有感受。
想象一下,你是某公司一名提示词工程师,某一个或多个提示词因为某些原因(前任离职或调岗)需要你负责维护升级,你是更喜欢面对结构化的提示词还是非结构化的提示词呢?结构化提示词是自带使用文档的,十分清晰明了。
再比如要设计的应用是由许多智能体(agent,各由不同的提示词调用大模型能力实现)组成的链(chain)实现的,当团队一起开发这个应用,每个人都负责某一个智能体的开发,上下游之间如何协同呢?数据接口如何定义呢?采用结构化模块化设计只需要在提示词里添加 Input(输入)和 Output(输出)模块,告诉大模型接收的输入是怎样的,需要以怎样的方式输出即可,十分便利。固定输入输出后,各开发人员完成自己的智能体开发工作即可。
像复用代码一样复用提示词。 对于某些常用的模块,比如 Rules 是不是可以像复用代码一样实现提示词的复用?是不是可以像面向对象的编程一样复用某些基础角色?LangGPT 提供的提示词生成助手某种意义上就是自动化地实现了基础角色的复用。
同时提示词作为一种文本,也完全可以使用 Git 等工具像管理代码一样对提示词进行版本管理。
如何写好结构化提示词?
当我们在谈提示词的结构的时候,我们在谈什么?
当我们构建结构化提示词的时候,我们在构建什么?什么是真正重要的事情?
构建全局思维链
在大模型的提示词中应用 CoT 思维链方法的有效性,已经被研究和实践广泛证明。
一个好的结构化提示词模板,某种意义上是构建了一个好的全局思维链。 如 LangGPT 中展示的模板设计时就考虑了如下思维链:
Role (角色) -> Profile(角色简介)-> Profile 下的 skill (角色技能) -> Rules (角色要遵守的规则) -> Workflow (满足上述条件的角色的工作流程) -> Initialization (进行正式开始工作的初始化准备) -> 开始实际使用
一个好的提示词,内容结构上最好也是逻辑清晰连贯的。结构化提示词方法将久经考验的逻辑思维链路融入了结构中,大大降低了思维链路的构建难度。
构建提示词时,不妨参考优质模板的全局思维链路,熟练掌握后,完全可以对其进行增删改留调整得到一个适合自己使用的模板。例如当你需要控制输出格式,尤其是需要格式化输出时,完全可以增加 Output 或者 OutputFormat 这样的模块(可参考附录中的 AutoGPT 模板)。例如即友 李继刚 就构建了很多结构化提示词,其他修改同理。
编者注:原文附录收录的第三方模板(包括这里提到的 AutoGPT 模板)本站未收录。
保持上下文语义一致性
包含两个方面,一个是格式语义一致性,一个是内容语义一致性。
格式语义一致性是指标识符的标识功能前后一致。 最好不要混用,比如 # 既用于标识标题,又用于标识变量这种行为就造成了前后不一致,这会对模型识别提示词的层级结构造成干扰。
内容语义一致性是指思维链路上的属性词语义合适。 例如 LangGPT 中的 Profile 属性词,原来是 Features,但实践+思考后我更换为了 Profile,使之功能更加明确:即角色的简历。结构化提示词思想被诸多朋友广泛使用后衍生出了许许多多的模板,但基本都保留了 Profile 的诸多设计,说明其设计是成功有效的。
为什么前期会用 Features 呢?因为 LangGPT 的结构化思想受到了 AI-Tutor 项目的很大启发,而 AI-Tutor 项目中并无 Profile 一说,与之功能近似的是 Features。但 AI-Tutor 项目中的提示词过于复杂,并不通用。为形成一套简单有效且通用的提示词构建方法,我参考 AutoGPT 中的提示词,结合自己对提示词的理解,提出了 LangGPT 中的结构化思想,重新设计并构建了 LangGPT 中的结构化模板。
内容语义一致性还包括属性词和相应模块内容的语义一致。 例如 Rules 部分是角色需要遵守的规则,则不宜将角色技能、描述大量堆砌在此。
有机结合其他提示词技巧
结构化提示词编写思想是一种方法,与 CoT、ToT、Think step by step 等其他技巧和方法并不冲突,构建高质量提示词时,将这些方法结合使用,结构化方式能够更便于各个技巧间的协同组织,例如 刘海同学 就把 CoT 方法融合进了结构化提示词。
编者注:原文这里还引用了一段知乎想法中的“提高复杂任务表现的方法汇总”,原作者未能确认,本站略去。
结构化提示词对不同模型的适用性
编者注:这一节写于 2023 年 7 月,比较的是当时的 GPT-4、Claude 和 GPT-3.5,具体结论已经过时。本站把它压缩成下面几条要点,并略去原文所附的 GPT-3.5 版 LangGPT 助手提示词。
- 一两句话的简单提示词,在不同模型上表现差不多;任务和提示词越复杂,模型之间的差别越明显。
- 结构化提示词要求模型能较好地遵循指令、识别层级结构。作者当时的体会是:能力强的模型表现稳定,能力弱的模型容易时好时坏。
- 在较弱的模型上效果不好时,作者的建议是减少结构层级(比如只用两层)、换用更直白的属性词(比如 Goals、Constraints),再根据实际输出反复修改。
- 总的看法:模型能力够用时,结构化确实能提升效果;不合实际需要时,还是要靠调试来改。
结构化提示词的开发工作流
日常使用时,直接问 ChatGPT 效果可以的话,直接问就行。
构建复杂高性能结构化提示词有以下几种工作流:
- 自动化生成初版结构化提示词 -> 手工迭代调优 -> 符合需求的提示词(推荐)
- 自动化生成初版结构化提示词 -> 自动化分析评估提示词 -> 基于评估结果迭代调优 -> 符合需求的提示词(推荐)
- 手工套用现有模板 -> 手工迭代调优 -> 符合需求的提示词
1、2 较为推荐,能够大大降低工作量,大佬请随意。
自动化生成初版结构化提示词推荐使用 LangGPT,使用其他提示词生成方法也可。
自动化分析评估提示词,可以使用专门给提示词评分、做分析的提示词,可参考 AI Prompt 群精选——Prompt 优化 中的高质量提示词。
编者注:原文这里附有一份由社区成员编写的“Prompt 工程师”提示词,版权属于其作者,本站未收录。
结构化提示词的局限性
结构化提示词依赖于基座模型能力,并不能解决模型本身的问题,结构化提示词并不能突破大模型提示词方法本身的局限性。
已知的无法解决的问题:
- 大模型本身的幻觉问题
- 大模型本身知识老旧问题
- 大模型的数学推理能力弱问题(解数学问题)
- 大模型的视觉能力弱问题(构建 SVG 矢量图等场景)
- 大模型字数统计问题(不论是字符数还是 token 数,大模型都无法统计准确。需要输出指定字数时,将数值设定得高一些,后期自己调整一下,比如希望它输出 100 字文案,就告诉它输出 150 字。)
- 同一提示词在不同模型间的性能差异问题
- 其他已知问题等
结语
文无定法,贵在得法。写好提示词关键在于找到适合自己的方法。结构化提示词只是一种思路,并非绝对,完全可能随着大模型自身能力发展而变化,甚至被淘汰。实践中,只要能满足你的需求,能够让你又快又好地编写出高性能提示词,就是好的提示词方法!