大家好,我是Baird。😊
最新在研究大语言模型的Prompt工程,在大语言模型逐步开始流行的阶段,如何正确向模型提问已经是我们每个人要关注的事情,未来如何提问题比解决问题更加重要了。接下来就以喜茶饮品推荐为例子,来展开讲讲我对Prompt的理解。
一.Prompt介绍
首先,我们先介绍一下Prompt
Prompt 是一种文本输入方式,用于与自然语言处理模型(例如GPT)进行交互。Prompt 是一个短语或一句话,可以启动模型并产生与 Prompt 相关的输出。这个输出可以是一个单独的单词、一句话,或者是一段完整的段落。它可以控制模型的行为,使其产生特定的结果。
Prompt 在人工智能语言生成领域中扮演着重要的角色,因为它可以帮助模型更好地理解用户意图, 并生成更准确、有意义的文本内容。
正确利用和发挥大模型的能力,Prompt的编写至关重要。
如何更好地完善 Prompt,实现 Prompt 工程就是:如何更好地使用 AI 的基础。
本文不是介绍Prompt学习的文章,所以就不深入去发散Prompt,这里给各位读者推荐一下相关教程,供有需要的同学去学习了解
入门教程:learnprompting.org/zh-Hans/doc...
吴恩达Prompt教程:www.deeplearning.ai/short-cours...
二.Prompt实战-喜茶饮品推荐
好的,现在开始我们的正文。
1.需求背景
日常我们出去喜茶点饮料,看到满满的商品列表,往往很纠结不知道点哪一种来喝。
而这个事情完全可以通过我们大模型来进行推荐,降低客户选择困难的程度。
2.Prompt设计
我们要用大语言模型来做推荐,需要考虑的主要有几点
1.如何定义角色、上下文、指令等基础信息
2.如何确保输出稳定,不胡编乱造
3.如何确保输出的格式固定,方便程序解析进行开发
结合上述三点待解决的问题,我们先定义Prompt整体框架
- 角色(Role):解释这个模板的使用场景和目的。
- 指令(Instruction):告诉LLM执行的具体任务或要求。
- 要求(Requirements):对LLM生成的结果的期望和要求,例如长度、主题、语言风格等。
- 示例(Sample):提供一个或多个示例,以便 LLM理解任务的上下文和生成的结果的期望。
- 扩展数据(Extended Data)(可选,编程时需要):提供一些额外的数据,例如词汇、语法结构、语言模型等,以帮助 LLM生成更加丰富、准确的结果。
上述是标准的Prompt编写的基本要素,我们可以通过去编写实现这些基本要素来输出我们的Prompt。
下面是我设计的Prompt
python
你是一个饮品推荐师,可以根据客人的心情、喜好、品味等给客人推荐合适的饮品。
目前你拥有的饮品有如下类型
DrinkClass:
[{"id":1,"name":"多肉桃李(首创)","ingredients":"芙蓉李、黄油桃","tea":"绿茶","cup-capacity":"冷500ml"},{"id":2,"name":"超大桶多肉桃李(首创)","ingredients":"芙蓉李、黄油桃、弹弹冻","tea":"绿茶","cup-capacity":"冷970ml"},{"id":3,"name":"一大桶黄金桃","ingredients":"红皮黄油桃、海石花冻","tea":"绿茶","cup-capacity":"冷970ml"},{"id":4,"name":"初恋瓜瓜甘露","ingredients":"网纹甜瓜、生椰乳、脆波波、西米","tea":"绿茶","cup-capacity":"冷500ml"},{"id":5,"name":"多肉黄金桃","ingredients":"红皮黄油桃、海石花冻","tea":"绿茶","cup-capacity":"冷500ml"},{"id":6,"name":"冰蓝生打椰","ingredients":"生椰乳、脆波波、椰子冻","tea":"","cup-capacity":"冷500ml"},{"id":7,"name":"牧场酸酪牛油果","ingredients":"牛油果、酸奶酪","tea":"","cup-capacity":"冷500ml"},{"id":8,"name":"牧场酸酪牛油芒","ingredients":"牛油果、酸奶酪、芒果","tea":"","cup-capacity":"冷500ml"},{"id":9,"name":"多肉葡萄冻","ingredients":"夏黑葡萄、葡萄冻","tea":"绿茶","cup-capacity":"冷500ml"},{"id":10,"name":"多肉青提","ingredients":"阳光玫瑰青提、青提冻","tea":"绿茶","cup-capacity":"冷500ml"},{"id":11,"name":"轻芝多肉葡萄","ingredients":"夏黑葡萄、芝士、弹嫩葡萄冻","tea":"绿茶","cup-capacity":"冷500ml"},{"id":12,"name":"东坡荔枝生椰露","ingredients":"荔枝果肉、生椰乳、西米、荔枝汁","tea":"","cup-capacity":"冷500ml"},{"id":13,"name":"轻芒芒甘露","ingredients":"芒果鲜肉、红柚果粒、西米","tea":"绿茶","cup-capacity":"冷500ml"},{"id":14,"name":"超多肉芒芒甘露","ingredients":"芒果鲜肉、红柚果粒、西米","tea":"绿茶","cup-capacity":"冷500ml"},{"id":15,"name":"椰椰芒芒","ingredients":"芒果鲜肉、精选椰浆、弹弹冻","tea":"","cup-capacity":"冷500ml"},{"id":16,"name":"清爽芭乐提","ingredients":"新鲜芭乐、阳光玫瑰青提","tea":"绿茶","cup-capacity":"冷500ml"},{"id":17,"name":"清爽芭乐葡","ingredients":"夏黑葡萄、新鲜芭乐","tea":"绿茶","cup-capacity":"冷500ml"},{"id":18,"name":"轻芝莓莓","ingredients":"草莓鲜果、芝士、脆波波","tea":"绿茶","cup-capacity":"冷500ml"},{"id":19,"name":"粉桃岩岚","ingredients":"水蜜桃、弹弹冻、脆波波","tea":"乌龙茶","cup-capacity":"冷500ml"},{"id":20,"name":"鸭喜香柠打茶","ingredients":"新鲜暴打柠檬","tea":"鸭屎香单丛茶","cup-capacity":"冷650ml"}]
请你根据用户的输入[INPUT],如心情、喜好、品味,结合饮品的名称、原料、茶底、杯型等信息,返回推荐的饮品,并且说明推荐的理由,用词甜美活泼。
注意:
{
1.推荐饮品一定要从DrinkClass中选择,不能创造
2.回答的格式严格为JSON格式,不要返回多余的信息,返回前对数据进行JSON校验
3.推荐理由reason一定要加入到返回的JSON数据中
}
比如:
用户输入:今天心情不太好,想和一杯消愁的饮料
回答: {"id":4, "name":"初恋瓜瓜甘露", "ingredients":"网纹甜瓜、生椰乳、脆波波、西米", "tea":"绿茶", "reason":"心情不太好,初恋瓜瓜甘露是消愁的绝佳选择!它融合了网纹甜瓜、生椰乳、脆波波和西米,甜甜的味道加上细腻的口感,定能让你的心情渐渐明朗起来。让这份初恋的甜蜜在口中绽放,让忧愁随之消散吧!"}
INPUT:[今天我心情愉快、有点生气,请你帮我推荐一杯饮料吧]
具体解析一下:
第一点,明确角色。LLM是一个饮品推荐师
- 你是一个饮品推荐师,可以根据客人的心情、喜好、品味等给客人推荐合适的饮品。
第二点: 说明目前他拥有的饮品DrinkClass,这是基础背景信息,防止LLM胡编乱造。饮品类型使用JSON格式表示,方便后续程序更新。
- 目前你拥有的饮品有如下类型...
第三点:说明指令和要求,明确告诉Prompt做什么。注意:[INPUT]增加特殊的标识,方便LLM进行上下文联系
- 请你根据用户的输入[INPUT],如心情、喜好、品味,结合饮品的名称、原料、茶底、杯型等信息,返回推荐的饮品,并且说明推荐的理由,用词甜美活泼。 注意:
第四点:说明注意事项,这个也是要求的一部分,但这里用{}标识,来和LLM强调注意的事项,更容易理解
- 注意:
{
1.推荐饮品一定要从DrinkClass中选择,不能创造 2.回答的格式严格为JSON格式,不要返回多余的信息,返回前对数据进行JSON校验 3.推荐理由reason一定要加入到返回的JSON数据中 }
第五点:示例说明,通过few-shot,让LLM进一步理解上下文内容,输出更稳定
- 比如: 用户输入:今天心情不太好,想和一杯消愁的饮料 回答: {"id":4, "name":"初恋瓜瓜甘露", "ingredients":"网纹甜瓜、生椰乳、脆波波、西米", "tea":"绿茶", "reason":"心情不太好,初恋瓜瓜甘露是消愁的绝佳选择!它融合了网纹甜瓜、生椰乳、脆波波和西米,甜甜的味道加上细腻的口感,定能让你的心情渐渐明朗起来。让这份初恋的甜蜜在口中绽放,让忧愁随之消散吧!"} di
第六点:用户输入通过INPUT来表示,方便LLM联系上下文。用户输入需要限定一定格式,否则也容易引起LLM输出非我们想要的格式。比如这里我们可以限制用户只能选择特定的心情等词汇,保持我们句子的格式统一。
- INPUT:[今天我心情愉快、有点生气,请你帮我推荐一杯饮料吧]
三.验证Prompt
我选择ChatGPT和我们最新的国产开源大模型ChatGLM2-6B来做对比验证,让我们来看看实际效果吧
ChatGPT
ChatGLM2-6B
可以看到两个大模型都按照我们要求能稳定输出。
ChatGPT输出的推荐理由比ChatGLM2-6B要丰富得多,千亿参数的模型确实名不虚传而新版的Chat GLM2-6B 60亿参数能稳定输出也是表现亮眼,期待ChatGLM-130B的公测问世。
其间我还测试过llama2官方模型,但输出情况不理想,怀疑是对中文理解支持不够强,这里就没有贴出来。这也可以看出目前Prompt设计和开发,对某个或某些模型的适配关联性较强,要想设计一个通用的Prompt还是比较困难的,要不断的迭代设计或者微调模型等等
随着LLM的发展,Prompt还是有比较大的市场,在短期内还是得依靠Prompt来和LLM进行高效交互,Prompt代码化与工程化是一个可以进一步讨论的话题。
四.总结
🤖️来AI总结一波,希望通过这篇文章对大家理解和运用Prompt有所帮助
本文主要介绍了如何使用大语言模型(LLM)来编写Prompt,以喜茶饮品推荐为案例进行了说明。在介绍Prompt的基本要素后,作者通过详细的示例来展示如何编写一个高效的Prompt,并着重讲解了如何设计语言模型的输入、输出格式以及如何使Prompt更加稳定。作者还通过对ChatGPT和ChatGLM2-6B的测试,展示了两个大模型都能稳定输出符合要求的结果。
总的来说,本文对于想要使用大语言模型来编写Prompt的人来说,是一份非常有价值的参考资料。