跳到主要内容

进阶提示工程师之路

作者:吕吕吕7

优秀的Prompt工程师一定是善于深度思考的。

Promt创作过程:寻找需求——分析需求——提示词框架——提示词工程

Prompt的创作绝不只是与大模型的沟通,同样也是创作者对自身的思考。

1.寻找需求:如何寻找自身需求?

需求在生活中的蛛丝马迹中。

当我们去写提示词的时候,往往会出现这样的场景:面对的输入框不知道写什么,输入框空荡荡的,脑子也是空荡荡的。我们自身不知道需求是什么,或者说脑海中没有灵感。那我们怎么寻找自己的需求呢?请大家依次问自己三个问题:工作中最花费时间的内容是什么?生活中最耗费时间的内容是什么?你的兴趣爱好是什么?或许你会得到答案。

2.分析需求:思考自身的根本需求是什么!

望提示词工程师在创作过程中认真思考:我的根本需求是什么?

在计算机领域有一个经典的"X-Y”问题:

X-Y“问题是一个问题解决策略的概念,其中 X 是你真正面临的问题,而Y 是你认为的解决方案。当你尝试获取 Y 的信息或怎么做 Y 时,你实际上避开了真正的问题 X。

举例来说,假设你正在编写一个程序,需要解析一种特定格式的数据(这是你的X问题)。你决定使用某种特定的库来解析这种数据,但遇到困难(你现在的Y 问题)。你可能会询问关于这个库的问题,而不是你实际面对的如何解析这种格式的数据的问题。通过构造出一个 X-Y 问题,你可能限制了别人能给出的帮助,因为他们被限制在你选择的方案,而不是实际问题。

最好的方法是描述你的实际问题(X一-如何解析特定格式的数据)然后才告诉别人你试图怎么解决(你的 Y-一使用某个特定的库)。这样他们既可以在你遇到困难的方法上给予帮助,也可以提供其他可能的更好的解决方案。

什么意思呢?可能说到计算机领域的问题大家不是很清晰,在这里我们用一个通俗易懂的例子来讲解上述问题:在一个土木工程中,你遇到了一个问题——你需要把10吨的土运到工地,但是工地没有货车了。

你通过一系列的操作寻找货车,但是一直没有找到。最终他人提出,用拖拉机拉几趟也可以把土拉过来,随后问题迎刃而解。

在这个过程中'把10吨的土运到工地'是X问题,也就是根本的问题;'寻找货车'是Y问题,也就是在解决问题的过程中遇到的问题。当我们在解决Y问题的过程中没有办法的时候,反而退一步想想“如何解决X问题”会更加高效的解决问题。

下面我们来举一个在提示词创作过程中遇到的"X-Y”问题:

需求:让文心一言生动的扮演张飞与用户交谈。

我的思考:我在创作Prompt的过程中,遇到的“X问题”是“让文心一言生动的扮演张飞与用户交谈”,由此产生了“Y问题”是“如何让文心一言表现出张飞的所有性格”;我在解决“Y问题”(如何让文心一言表现出张飞的所有性格)的过程中花费了大量的精力和笔墨,生动的描绘了张飞的各种性格、也讲述了张飞大量的经历,但最终效果不尽人意,甚至可以说效果很差(因为字数和特征太多了,导致模型的生成效果不好)。

其实这个时候我是很沮丧的,我付出了很多努力,但是没有收获好的效果。但是我们回过头来看,其实我在解决问题的时候已经偏离了“X问题”(让文心一言生动的扮演张飞与用户交谈);我们深层次来剖析一下“X问题”(让文心一言生动的扮演张飞与用户交谈):“让文心一言生动的扮演张飞与用户交谈”,动作是“让文心一言生动的扮演张飞”,面向对象是“与用户交谈”,当我们将两者结合之后得“X问题”的根本需求——让文心一言扮演用户眼中的张飞。因为面向对象是“用户”,那我只要做到“让文心一言扮演用户眼中的张飞”即可,接着我仔细思考了一下“什么是用户眼中的张飞?”,其实就是“一个粗鲁、勇猛的蜀国猛将”。

当我拿到上面的思路后,我又一次设计了Prompt,这次的重点不再是“详细的表述张飞的所有性格和事件了”,而是“尽可能表现在用户眼中的张飞,也就是一个粗鲁、勇猛的蜀国猛将”。之后的效果也很好,被文心一言收录了,甚至利用这个思路创作了十多个角色,同样被文心一样收录。

上面这个过程就是一个典型的“X-Y”问题,当我剥离所有的杂乱思路后,得到了一个简单的工作方式,甚至复制这个方式再一次创作了多个类似的案例。

3.提示词框架:如何搭建一个合适的“提示词框架”?

把大模型当做一个世界看待。

好了,当我们整理完思路,接下来要整理我们的信息,或者换句话说——需求的实现需要哪些条件?

在这里我们仍然以“角色捏造Prompt”为例,我想让文心一言扮演我想要的张飞形象,那我就需要整理出能表达张飞形象的信息,比如:张飞的性格、张飞的人设、张飞的说话方式等。这些信息都可以帮助文心一言更清晰的认识到“我脑海中的张飞”,也让我更清晰的用自然语言表达“我脑海中的张飞”。这个从1到X的过程就是“提示词框架”建立的过程,一个好的“提示词框架”会让创作者的思路更加清晰,同时也会帮助文心一言更准确的识别语义。

那么问题来了——怎么搭建一个“提示词框架”呢?

在这里提出一个概念:把大模型当做一个世界对待。我们都知道,在现世界中的所有事物都是有属性的,比如提到老虎,属性就有猫科、动物、体型大等等;提到东北虎,属性有猫科、豹属动物、是虎的亚种之一等。同样的,在大模型中对万事万物也有相应的标签,你说老虎,大模型同样知道老虎是大型猫科动物;提到东北虎,大模型也知道东北虎是虎的亚种之一。从这个角度来讲,大模型和现实世界有一个相同点——现实世界和大模型都为事物赋上了属性。我们在创作Prompt的过程中可以通过事物的属性来搭建“提示词框架”。

比如,我想让文心一言扮演一个角色,我就围绕角色的属性把任务拆分,拆分为“角色的性格”、“角色的人设”、“角色的说话方式”等;我想让大模型模拟一个游戏系统,就围绕游戏系统对任务进行拆分,拆分为“游戏的交互方式”、“游戏的主循环”、“游戏的初始化场景”、“游戏中对象的属性”等。“提示词框架”来源于事物的属性,我们只要了解事物的属性,就可以围绕属性来对任务进行拆分,从而更详细的把我们的意思表达给大模型。

提示词框架搭建方法思路整理

那接下来我们试着用思维链把逻辑串起来:脑海中的需求——现实空间的映射——需求的拆解——提取关键特征——搭建提示词框架。

当我们理清脑海中的需求后,我们要去现实空间寻找需求能够映射的事物,之后对这个事物进行拆解,就好比一篇优秀的文章,一定是有层次的,那我们就要按照自己的理解去拆解这个文章的框架,再提取我们有用的信息,最后搭建一个合适的提示词框架。这个过程就是一个搭建“提示词框架”的过程,我称这个过程为“提示词映射法”。

4.提示词工程:如何向大模型表达我们的需求?

Attention Is All You Need.(注意力就是你所需要的)

我们一路从需求到思路梳理、再从思路梳理到创建提示词框架,这些过程都属于我们由外到内的自我思考,下一步则是由内到外的表达过程——提示词创作。那么要如何才能创作出优质的提示词呢?答案是精确表达。我将在下文详细解释什么是精确表达

首先,我要引用深度学习初学者必读的一篇论文——《Attention Is All You Need》(注意力就是你所需要的)。我把论文放在这里不是为了让各位去阅读或者学习这篇文章,而是为了引出大模型的思维方式——注意力机制。

人与人交流的过程中会下意识的抓取关键词作为对方的参考,举个例子来说:你在某次线下聚会中认识了A,你与A聊了起来,整个过程大概10分钟,你们相互认识了对方。但是当第二天你醒来之后,或许你只会记住寥寥几个关键词,A是什么职业、有XX成就、擅长XXX、谈吐如何。你并不会记住昨天所有的聊天内容,因为你的注意力只放在你关注的领域。我们再回到上面的论文题目《Attention Is All You Need》,它的意思是指大模型的注意力同样是有限的(当然比人多得多),也只会放在关键信息的部分。

下面我以GPT3.5为例,做一个实验来验证大模型的注意力只会放在关键信息部分。

第一次试验提问:4杯100°的水倒在一起是多少度

结论:答案正确、推理过程正确

分析过程:大模型审题之后把注意力放在了温度的特征上——温度相同的物体放在一起温度不变。

img

第二次试验提问:4杯100°的水倒在一起,再倒出来4分之1,最后温度是多少度

img

结论:答案错误

分析过程:把水倒在一起温度不变,但是倒出来4分之1却改变了,原因就在于大模型审题之后把注意力放在了转折语句上“再倒出来4分之1”,此时大模型会把注意力集中在这个部分,从而导致忽略温度的特征“温度相同的物体放在一起温度不变”,造成推理过程错误。那我们第三次实验,强调一下这个特征,看看我们的推理是否正确。

img

总结:在上述实验中,我们发现三个相似的问题因大模型的注意力不同从而导致了不同的结果,明明是基于一个简单的原理(温度相同的物体放在一起温度不变)给出了三个不同的提示词,GPT却给了不同的结果。究其根源在于,在第一次的实验中GPT的注意力放在了温度的特征上(温度相同的物体放在一起温度不变),给出了100℃的正确答案;而第二次的实验中GPT的注意力放在了转折语句(再把水倒出来4分之1)上,从而给出了75℃的错误答案;在第三次的实验中,我们强调了温度的特征(温度相同的物体放在一起温度不变),GPT再一次把注意力放回温度的特征上,从而给出了正确答案。

反思:上面的案例给了我或者说我们一个什么结论呢?你本以为表达的意思或许在大模型中并没有被理解。这个问题是一直存在的,或许我们认为自己表达的已经很清晰的,但是实际上大模型并未真正理解我们的意思。这个问题导致我们在使用提示词的过程中,一直得不到我们想要的结果,也就是上文提到的精确表达。