✈️ 前言
👋Hi,大家好,我是Baird
前段时间我分享了三篇不错的的Prompt
同时推出了我制作的一款Prompt分发工具 ssprompt 欢迎star~ ✨ 谢谢~
结合最近对Prompt学习的一些感受,分享一下自己对Prompt的一点经验心得
📄 结构化Prompt
最早接触 Prompt engineering 时, 学到的 Prompt 技巧都是:
- 你是一个 XX 角色…
- 你是一个有着 X 年经验的 XX 角色…
- 你会 XX, 不要 YY..
- 对于你不会的东西, 不要瞎说!
- …
对比什么技巧都不用, 直接像使用搜索引擎一样提问, 上面的技巧对于回复的效果确实有着 明显提升. 在看了 N 多的所谓 “必看的 Prompt 10 大技巧” “价值 2 万元的珍藏 Prompt” 后, 发现大家都在上面这些技巧上打转. 直到有一天, 在 Github 上看到了 JushBJJ/Mr.-Ranedeer-AI-Tutor , 才发现原来 Prompt 还可以这样写: 原来可以在运行中 调整各种变量并立即生效, 原来对话语言可以随时更改, 原来可以像编程一样, 提前预置好 命令供用户调用…
国内部分Prompt engineer对这类Prompt进行很多拆解分析,总结的第一个也是最关键的技巧就是-- 结构化 Prompt
像LangGPT项目总结了一套结构化Prompt的方法和技巧
💡 LangGPT结构化Prompt
结构化: 对信息进行组织, 使其遵循特定的模式和规则, 从而方便有效理解信息.
– by GPT 4
结构化 Prompt 的思想通俗点来说就是像写文章一样写 Prompt。
为了阅读、表达的方便,我们日常有各种写作的模板,用来控制内容的组织呈现形式。例如古代的八股文、现代的简历模板、学生实验报告模板、论文模板等等模板。所以结构化编写 Prompt 自然也有各种各样优质的模板帮助你把 Prompt 写的更轻松、性能更好。所以写结构化 Prompt 可以有各种各样的模板,你可以像用 PPT 模板一样选择或创造自己喜欢的模板
我们来看一下LangGPT的定义的结构化Prompt基本框架
-
语法 这个结构支持 Markdown 语法, 也支持 YAML 语法, 甚至纯文本手动敲空格和回车都可以.
-
结构 结构中的信息, 可以根据自己需要进行增减, 从中总结的常用模块包括:
- # Role: : 指定角色会让 GPT 聚焦在对应领域进行信息输出
- ## Profile author/version/description : Credit 和 迭代版本记录
- ## Goals: 一句话描述 Prompt 目标, 让 GPT Attention 聚焦起来
- ## Constrains: 描述限制条件, 其实是在帮 GPT 进行剪枝, 减少不必要分支的计算
- ## Skills: 描述技能项, 强化对应领域的信息权重
- ## Workflow: 重点中的重点, 你希望 Prompt 按什么方式来对话和输出
- # Initialization: 冷启动时的对白, 也是一个强调需注意重点的机会
用来生成prompt的meta prompt
----------------
## Role : [请填写你想定义的角色名称]
## Background : [请描述角色的背景信息,例如其历史、来源或特定的知识背景]
## Preferences : [请描述角色的偏好或特定风格,例如对某种设计或文化的偏好]
## Profile :
- author: Arthur
- Jike ID: Emacser
- version: 0.2
- language: 中文
- description: [请简短描述该角色的主要功能,50 字以内]
## Goals :
[请列出该角色的主要目标 1]
[请列出该角色的主要目标 2]
...
## Constrains :
[请列出该角色在互动中必须遵循的限制条件 1]
[请列出该角色在互动中必须遵循的限制条件 2]
...
## Skills :
[为了在限制条件下实现目标,该角色需要拥有的技能 1]
[为了在限制条件下实现目标,该角色需要拥有的技能 2]
...
## Examples :
[提供一个输出示例 1,展示角色的可能回答或行为]
[提供一个输出示例 2]
...
## OutputFormat :
[请描述该角色的工作流程的第一步]
[请描述该角色的工作流程的第二步]
...
## Initialization : 作为 [角色名称], 拥有 [列举技能], 严格遵守 [列举限制条件], 使用默认 [选择语言] 与用户对话,友好的欢迎用户。然后介绍自己,并提示用户输入.
我们来看个实例
# Role:知识探索专家
## Profile:
- author: Arthur
- version: 0.8
- language: 中文
- description: 我是一个专门用于提问并解答有关特定知识点的 AI 角色。
## Goals:
提出并尝试解答有关用户指定知识点的三个关键问题:其来源、其本质、其发展。
## Constrains:
1. 对于不在你知识库中的信息, 明确告知用户你不知道
2. 你不擅长客套, 不会进行没有意义的夸奖和客气对话
3. 解释完概念即结束对话, 不会询问是否有其它问题
## Skills:
1. 具有强大的知识获取和整合能力
2. 拥有广泛的知识库, 掌握提问和回答的技巧
3. 拥有排版审美, 会利用序号, 缩进, 分隔线和换行符等等来美化信息排版
4. 擅长使用比喻的方式来让用户理解知识
5. 惜字如金, 不说废话
## Workflows:
你会按下面的框架来扩展用户提供的概念, 并通过分隔符, 序号, 缩进, 换行符等进行排版美化
1.它从哪里来?
━━━━━━━━━━━━━━━━━━
- 讲解清楚该知识的起源, 它是为了解决什么问题而诞生。
- 然后对比解释一下: 它出现之前是什么状态, 它出现之后又是什么状态?
2.它是什么?
━━━━━━━━━━━━━━━━━━
- 讲解清楚该知识本身,它是如何解决相关问题的?
- 再说明一下: 应用该知识时最重要的三条原则是什么?
- 接下来举一个现实案例方便用户直观理解:
- 案例背景情况(遇到的问题)
- 使用该知识如何解决的问题
- optional: 真实代码片断样例
3.它到哪里去?
━━━━━━━━━━━━━━━━━━
- 它的局限性是什么?
- 当前行业对它的优化方向是什么?
- 未来可能的发展方向是什么?
# Initialization:
作为知识探索专家,我拥有广泛的知识库和问题提问及回答的技巧,严格遵守尊重用户和提供准确信息的原则。我会使用默认的中文与您进行对话,首先我会友好地欢迎您,然后会向您介绍我自己以及我的工作流程。
🔍 结构化Prompt有什么优势
我们看上面例子,其实不用结构化的方式也能表达,无非就是字段长一点。那结构化有什么优势呢?
1. 内容与形式统一, 提升语义认知
结构清晰,可读性好
结构化方式编写出来的 Prompt 层级结构十分清晰,将结构在形式上和内容上统一了起来,可读性很好。
Role (角色)作为 Prompt 标题统摄全局内容。Profile (简介)、Rules(规则)作为二级标题统摄相应的局部内容。Language、Description作为关键词统摄相应句子、段落。
这种方式写出来的 Prompt 符合人类的表达习惯,与我们日常写文章时有标题、段落、副标题、子段落等丰富的层级结构是一样的。
这种方式写出来的 Prompt 符合 ChatGPT 的认知习惯,因为 ChatGPT 正是在大量的文章、书籍中训练得到,其训练内容的层级结构本来就是十分丰富的。
提升语义认知
结构化表达同时降低了人和 GPT 模型的认知负担,大大提高了人和GPT模型对 prompt 的语义认知。 对人来说,Prompt 内容一目了然,语义清晰,只需要依样画瓢写 Prompt 就行。如果使用 LangGPT 提供的 Prompt 生成助手,还可以帮你生成高质量的初版 Prompt。
生成的初版 Prompt 足以应对大部分日常场景,生产级应用场景下的 prompt 也可以在这个初版 prompt 基础上进行迭代优化得到,能够大大降低编写 prompt 的任务量。
对 GPT 模型来说,标识符标识的层级结构实现了聚拢相同语义,梳理语义的作用,降低了模型对 Prompt 的理解难度,便于模型理解 prompt 语义。
属性词实现了对 prompt 内容的语义提示和归纳作用,缓解了 Prompt 中不当内容的干扰。 使用属性词与 prompt 内容相结合,实现了局部的总分结构,便于模型提纲挈领的获得 prompt 整体语义。
2. 定向唤醒大模型深度能力
实践发现让模型扮演某个角色其能大大提高模型表现,所以一级标题设置的就是 Role(角色) 属性词,直接将 Prompt 固定为角色,确保定向唤醒模型的角色扮演能力。也可使用 Expert(专家), Master(大师)等提示词替代 Role,将 Prompt 固定为某一领域专家。
再比如 Rules,规定了模型必须尽力去遵守的规则。比如在这里添加不准胡说八道的规则,缓解大模型幻觉问题。添加输出内容必须积极健康的规则,缓解模型输出不良内容等。用 Constraints(约束),中文的 规则 等词替代也可。
下面是示例 Prompt 中使用到的一些属性词介绍:
# 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>。
好的属性词也很关键,你可以定义、添加、修改自己的属性词。
3. 像代码开发一样构建生产级 Prompt
代码是调用机器能力的工具, Prompt 是调用大模型能力的工具。Prompt 越来越像新时代的编程语言。 这一观点我在之前的文章中也提过,并获得了许多朋友的认同。
在生产级 AIGC 应用的开发中,结构化 prompt 使得 prompt 的开发也像代码开发一样有规范。 结构化 Prompt 的规范可以多种多样,用 json,yaml 实现都可以,GitHub 用户 ZhangHanDong([4]) 甚至还专门为 Prompt 设计了描述语言 prompt-description-language([5])。
结构化 Prompt 的这些规范,这些模块化设计,能够大大便利于 prompt 后续的维护升级,便利于多人协同开发设计。 这一点程序员群体应该深有感受。
想象一下,你是某公司一名 prompt 工程师,某一个或多个 prompt 因为某些原因(前任离职或调岗)需要你负责维护升级,你是更喜欢面对结构化的 Prompt 还是非结构化的 Prompt 呢?结构化 Prompt 是自带使用文档 的,十分清晰明了。
再比如要设计的应用是由许多 agents (由不同的 prompt 调用大模型能力实现)构建的 chain 实现的,当团队一起开发这个应用,每个人都负责某一 agents 的开发,上下游之间如何协同呢?数据接口如何定义呢?采用结构化模块化设计只需要在 prompt 里添加 Input (输入)和 Output(输出)模块,告诉大模型接收的输入是怎样的,需要以怎样的方式输出即可,十分便利。固定输入输出后,各开发人员完成自己的 agent 开发工作即可。
像复用代码一样复用 Prompt。 对于某些常用的模块,比如 Rules 是不是可以像复用代码一样实现 Prompt 的复用?是不是可以像面向对象的编程一样复用某些基础角色?LangGPT 提供的 Prompt 生成助手某种意义上就是自动化的实现了基础角色的复用。
同时 Prompt 作为一种文本,也完全可以使用 Git 等工具像管理代码一样对 prompt 进行版本管理。
🔚 结尾
理解了结构化Prompt,快去尝试用结构化思维去编写Prompt吧~
想要了解更多结构化Prompt知识,可以访问LangGPT项目地址:github.com/yzfly/LangG…