大模型_2.1:Prompt进阶
目录:
- 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 时,将这些方法结合使用,结构化方式能够更便于各个技巧间的协同组织,汇总现有的一些方法:
- 1. 细节法:给出更清晰的指令,包含更多具体的细节
- 2. 分解法:将复杂的任务分解为更简单的子任务 (Let's think step by step, CoT,LangChain等思想)
- 3. 记忆法:构建指令使模型时刻记住任务,确保不偏离任务解决路径(system 级 prompt)
- 4. 解释法:让模型在回答之前进行解释,说明理由 (CoT 等方法)
- 5. 投票法:让模型给出多个结果,然后使用模型选择最佳结果 (ToT 等方法)
- 6. 示例法:提供一个或多个具体例子,提供输入输出示例 (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.只要给了示例,即使随机的标签,对于模型生成结果来说,都是有帮助的。这就是前面论文里提到的内容。
- 3. 最后,需要记住,思维链仅在使用大于等于 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个,问题还剩余多少个?
参考资料
大模型_2.1:Prompt进阶的更多相关文章
- Java 内存模型_2
title: Java 内存模型_2 date: 2017-01-28 02:04:06 tags: [JMM] categories: [Programming,Java] --- Why 理解 J ...
- 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅
摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...
- 文心大模型api使用
文心大模型api使用 首先,我们要获取硅谷社区的连个key 复制两个api备用 获取Access Token 获取access_token示例代码 之后就会输出 作文创作 作文创作:作文创作接口基于文 ...
- 无插件的大模型浏览器Autodesk Viewer开发培训-武汉-2014年8月28日 9:00 – 12:00
武汉附近的同学们有福了,这是全球第一次关于Autodesk viewer的教室培训. :) 你可能已经在各种场合听过或看过Autodesk最新推出的大模型浏览器,这是无需插件的浏览器模型,支持几十种数 ...
- 大数据学习之Linux进阶02
大数据学习之Linux进阶 1-> 配置IP 1)修改配置文件 vi /sysconfig/network-scripts/ifcfg-eno16777736 2)注释掉dhcp #BOOTPR ...
- PowerDesigner 学习:十大模型及五大分类
个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...
- PowerDesigner 15学习笔记:十大模型及五大分类
个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...
- AI大模型学习了解
# 百度文心 上线时间:2019年3月 官方介绍:https://wenxin.baidu.com/ 发布地点: 参考资料: 2600亿!全球最大中文单体模型鹏城-百度·文心发布 # 华为盘古 上线时 ...
- 千亿参数开源大模型 BLOOM 背后的技术
假设你现在有了数据,也搞到了预算,一切就绪,准备开始训练一个大模型,一显身手了,"一朝看尽长安花"似乎近在眼前 -- 且慢!训练可不仅仅像这两个字的发音那么简单,看看 BLOOM ...
- DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍
DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍 1. 概述 近日来,ChatGPT及类似模型引发了人工智能(AI)领域的一场风潮. 这场风潮对数字世 ...
随机推荐
- Java 本月、上月第一天和最后一天
//本月 @Test public void test01() { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd&qu ...
- KingbaseES中查询对象大小的SQL及函数区别
--查看所有数据库大小 select sys_database.datname, sys_size_pretty(sys_database_size(sys_database.datname)) AS ...
- sql语句TRUNCATE 清空表数据
清空表数据 TRUNCATE TABLE zzsfp_hwmx;
- 基于Java NIO 写的一个简单版 Netty 服务端
A Simple Netty Based On JAVA NIO 基于Java NIO 写的一个简单版 Netty 服务端 前置知识 NIO NIO 一般指 同步非阻塞 IO,同样用于**描述程序访问 ...
- 5 更换npm为国内镜像
更改npm为国内镜像 在终端执行. npm set registry http://registry.npmmirror.com 首先, 打开"我的电脑". 找到"c盘中 ...
- #根号分治,分块,dfs序#洛谷 7710 [Ynoi2077] stdmxeypz
题目传送门 分析 首先把距离变成深度,用dfs序转成区间问题,考虑分块,散块直接改 问题是整块,如果模数比较大,可以以深度为第一维下标差分标记,这样查询时就可以前缀和知道答案 如果模数比较小,那么给该 ...
- #trie,动态规划#洛谷 2292 [HNOI2004]L语言
题目 分析 建一棵trie,然后匹配最长前缀可以用\(dp\)做, 如果这个位置可以被匹配到那么可以从这个位置继续匹配 代码 #include <cstdio> #include < ...
- #排列组合,容斥#洛谷 5684 [CSPJX2019]非回文串
题目 分析 那显然就是\(n!\)减去回文串的方案数 首先如果有超过一个出现奇数次字母那肯定不存在回文串 如果有且仅有一个首先要在次数中选择一个然后其它当偶数处理 偶数那就是首先字母位置选好但顺序可以 ...
- 来自上个世纪的传奇 q_math.c 源码展示
经典的快速平方根倒数算法就在其中 此算法首先接收一个32位带符浮点数,然后将之作为一个32位整数看待,将其右移一次(取半),并用十六进制"魔术数字"0x5f3759df减之,如此即 ...
- Java 数据类型详解与类型转换技巧
Java 数据类型 Java 中的变量必须是指定的数据类型: int myNum = 5; // 整数 float myFloatNum = 5.99f; // 浮点数 char myLetter = ...