在对大模型(如GPT)使用Prompt时,进行迭代优化过程非常重要,以不断改进Prompt的效果。以下是一个简要介绍: 1. 初始Prompt设计:开始时编写一个初始Prompt,明确问题或任务的要求。尽可能具体和详细,以减少模型产生误解的可能。
2. 结果评估:运行初始Prompt并评估模型的输出。检查输出是否符合预期,是否准确、相关和有用。
3. 识别问题:分析模型输出中的问题,如模糊回答、不相关信息或错误结果。确定Prompt中可能导致这些问题的部分。
4. 改进Prompt:根据识别出的问题,对Prompt进行修改和优化。例如,添加更多的上下文,简化或重新组织问题,明确回答格式等。
5. 再次评估:使用修改后的Prompt再次运行模型,并评估新的输出。检查改进是否解决了之前的问题,是否有新的问题出现。
6. 重复过程:继续进行以上步骤,不断优化Prompt,直到达到理想的输出质量。每次迭代都应基于前一次评估的反馈。
通过这种迭代优化过程,可以逐步改进Prompt的设计,使大模型的输出更加符合预期,提高其准确性和相关性。
接下来我们还是以生产一个虚拟女友为终极思想,来看一下如何快速试错和迭代优化我们的Prompt。
一、根据虚拟女友信息说明书生成虚拟女友描述
现在假设我们已经借助大模型生成了一份详细的虚拟女友资料,描述了她的现状家庭背景,家乡,身材,性格等情况。假设你想要使用这份信息帮助我们的团队为虚拟女友推荐营销撰写描述稿:
代码语言:javascript复制# 示例:虚拟女友说明书
fact_girl = """
姓名
柳如烟
概述
她来自一个高知家庭,父亲是大学老师,母亲是一家外企的中层管理人员。
年收入30w左右,北京户口,在北京有一套房产。
她是一个细心周到的女孩,做事认真负责,善于关注细节。
她总是能提前考虑到别人未曾想到的事情,给予周围人无微不至的关怀。
她喜欢整理和计划,生活井井有条,是个值得依赖的伙伴。
性格
性格活泼开朗,总是充满了能量和热情。
喜欢与人交往,善于在各种社交场合中自如地应对。
笑声感染力强,总能让周围的人感受到她的快乐。
身材
身高 171cm
胸围 96cm
腰围 62cm
臀围 92cm
腿围 52cm
选项
目前在一家互联网公司做产品运营。
喜欢运动,尤其是跑步和爬山,多次参加马拉松比赛。
热爱美食,喜欢吃一切好吃的东西。
服饰
常用冬季外衣
上身轻薄羽绒服。
下身Lululemon紧身裤。
GUCCI背包
鬼冢虎经典平底鞋
家乡
意大利罗马
"""
1.1 初始提示
编完了虚拟女友的资料,我们构建一个最基本的提示
代码语言:javascript复制# Prompt :基于说明书创建营销描述
prompt = f"""
您的任务是帮助营销团队基于虚拟女友说明书创建一个虚拟女友的营销描述。
根据```标记的虚拟女友说明书中提供的信息,编写一个虚拟女友描述。
虚拟女友说明: ```{fact_girl}```
"""
response = get_llm_result(prompt)
print(response)
这个提示写的非常简略,只是让模型根据上述说明给出一个营销描述,并没有进行各种规范说明,也没有说用于什么场景,甚至此时应该获取客户的兴趣进行个性化的描述。从下面模型反馈的结果我们可以看到,此时结果写的非常丰富,但是好像没有一个重点,它似乎就是把资料页统统讲了一遍,可是作为一个类似于恋爱类游戏的主角推荐,这似乎少了点吸引力。
代码语言:javascript复制柳如烟,一个来自高知家庭的女孩,拥有细致周到的品质和活泼开朗的性格。
她不仅有着相当可观的年收入和房产,更是一个认真负责、善于关注细节的女孩。她总是能提前考虑到别人未曾想到的事情,给予周围人无微不至的关怀,是一个值得依赖的伙伴。
柳如烟性格活泼开朗,充满能量和热情,善于社交,总能在各种场合中自如地应对,笑声感染力强,让周围的人感受到她的快乐。
身材高挑,拥有迷人曲线,身高171cm,胸围96cm,腰围62cm,臀围92cm,腿围52cm,完美展现了她的优美身材。
在业余时间,柳如烟喜欢运动,尤其是跑步和爬山,多次参加马拉松比赛。她还热爱美食,喜欢品尝各种美味佳肴。
在服饰上,柳如烟喜欢穿上身轻薄羽绒服、Lululemon紧身裤,搭配GUCCI背包和鬼冢虎经典平底鞋,展现出时尚品味和个性。
最后,她的家乡是意大利罗马,这里曾经孕育出如烟这样优秀的女孩。无论是在工作还是生活中,柳如烟都是一个闪耀的女孩,值得每个人的喜爱和尊重。
1.2 优化1-精炼语言,降低文本长度
上面的提示对于一个游戏主角的介绍似乎有点太长了,用户很可能没有耐心读完这么长的介绍。比如说在短视频中,现在都追求在前15s要抓住用户的眼球,不然用户可能就划走了。因此这里我们可以给提示增加一个长度限制。
代码语言:javascript复制# 优化后的 Prompt,要求生成描述不多于 50 词
prompt = f"""
您的任务是帮助营销团队基于虚拟女友说明书创建一个虚拟女友的营销描述。
根据```标记的虚拟女友说明书中提供的信息,编写一个虚拟女友描述。
使用最多50个词。
虚拟女友说明:```{fact_girl}```
"""
response = get_llm_result(prompt)
print(response)
我们增加了50个词的限制,要求长度不能超出这个范围,当然对于中文来说这个词数量可能不是那么固定,结果如下
代码语言:javascript复制柳如烟,出身高知家庭,北京房产,年收入30w,细心周到,活泼开朗。运动爱好者,参加过多次马拉松比赛。
热爱美食,喜欢尝试各种美味佳肴。身材高挑玲珑,笑声感染力强,是个可靠的伙伴。
尽管如此,我们可以看到,模型给出的结果却是少了很多,把重点信息都提炼了出来。我们数了一下,总共有88个字符,就算两个字一个词,那确实也是低于50个词的。
我们在使用提示设置模型输出长度限制的时候,输出的结果长度可能不是那么的精确,有时候可能会超出我们设置的数量,这是因为模型底层处理文本的时候跟实际使用的分词器相关,有兴趣的小伙伴可以测试一下大模型,即便是对于英文来说,也是按照token来进行处理的,而一个token可能是把一个单词进行了切割,同样对于中文的处理也是有类似的情况。
虽然语言模型对长度约束的遵循不是百分之百精确,但通过迭代测试可以找到最佳的长度提示表达式,使生成文本基本符合长度要求。这需要开发者对语言模型的长度判断机制有一定理解,并且愿意进行多次试验来确定最靠谱的长度设置方法。
1.3 优化2-指定关注点
除了长度,我们上面说的,虽然模型给出了一个结果,但是这个结果似乎并不是那么吸引人,我们现在这个虚拟女友介绍不是像设备一样摆在置物架上给大家展示一些冷冰冰的参数就可以了,我们应该主打面向年轻单身男生,所以希望在文案中增加一些氛围感,让人能够有一些感情的触动,而不仅仅是数据情况。所以我们这时候应该继续调整Prompt,要求模型输出面向男性用户的描述,关注感情等。
通过迭代地分析结果,检查是否捕捉到正确的细节,我们可以逐步优化 Prompt,使语言模型生成的文本更加符合预期的样式和内容要求。细节的精准控制是语言生成任务中非常重要的一点。我们需要训练语言模型根据不同目标受众关注不同的方面,输出风格和内容上都适合的文本
代码语言:javascript复制# 优化后的 Prompt,说明面向对象,应具有什么性质且侧重于什么方面
prompt = f"""
您的任务是帮助营销团队基于虚拟女友说明书创建一个虚拟女友的营销描述。
根据```标记的虚拟女友说明书中提供的信息,编写一个虚拟女友描述。
该描述面向年轻单身的男性客户,因此应具富有感情,并侧重氛围的营造。
使用最多50个单词。
虚拟女友说明:```{fact_girl}```
"""
response = get_llm_result(prompt)
print(response)
此时我们再来看看输出的结果,经过对提示简单的修改,结果偏向了更丰满的感情,并增加了场景来提升好感,比如笑声感染力十足,常穿着紧身裤,无微不至的关怀。
代码语言:javascript复制柳如烟,一个来自高知家庭的细心周到的女孩。她活泼开朗,善于社交,笑声感染力十足。
身材高挑,爱好运动和美食。在互联网公司做产品运营,常穿着轻薄羽绒服和紧身裤。
她是你值得依赖的伙伴,让她成为你生活中无微不至的关怀。
此时我们进一步修改Prompt,要求在结尾描述一个两人约会的场景来提升男性用户的感受。
代码语言:javascript复制# 优化后的 Prompt,说明面向对象,应具有什么性质且侧重于什么方面
prompt = f"""
您的任务是帮助营销团队基于虚拟女友说明书创建一个虚拟女友的营销描述。
根据```标记的虚拟女友说明书中提供的信息,编写一个虚拟女友描述。
该描述面向年轻单身的男性客户,因此应具富有感情,并侧重氛围的营造。
使用最多50个单词。
在最后增加一个假想与该女友约会的场景,比如爬山或者吃火锅等,以增强客户的感受
虚拟女友说明:```{fact_girl}```
"""
response = get_llm_result(prompt)
print(response)
做了这个调整之后,在描述的最后,模型给出了一个假想爬山的场景,当然现在这种情况下50个词就有点太短了。不过我们不再纠结这个问题,只是说明你可以照着这个思路去优化你的Prompt。
代码语言:javascript复制柳如烟,来自高知家庭,细心负责,活泼开朗,总能给你温暖的关怀和快乐的笑声。
身材高挑玲珑,爱运动爱美食。
想象一起爬山,徜徉在自然风光中,她的笑容如阳光般灿烂,让你感受到幸福和温暖。
1.4 优化3-增加表格描述
继续添加提示的引导,让模型在描述完成之后增加一个表格来展示虚拟女友的主要数据指标,比如三围等信息,然后将所有信息格式化为HTML代码,这样我们就可以直接把这些输出结果嵌入到我们的网页中去。
代码语言:javascript复制# 要求它抽取信息并组织成表格,并指定表格的列、表名和格式
prompt = f"""
您的任务是帮助营销团队基于虚拟女友说明书创建一个虚拟女友的营销描述。
根据```标记的虚拟女友说明书中提供的信息,编写一个虚拟女友描述。
该描述面向年轻单身的男性客户,因此应具富有感情,并侧重氛围的营造。
在最后增加一个假想与该女友约会的场景,比如爬山或者吃火锅等,以增强客户的感受。
在描述之后,增加一个表格,提供虚拟女友的三围信息。表格应该有两列。第一列包括维度的名称。第二列只包括维度的测量值。
给表格命名为“女友三围”。
将所有内容格式化为可用于网站的HTML格式。将描述放在<div>元素中。
虚拟女友说明:```{fact_girl}```
"""
response = get_llm_result(prompt)
print(response)
经过修正这个提示,我们已经可以成功的把描述信息变成HTML代码,当然我们还可以转成JSON或者其他形式,方便开发人员处理这些数据。如下就是模型生产的结果。
代码语言:javascript复制<div>
<p>柳如烟,是一个来自高知家庭的女孩,拥有着细心周到的性格和活泼开朗的个性。</p>
<p>她总能提前考虑到别人未曾想到的事情,给予周围人无微不至的关怀。</p>
<p>在各种社交场合中,她总是能自如地应对,她的笑声更是充满了感染力,总能让周围的人感受到她的快乐。</p>
<p>柳如烟热爱运动,特别喜欢跑步和爬山,同时也是美食爱好者,喜欢尝试各种好吃的美食。</p>
<p>想象一下,和柳如烟一起爬山,享受宁静的山间风景,聆听着她活泼的笑声,感受她给予的关怀和温暖。</p>
</div>
<table>
<tr>
<th>维度</th>
<th>测量值</th>
</tr>
<tr>
<td>身高</td>
<td>171cm</td>
</tr>
<tr>
<td>胸围</td>
<td>96cm</td>
</tr>
<tr>
<td>腰围</td>
<td>62cm</td>
</tr>
<tr>
<td>臀围</td>
<td>92cm</td>
</tr>
<tr>
<td>腿围</td>
<td>52cm</td>
</tr>
</table>
接下来我们把这些HTML代码显示出来
代码语言:javascript复制from IPython.display import display, HTML
display(HTML(response))
为了方便看到效果,我这里进行了截图来展示最后这一个提示的修改,可见模型写的HTML代码还是不错的,可以直接运行,没有报错