简介
Prompt(提示),最初是 NLP 研究者为下游任务设计出来的一种任务专属的输入形式或模板。在 ChatGPT 引发大语言模型新时代之后,Prompt 指与大模型交互输入的代称。
随着大模型的进展,Prompt Engineering是一个持久的探索过程。本文主要概括了我这段时间学习prompt的一些心得,和一些简单的大模型的入门知识,更详细深入的大模型相关知识,可以看下本博客下的大模型专题知识。
我们一般将给大模型的输入称为 Prompt,将大模型返回的输出称为 Completion
大模型
大模型指的是那些比传统模型具有更多参数的机器学习模型,它们的训练需要大量的数据和强大的计算资源。由于模型的复杂度提高,它们通常具有更好的性能和更强的泛化能力。
大语言模型
大语言模型(Large language model,简称LLM)是指具有海量参数的神经网络语言模型,它通过大型的神经网络对人类的自然语言数据训练得到。ChatGPT 的出现,不仅证明了大型语言模型能近乎完美的处理和理解人类的自然语言,更让我们看到了实现通用人工智能(AGI)的希望。
或者从语言模型发展的角度,来看大语言模型的进展。
一些必要的知识点
生成式模型
大语言模型(LLM)是通过预测下一个词的监督学习方式进行训练的。具体来说,首先准备一个包含数百亿甚至更多词的大规模文本数据集。然后,可以从这些文本中提取句子或句子片段作为模型输入。模型会根据当前输入 Context 预测下一个词的概率分布。通过不断比较模型预测和实际的下一个词,并更新模型参数最小化两者差异,语言模型逐步掌握了语言的规律,学会了预测下一个词。
这里主要说明LLM如何对输入进行推理。
[流程图]
模型中的 token
到目前为止对 LLM 的描述中,我们将其描述为一次预测一个单词,但实际上还有一个更重要的技术细节。即 LLM 实际上并不是重复预测下一个单词,而是重复预测下一个 token 。对于一个句子,语言模型会先使用分词器将其拆分为一个个 token ,而不是原始的单词。对于生僻词,可能会拆分为多个 token 。这样可以大幅降低字典规模,提高模型训练和推断的效率。
token 是自然语言处理的最细粒度。简单点说就是,大语言模型的输入是一个个的 token,输出也是一个个的 token。
GPT4的词表token大小为100255,部分中文token如下表所示:
“59795”: “中国”
“73958”: " 中"
“16325”: “中”
“29504”: “国”
复杂的中文需要使用多个token表示,如上图的“全聚德”,在gpt中会转化为
模型部署中的一些参数
这里简单介绍下openai的接口(https://api.openai.com/v1/completions)设置中的可调解参数(其余大模型也类似) 。下图为LLama模型部署后的常用超参数
这里是chatgpt的详细接口可调节参数 openai API
参数 | 释义 | 备注 |
---|---|---|
max_tokens | 完成时要生成的最大token数 | |
temperature | 使用什么样的采样温度,介于0和2之间。值越高(如0.8),输出越随机,而值越低(如0.2),输出就越集中和确定 | 和top-p不建议同时更改 |
top_k | 每次采样的样本数量 | |
top_p | 一种替代温度采样的方法,称为核采样,其中模型考虑具有top_p概率质量的token的结果。因此,0.1意味着只考虑包含前10%概率质量的代币 | 和温度参数不建议同时更改 |
为了详细介绍不同的参数,了解不同解码方式的差别,我们通过文章:top_p和temperature介绍。进行详细的探究。
Prompt原则
Prompt 公式通常由三个主要元素组成:
任务:对提示要求模型生成的内容进行清晰而简洁的陈述。
指令:在生成文本时模型应遵循的指令。
角色:模型在生成文本时应扮演的角色。
也可拆解为:
prompt = 角色 + 任务 + 要求 + 提示【步骤拆解、范例说明,技巧点拨等】
即是谁?要做什么?要做成什么样?要怎么做?
一个简单的Prompt示例(只描述任务),目标为生成法律文件。
生成法律文件:
任务:生成法律文件
指令:文件应符合相关法律法规
提示公式:“按照以下指示生成符合相关法律法规的法律文件:文件应符合相关法律法规。”
角色提示技术是通过为ChatGPT指定一个特定的角色来引导其输出的一种方式。这种技术对于生成针对特定上下文或受众的文本非常有用。
要使用角色提示技术,您需要为模型提供一个清晰具体的角色。
生成法律文件:
任务:生成法律文件
角色:律师
提示公式:“作为律师,生成法律文件。”
种子词: 可以对任务的侧重点进行强调。将角色提示技术与指令提示和种子词提示结合使用可以增强ChatGPT的输出。
下面是一个示例,展示了如何将指令提示、角色提示和种子词提示技术结合使用
任务:为新智能手机生成产品描述
指令:描述应该是有信息量的,具有说服力,并突出智能手机的独特功能
角色:市场代表
种子词:创新的
提示公式:“作为市场代表,生成一个有信息量的、有说服力的产品描述,突出新智能手机的创新功
能。该智能手机具有以下功能[插入您的功能]”
在这个示例中,指令提示用于确保产品描述具有信息量和说服力。角色提示用于确保描述是从市场代表的角度书写的。而种子词提示则用于确保描述侧重于智能手机的创新功能。
任务:为一台新笔记本电脑撰写产品评论
说明:评论应客观、信息丰富,强调笔记本电脑的独特特点
角色:技术专家
种子词:“强大的”
提示公式:“作为一名技术专家,生成一个客观而且信息丰富的产品评论,强调新笔记本电脑的强大特点。”
在这个示例中,标准提示技术用于确保模型生成产品评论。角色提示用于确保评论是从技术专家的角度写的。而种子词提示用于确保评论侧重于笔记本电脑的强大特点。
编写清晰、具体的指令
在许多情况下,更长、更复杂的 Prompt 反而会让语言模型更容易抓住关键点,给出符合预期的回复。原因在于,复杂的 Prompt 提供了更丰富的上下文和细节,让模型可以更准确地把握所需的操作和响应方式。
使用分隔符清晰地表示输入的不同部分
在编写 Prompt 时,使用各种标点符号作为“分隔符”,将不同的文本部分区分开来。可以选择用 ```,""",< >,
使用分隔符的重要作用是: 可以防止 提示词注入(Prompt Rejection)
**提示词注入: **用户输入的文本可能包含与你的预设 Prompt 相冲突的内容,如果不加分隔,这些输入就可能“注入”并操纵语言模型,导致模型产生毫无关联的乱七八糟的输出。
下面示例演示使用ChatGpt(3.5版本)与llama2 13b及文心一言的模型做效果的展示
| | ##### ChatGpt
| ##### llama2-13b
| ##### 文心一言
Prompt |
Completion |
Prompt |
Completion |
可以看到我们的prompt目的是翻译translate text to french (hello)
, 但模型将hello翻译为了法语。
加入分隔符后,可以正确的将整句进行翻译。
结构化的输出
这种输出非常适合在代码中进一步解析和处理
如下面示例,使用json格式进行输出:
| | ##### ChatGpt3.5
| ##### llama2-13b
| ##### 文心一言
Prompt |
Completion |
“文件名”: “新时代中国特色社会主义思想学习问答.pdf”,
“文件夹名”: “合成成功/合成成功/2021中国特色”
}
“文件名”: “新时代中国特色社会主义思想学习问答.pdf”,
“文件夹名”: [ “合成成功”, “合成成功”, “2021中国特色” ]
}
要求模型检查是否满足条件
如果任务包含不一定能满足的假设(条件),我们可以告诉模型先检查这些假设,如果不满足,则会指出并停止执行后续的完整流程。还可以考虑可能出现的边缘情况及模型的应对,以避免意外的结果或错误发生。
| | ##### ChatGpt3.5
| ##### llama2-13b
| ##### 文心一言
Prompt |
Completion |
Prompt |
Completion |
Prompt |
Completion |
以下是以JSON格式输出的判断结果:
1 | json |
“结果”: “不符合”
}
以下是以JSON格式输出的判断结果:
json
Copy code
{
“结果”: “符合广告法规定”
}
请注意,我根据文本的表达进行了初步判断。广告法的具体规定可能因地区和法规而异。如果您有其他需要处理的文本或问题,请随时提问。
“结果”: “不符合”
}
以下是以JSON格式输出的判断结果:
请注意,我根据文本的表达进行了初步判断。如果您有其他需要处理的文本或问题,请随时提问。
1 | json |
“结果”: “未知”
}
提供少量示例
| | ##### ChatGpt3.5
| ##### llama2-13b
| ##### 文心一言
Prompt |
Completion |
<孩子>: 请教我何为耐心。
<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。
<孩子>: 请教我何为韧性。
<孩子>: 请教我
给予模型充足思考时间
语言模型与人类一样,需要时间来思考并解决复杂问题。如果让语言模型匆忙给出结论,其结果很可能不准确。例如,若要语言模型推断一本书的主题,仅提供简单的书名和一句简介是不足够的。
我们应通过 Prompt 指引语言模型进行深入思考。可以要求其先列出对问题的各种看法,说明推理依据,然后再得出最终结论。在 Prompt 中添加逐步推理的要求,能让语言模型投入更多时间逻辑思维,输出结果也将更可靠准确。
这里我们详细看一篇使用顺序Prompt链的文本分类的文章,其中也涉及一些设计prompt的消融实验。
Text Classification via Large Language Models
Few-shot 的样本质量对 LLMs 的 in-context learning (ICL) 很重要,这里也有很多文章针对这个问题做研究。例如,利用主动学习对标注样本做筛选Active Learning Principles for In-Context Learning with Large Language Models
标签设置对预测结果影响的论文:IN-CONTEXT LEARNING IN LARGE LANGUAGE MODELS LEARNS LABEL RELATIONSHIPS BUT IS NOT CONVENTIONAL LEARNING
目前in-context或者prompt是研究的热点方向。
指导模型在下结论之前找出一个自己的解法
在设计 Prompt 时,我们还可以通过明确指导语言模型进行自主思考,来获得更好的效果。
举个例子,假设我们要语言模型判断一个数学问题的解答是否正确。仅仅提供问题和解答是不够的,语言模型可能会匆忙做出错误判断。
相反,我们可以在 Prompt 中先要求语言模型自己尝试解决这个问题,思考出自己的解法,然后再与提供的解答进行对比,判断正确性。这种先让语言模型自主思考的方式,能帮助它更深入理解问题,做出更准确的判断。
迭代优化
在开发大语言模型应用时,很难通过第一次尝试就得到完美适用的 Prompt。但关键是要有一个良好的迭代优化过程,以不断改进 Prompt。
有了任务想法后,可以先编写初版 Prompt,注意清晰明确并给模型充足思考时间。运行后检查结果,如果不理想,则分析 Prompt 不够清楚或思考时间不够等原因,做出改进,再次运行。如此循环多次,终将找到适合应用的 Prompt。
从产品说明书生成营销产品描述
给定一份椅子的资料页。描述说它属于_中世纪灵感_系列,产自意大利,并介绍了材料、构造、尺寸、可选配件等参数。假设您想要使用这份说明书帮助营销团队为电商平台撰写营销描述稿:
概述
美丽的中世纪风格办公家具系列的一部分,包括文件柜、办公桌、书柜、会议桌等。
多种外壳颜色和底座涂层可选。
可选塑料前后靠背装饰(SWC-100)或10种面料和6种皮革的全面装饰(SWC-110)。
底座涂层选项为:不锈钢、哑光黑色、光泽白色或铬。
椅子可带或不带扶手。
适用于家庭或商业场所。
符合合同使用资格。
结构
五个轮子的塑料涂层铝底座。
气动椅子调节,方便升降。
尺寸
宽度53厘米|20.87英寸
深度51厘米|20.08英寸
高度80厘米|31.50英寸
座椅高度44厘米|17.32英寸
座椅深度41厘米|16.14英寸
选项
软地板或硬地板滚轮选项。
两种座椅泡沫密度可选:中等(1.8磅/立方英尺)或高(2.8磅/立方英尺)。
无扶手或8个位置PU扶手。
材料
外壳底座滑动件
改性尼龙PA6/PA66涂层的铸铝。
外壳厚度:10毫米。
座椅
HD36泡沫
原产国
意大利
初始提示
prompt =您的任务是帮助营销团队基于技术说明书创建一个产品的营销描述。
根据标记的技术说明书中提供的信息,编写一个产品描述。 技术说明:
{input}
1 | 生成如下文本: |
产品描述:
我们自豪地推出美丽的中世纪风格办公家具系列,其中包括文件柜、办公桌、书柜、会议桌等。我们的产品采用多种外壳颜色和底座涂层,以满足您的个性化需求。您可以选择塑料前后靠背装饰(SWC-100)或10种面料和6种皮革的全面装饰(SWC-110),以使您的办公室更加舒适和时尚。
我们的底座涂层选项包括不锈钢、哑光黑色、光泽白色或铬,以满足您的不同需求。椅子可带或不带扶手,适用于家庭或商业场所。我们的产品符合合同使用资格,为您提供更加可靠的保障。
我们的产品采用五个轮子的塑料涂层铝底座,气动椅子调节,方便升降。尺寸为宽度53厘米|20.87英寸,深度51厘米|20.08英寸,高度80厘米|31.50英寸,座椅高度44厘米|17.32英寸,座椅深度41厘米|16.14英寸,为您提供舒适的使用体验。
我们的产品还提供软地板或硬地板滚轮选项,两种座椅泡沫密度可选:中等(1.8磅/立方英尺)或高(2.8磅/立方英尺),以及无扶手或8个位置PU扶手,以满足您的不同需求。
我们的产品采用改性尼龙PA6/PA66涂层的铸铝外壳底座滑动件,外壳厚度为10毫米,座椅采用HD36泡沫,为您提供更加舒适的使用体验。我们的产品原产国为意大利,为您提供更加优质的品质保证。
1 | ### [解决生成文本太长](https://datawhalechina.github.io/prompt-engineering-for-developers/#/C1/3.%20%E8%BF%AD%E4%BB%A3%E4%BC%98%E5%8C%96%20Iterative?id=_12-%e6%8f%90%e7%a4%ba%e4%bc%98%e5%8c%961-%e8%a7%a3%e5%86%b3%e7%94%9f%e6%88%90%e6%96%87%e6%9c%ac%e5%a4%aa%e9%95%bf) |
生成如下文本
中世纪风格办公家具系列,包括文件柜、办公桌、书柜、会议桌等。多种颜色和涂层可选,可带或不带扶手。底座涂层选项为不锈钢、哑光黑色、光泽白色或铬。适用于家庭或商业场所,符合合同使用资格。意大利制造。
进一步优化
进一步分析会发现,该椅子面向的其实是家具零售商,而不是终端消费者。所以生成的文案中过多强调风格、氛围等方面,而较少涉及产品技术细节,与目标受众的关注点不太吻合。这时候我们就可以继续调整 Prompt,明确要求语言模型生成面向家具零售商的描述,更多关注材质、工艺、结构等技术方面的表述。
prompt =您的任务是帮助营销团队基于技术说明书创建一个产品的营销描述。
根据标记的技术说明书中提供的信息,编写一个产品描述。**该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。**使用最多50个词。 技术说明:
{input}
1 | 可能进一步想要在描述的结尾展示出产品 ID。因此,我可以进一步改进这个 Prompt ,要求在描述的结尾,展示出说明书中的7位产品 ID。 |
第一步:了解背景Prompt:“请简要描述这个法律问题的背景和主要矛盾点。”
第二步:相关法律和案例Prompt:“在这个法律背景下,有哪些相关的法律条款或先例案例?”
第三步:应用法律到具体问题Prompt:“这些法律条款或案例如何应用于我的具体问题?有没有可能的解释或者争议点?”
第四步:可能的解决方案Prompt:"根据以上的信息,最可能的解决方案或建议是什么
1 | 下面是一个关于故事生成的示例。在这里想要生成一个长故事,其中包含由一组信息(人物、故事节奏和地点)引导的对话。 现在,可以将所有这些信息填充到一个提示中,但这可能会淡化我们希望对话框包含的关键细节。 |
Prompt={“根据“食材成分”将食材合并成一个单一的购物清单,不要重复。”}
### **循环Prompt链**
在某些应用程序中,考虑到后续步骤中发生的情况,我们可能需要重新运行生成步骤。
一个例子是,后续步骤用于检查生成的响应是否满足特定标准,例如质量和格式。这就是循环模式有用的地方。
翻译任务:
### **抽样Prompt方法**
思维链提示与预先训练的大型语言模型相结合,在复杂的推理任务中取得了令人鼓舞的结果。在本文中,我们提出了一种新的解码策略,自一致性,以取代思维链提示中使用的天真贪婪解码。它首先对一组不同的推理路径进行采样,而不是只采用贪婪的推理路径,然后通过边缘化采样的推理路径来选择最一致的答案。自我一致性利用了一种直觉,即复杂的推理问题通常允许多种不同的思维方式,从而得出独特的正确答案。我们广泛的实证评估表明,在一系列流行的算术和常识推理基准上,自我一致性以惊人的优势提高了思维链提示的性能。
参考:SELF-CONSISTENCY IMPROVES CHAIN OF THOUGHT REASONING IN LANGUAGE MODELS
### **树状Prompt链**
在每一步,模型都会生成几个不同的解决方案。 然后使用单独的提示来评估这些解决方案并投票选出最佳解决方案。重复该过程直到完成最后一步。
参考:Tree of Thoughts: Deliberate Problem Solving with Large Language Models
下图显示了初始输入,其中包含四个看似不相关的句子的列表 - 每个句子都讨论倒立、空间的气味、手语和人们的感知。 任务是将它们编织成一个连贯的段落。 它必须包含四个短段落,每个段落都以给定的句子结尾。
在此示例中,由于任务相当具有挑战性,因此将任务分为两部分是有意义的:编写计划和根据获胜计划编写实际段落。每一步,模型都会生成一些解决方案,然后使用另一个提示来评估和投票选出最佳解决方案,指导下一步的方向。上面屏幕截图中显示了几个写作计划选项,获胜的选项建议以自助为主题,将句子编织成连贯的段落。
#### 总结
在设计提示链时,我们并不需要也不建议将所有可能相关信息一次性全加载到模型中,而是采取动态、按需提供信息的策略,原因如下:
1. 过多无关信息会使模型处理上下文时更加困惑。尤其是低级模型,处理大量数据会表现衰减。
2. 模型本身对上下文长度有限制,无法一次加载过多信息。
3. 包含过多信息容易导致模型过拟合,处理新查询时效果较差。
4. 动态加载信息可以降低计算成本。
5. 允许模型主动决定何时需要更多信息,可以增强其推理能力。
6. 我们可以使用更智能的检索机制,而不仅是精确匹配,例如文本 Embedding 实现语义搜索。
因此,合理设计提示链的信息提供策略,既考虑模型的能力限制,也兼顾提升其主动学习能力,是提示工程中需要着重考虑的点。
## 参考:
[度学堂-基于大模型的Prompt开发课](http://learn.baidu.com/pages/index.html#/specialInfo?specialId=7716)
吴恩达《ChatGPT Prompt Engineering for Developers》教程
datawhale的总结课程
The Art of Asking ChatGPT for High-Quality Answers: A complete
如何向 ChatGPT 提问以获得高质量答案:提示技巧工程完全指南