ChatGPT Prompt Engineering for Developers
Related Information
LMS
LMS(large language models):大型语言模型
-
基本LMS(Base LLM):预测下一个词,基于文本训练数据集
示例1:
[输入]:从前有个独角兽
[输出]:生活在森林里
示例2:
[输入]:法国的首都是什么?
[输出]:法国最大的城市是什么?
-
指令调优LMS(Instruction Tuned LLM):试着按照指示微调指令并且尽可能遵循指令(语言模型研究和实践的动力所在)
示例1:
[输入]:法国的首都是什么?
[输出]:巴黎
典型训练方式:从一个基础指令开始,通过输入输出指令进一步训练,帮助它适应惩罚,尝试遵循指令;然后通常是使用一种叫做RLHF增强(Reinforcement Learning with Human Feedback)的技术进一步完善,从人类的反馈中学习,使系统更好地提供帮助并遵循指示
特征:Helpful、Honest、Harmless
API
openai的chatgpt接口:
Guidelines for Prompting
编写提示的两个关键原则:
- 编写明确且具体的说明(明确≠简短)
- 给予模型思考的时间
原则1
策略1:使用分隔符
'''
、"""
、---
、<>
、<tag></tag>
策略2:要求结构化输出
HTML
、JSON
策略3:检查任务的前提条件是否满足
考虑潜在的边缘情况或者意外情况,以及模型对他们的处理方式,避免意外的错误或结果
示例1
示例2
策略4:少量样本提示
给予完成案例的成功示例,然后让模型去执行任务
原则2
避免一个模型因为匆忙得出不正确的结论而产生推理错误。在模型给出最终答案之前,要求进行一系列相关的推理。
策略1:制定完成任务所需的步骤
进一步优化
策略2:引导模型在匆忙下结论前找到自己的解决方案
错误示例
正确示例
question相同,在question之前添加引导
结果
Model Limitations
幻觉(Hallucination)
在训练过程中,即使语言模型已经暴露在大量的知识中,它也没有完全记住它所看到的信息,所以它不太清楚自己知识的边界,这就意味着它可能会试图回答关于晦涩主题的问题并且编造一些听起来似是而非的事情(实际上并不是真的)
示例:对虚假产品的描述
应对措施:将答案追溯到源文档,依据相关信息回答问题
Iterative Prompt Development
关于迭代的快速开发过程
提示准则:
- 明确且具体
- 分析为什么结果没有给出预期的输出
- 完善思路和提示
- 重复上述过程
示例:
源文档(待处理的数据集):有关一把椅子的详细介绍。
[指令1]:帮助营销团队编写零售网站的描述,基于技术概况中提供的信息编写产品说明,这些信息由三个反勾号分隔
[结果1]:输出一段很详细的产品说明
[预期]:简短一些
[指令2]:指令1+“至多50个词语”
[结果2]:52个词语的产品说明(LLM的这个误差是可以接受的)
[预期]:网站浏览者对椅子的技术细节和椅子的材料更感兴趣
[指令3]:指令2+“该描述是为家具零售商准备的,因此应具有技术性,并侧重于产品的材料”
[结果3]:52个词语的产品说明,聚焦于材料和技术特征
[预期]:在结尾带上产品型号
[指令4]:指令3+“在描述结尾带上产品ID”
[结果4]:52个词语的产品说明,聚焦于材料和技术特征,以产品ID结尾
(结合之前的内容)
[指令5]:指令4+“生成一个表格,表名为xxx,一列为名称,一列为尺寸,并将所有的信息以HTML展示”
[结果5]:html代码
总结:迭代过程
- 尝试一些东西
- 分析没有达到预期的部分
- 明确细化指令,给模型更多的时间去思考
- 使用少量示例,精炼提示
Summarizing
普通总结
可以结合一些特定业务(比如总结给物价部门,重点关注商品价值等等)
可以只提取相关的关键信息(可以提高对长篇大论的阅读效率)
可以通过循环进行批量处理
Inferring
推断情感
一些模型把文本作为输入,并执行某种分析,然后提取标签、提取名称等等
也可以通过指令简化结果:
如果把数据换为一个电商购物平台,可以轻松手机大量的收藏评论信息:
(通过一个包含若干领域的提示符完成对不同领域关键信息的提取)
推断主题
数据是一段虚拟的报纸报道,有关nasa的工作感受,通过下面的指令提取主题
为了便于计算机处理我们可以加入个数值化指令(有时也称为零点学习算法):
Transforming
翻译语种
gpt的数据来源于大量的文本训练,这些输大多来源于互联网,所以gpt可以轻松实现语种的翻译(只是各个语种之间的熟练度不同,同一语种gpt也可以翻译出正式与非正式的句式)
翻译格式
gpt可以把收集到的信息以要求的格式(比如口语、信件等等亦或者输入list输出html、json等等)进行输出:
拼写或语法检查
(课程推荐在发布自己的文章到公共平台之前用openai接口检查一下,也可以使用diff工具输出检查前后的区别)
改变语气
在对文本进行纠错的同时,可以改写文本:遵循特定的写作风格(APA),指明阅读文本的目标人群(高知人群),希望体现指定的情绪(引人注目)等等
Expanding
将一段较短的指令,例如一组指令或者主题列表,让LLM生成更长的文本,例如一封电子邮件或一篇关于某个主题的文章。
API的帮助函数中加入一个新的参数:温度(temperature)
定制内容
示例:根据客户反馈的评论和情绪,自动生成一个定制的回复邮件
温度
该参数可以改变模型反应的多样性,可以把温度参数理解为模型探索的程度或者随机性。如果目标是稳定的模型,那么建议温度用0度(那么重复执行,结果是不会变化的);如果需要让模型输出多样性的结果(重复执行,每次得到的结果有区别),可以适当提升温度。
Conclusion
聊天机器人
前面的应用都是输入一个指令得到一个输出,现在需要传递一个包含不同角色的消息列表给gpt使用另一个帮助函数:
在帮助函数中也可以把gpt的角色和它返回的内容清晰地输出,更好地帮助理解
至此,所有的对话都是一个独立的语境,有着很大的局限性。但显然聊天机器人要保留之前对话的上下文环境,这样才能更好地进行对话。这时候需要更新一下帮助函数,使得函数可以自动收集用户提示和助手响应,保存并不断更新上下文环境:
示例:可以做一个餐馆的自助点菜机器人,提前把菜单导入到上下文中,接着明确机器人所有可能涉及的工作职责与应对策略,然后顾客就可以通过机器人开始点餐。点餐结束,系统可以通过一个简单的文本处理把对话消息转化成一个菜单列表和备注消息发给后厨。