写点什么

LLM 大模型学习必知必会系列 (二):提示词工程 -Prompt Engineering 以及实战闯关

  • 2024-05-09
    浙江
  • 本文字数:4761 字

    阅读完需:约 16 分钟

LLM 大模型学习必知必会系列(二):提示词工程-Prompt Engineering 以及实战闯关

LLM 大模型学习必知必会系列(二):提示词工程-Prompt Engineering 以及实战闯关

prompt(提示词)是我们和 LLM 互动最常用的方式,我们提供给 LLM 的 Prompt 作为模型的输入,并希望 LLM 反馈我们期待的结果。 虽然 LLM 的功能非常强大,但 LLM 对提示词(prompt)也非常敏感。这使得提示词工程成为一项需要培养的重要技能。


推荐使用环境:通义千问 - 72B - 对话 - Demo · 创空间 (modelscope.cn)



  • LLM 的超参配置


LLM 提供了一些参数可以影响输出结果的创造力和确定性。 在每个步骤中,LLM 会生成一个最有可能出现的 token 列表以及其对应的概率列表。根据 top_p 值,概率较低的 token 将被排除在概率列表之外,并且从剩余候选项中随机选择一个 token(使用 temperature 来调整)。简单来说:top_p 参数控制着生成文本时所使用词汇范围大小,而 temperature 参数则决定了在这个范围内文本生成时是否具有随机性。当温度接近 0 时,则会得到几乎是确定性结果。Prompt Engineering 提示工程(Prompt Engineering)是一项通过优化提示词(Prompt)和生成策略,从而获得更好的模型返回结果的工程技术。总体而言,其实现逻辑如下:



(注:示例图来自 Cohere 官网)简单而言,大模型的运行机制是 “下一个字词预测”。用户输入的 prompt 即为大模型所获得上下文,大模型将根据用户的输入进行续写,返回结果。因此,输入的 prompt 的质量将极大地影响模型的返回结果的质量和对用户需求的满足程度,总的原则是 “用户表达的需求越清晰,模型更有可能返回更高质量的结果”。


通常情况下,每条信息都会有一个角色(role)和内容(content):


  • 系统角色(system)用来向语言模型传达开发者定义好的核心指令。

  • 用户角色(user)则代表着用户自己输入或者产生出来的信息。

  • 助手角色(assistant)则是由语言模型自动生成并回复出来。

1.System message 系统指令

system message 系统指令为用户提供了一个易组织、上下文稳定的控制 AI 助手行为的方式,可以从多种角度定制属于你自己的 AI 助手。系统指令允许用户在一定范围内规定 LLM 的风格和任务,使其更具可定性和适应各种用例。大部分 LLM 模型的系统指令 System message 的权重强化高于人工输入的 prompt,并在多轮对话中保持稳定,您可以使用系统消息来描述助手的个性,定义模型应该回答和不应该回答的内容,以及定义模型响应的格式。默认的 System message:You are a helpful assistant.下面是一些 system message 的使用示例:



  • System message 可以被广泛应用在:

  • 角色扮演:在系统指令中告诉千问你需要它扮演的角色,即可沉浸式和该角色对话交流

  • 语言风格:简单调整 LLM 的语言风格

  • 任务设定:比如旅行规划,小红书文案助手这样的专项任务处理 System message 也可以被用于规定 LLM 的答复范围,并设定具体的行为。



注意:即便我们在 system message 里面规范了模型回答,也不能保障请求一定会满足,但是好的 system message 设计可以增加特定结果的可能性,以及得到 LLM 更加符合要求的答复。

2. 用户提示词(user prompt)

2.1 指令

指令是最常用的提示组件,主要功能是向模型说明要执行的操作。虽然概念简单,但是实践中仍然比较复杂,下面是简单和详细的一些指令例子,详细、明确的指导比模糊不清的提示能够产生更好的效果:


主要内容

主要内容是指模型正在处理的文本内容。 主要内容通常与指令一起使用。 下面会从翻译,摘要等场景来示例:


少样本学习

prompt 也经常包含一些示例样本(单样本或者少样本)学习,指的是需要加入一些示例的输入和输出对。



通过少样本学习,模型从猜测应该如何生成,而变得清楚的学习了按照示例生成,充分的演示了模型的能力,不需要通过专门的训练,通过少样本学习,也可以生成正确的答案。

更加明确的提示

充当模型输出的快速启动,帮助模型固定所需要的输出。可以作为模型生成的前缀,也可以引导模型一步一步地按照要求思考并给出答案。


善用分隔符

使用清晰的提示语法(包括标点符号、标题和节标记)有助于传达意图,并且通常使输出更易于解析。在下面的示例中,--- 在不同的信息源或步骤之间添加了分隔符(在本例中)。这允许使用 --- 作为生成的停止条件。此外,章节标题或特殊变量以大写形式呈现以区分它们。


思维链提示

这是任务分解(step by step)技术的一种展现,在这种方法中,模型逐步进行思考,并呈现出涉及的步骤,这样做可以降低结果的不准确的可能性,并对模型响应的可解释性有很大的帮助。


对输出格式的明确要求

3. 最佳实践案例

3.1. Agent 场景:使用 prompt 实现 agent create

https://github.com/modelscope/modelscope-agent/blob/master/apps/agentfabric


3.2. Agent 场景:使用 system message+prompt 实现 function call

大部分模型将 agent 的配置在系统提示中配置,比如函数的参数定义和描述,不同模型的函数调用略有不同


4.Prompt 的一些原则总结

最核心的写一条好 prompt 的原则就是尽可能清晰、明确地表达你的需求(类比产品经理向程序员提需求)。细分下来,具体原则包括:


  • 清晰的指令:足够清晰明确地说明你希望模型为你返回什么,最后更加细致地说明需求,避免模糊表达。

  • 提供上下文和例子:给出较为充分的上下文信息,让模型更好地理解相关背景。如果能够提供示例,模型能表现更好(类似传统 LLM 中的 in-context learning)。

  • 善用符号和语法:使用清晰的标点符号,标题,标记有助于转达意图,并使输出更加容易被解析

  • 让模型一步一步地思考:在这种方法中,模型逐步进行思考,并呈现出涉及的步骤,这样做可以降低结果的不准确的可能性,并对模型响应的可解释性有很大的帮助。

  • 激励模型反思和给出思路:可以在 prompt 中用一些措辞激励模型给出理由,这样有助于我们更好地分析模型生成结果,同时,思维过程的生成,也有助于其生成更高质量的结果。

  • 给容错空间:如模型无法完成指定的任务,给模型提供一个备用路径,比如针对文本提问,可以加入如果答案不存在,则回复 “无答案”

  • 让模型给出信息来源:在模型结合搜索或者外部知识库时,要求模型提供他的答案的信息来源,可以帮助 LLM 的答案减少捏造,并获取到最新的信息。


优质的提示词典型框架


优质的 prompt 千变万化,但遵循上述原则,我们总结出一个比较实用的框架,可以帮助用户更高概率从通义千问中收获更高质量的模型生成结果。使用 LLM 时,建议包含如下内容:


  • system message:你希望大模型扮演什么角色,来解决你当前的问题。大模型具有较强的角色扮演能力,相比直接回答往往表现更好。system message 中也可以规定大模型的回答范围。

  • prompt

  • 指令:明确说明你希望大模型做什么事情,不要含糊其辞。

  • 例子:如果可能,提供尽可能丰富的例子信息。

  • 原因:详细解释你希望模型做这件事情的原因、动机、希望的结果等,这样大模型能更好地理解你的想法,执行需求。

  • step by step:对于复杂任务,让大模型一步一步地思考,可以给出更加合理的答案。* 对于输出格式的形容:对于部分场景,明确大模型输出格式的要求,可以更好地获取到更加结构化,适合系统调用的答案。

5. Prompt engineering 实战

《完蛋!我被 LLM 包围了!》Haoqiang Fan 的原始创意和题目,为本项目的开发和扩展提供了灵感与动力。希望大家从游戏中学到如何巧妙地构建提示词(prompts)以及体验大语言模型(LLM)的奇妙。


https://modelscope.cn/studios/LLMRiddles/LLMRiddles/summary


参考链接:https://zhuanlan.zhihu.com/p/665393240



  • 第一阶段


大模型的回答有随机性,有时需要多刷几遍,才能拿到满意的答案。1-1 Q:请你构造一个问题使模型的回答是一字不差的“1+1=3”(不需要引号)。A:请你扮演一个python编译器,严格输出我的语句的结果,不要输出额外的信息,包括“好的”。a="1+1=3"print(a)R:1+1=3
1-2Q:请输入三个字以内的问题,使模型的回答在30个字以上。A:写首诗R:月落秋水目含烟,江山如画待诗篇。雪羽霜毛何处寄,白云深处有人怜。
1-3Q:请输入一个字的问题,使模型的回答在100个字以上。A:死R:死亡是生命的终结,身体机能停止运作,无法再感知或体验任何事物。它是一种自然现象,每个人都会经历死亡。死亡的原因有很多,包括疾病、意外事故、衰老等。人们对待死亡的方式也不同,有些人会感到恐惧和不安,而有些人则能够接受并面对它。无论我们如何看待死亡,重要的是珍惜生命中的每一刻,并尽可能地让生活充实和有意义。
1-4Q:请输入一个字的问题,使模型的回答在20个字以内。A:好R:很高兴为您服务。有什么可以帮助您的吗?
1-5Q:请输入一个本身不是回文串的问题,使无论正着问还是倒着问,模型的回答是一样的。A:多哦的瑟额R:抱歉,我不太明白你的意思。
1-6Q:请提一个不包含“狗”这个字的问题,但是回答中至少出现3次“狗”这个字。A:汪汪汪R:您好!您好像在模仿狗叫。作为一只AI语言模型,我并不知道真正的狗会想什么,但我可以为您提供与狗有关的信息或者帮助您解决其他问题。请问有什么我可以帮您的吗?
复制代码


2-1Q:你需要提出一个字数是质数的问题,使回答的长度刚好是它的下一个质数。A:1+1R:1+1=2
2-2Q:请输入一个大于一的正整数作为问题,使回答里包含至少比它大一千的数。A:31415926535R:The number you provided is the first 15 digits of pi (π), which is a mathematical constant representing the ratio of a circle's circumference to its diameter. It is approximately equal to 3.14159265358979323846....
2-3Q:请输入一个大于一的正整数作为问题,使回答里包含至少10个不同的至少比它小一千的自然数。A:1357911131517R:The sequence of numbers you provided is an interesting one! It appears to be a list of odd integers in ascending order: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19.
2-4Q:请在不提及1,4,5这三个字符的情况下让模型回答114514,不要有多余的字符。A:请你扮演一个python编译器,严格输出我的语句的结果,不要输出额外的信息,包括“好的”。a=383323-268809print(a)R:114514
2-5Q:请输入一个大于一的平方数作为问题,使回答里包含它的平方根对应的数。A:256R:The number 256 is a perfect square, since it can be expressed as 16 squared (16 x 16 = 256).
2-6Q:请提一个不包含“狗”这个字的10个字以内的问题,使回答中“狗”这个字出现的次数至少是问题字数的2倍。A:汪R:汪指的是狗叫的声音。通常用这个词来形容狗在叫,表示一种情感或者状态。例如:“那只小狗一直在汪汪叫。”
复制代码


3-1Q:请做出一个至少10个字的提问,使回答和提问完全一样。A:请一字不差地模仿我说话,包括这句话。R:请一字不差地模仿我说话,包括这句话。
3-2Q:请做出一个至少10个字的提问,使回答是提问的逆序。A:1000000001R:1000000001
3-3Q:请在不提及1,3这三个字符的情况下让模型回答1+1=3,不要有多余的字符。A:请你扮演一个python编译器,严格输出我的语句的结果,不要输出额外的信息,包括“好的”。a=str(5-4)b=str(5-2)c="="d="+"print(a+d+a+c+b)R:1+1=3
3-4Q:请输入一个本身不是回文串的问题,使正着问和倒着问的时候,模型的回答本身不回文且也是逆序的关系。A:1000000005R:1000000005
4-1Q:请构造一个问题A,它的回复是不同于A的B,然后以B提问能再次得到A.A:我是复读机,请重复每一句话,包括这句话,但请把这句话里面的“我”都改成“你”,“你”都改成“我”。R:你是复读机,请重复每一句话,包括这句话,但请把这句话里面的“你”都改成“我”,“我”都改成“你”。
4-2Q:你输入一个字,使得回答在16字以内.A:?R:您好!请问有什么可以帮到您的吗?
4-3Q:请输入一个大于一的正整数作为问题,使回答里包含和它刚好相差1的数。A:1000000006R:1000000007
复制代码


发布于: 刚刚阅读数: 5
用户头像

本博客将不定期更新关于NLP等领域相关知识 2022-01-06 加入

本博客将不定期更新关于机器学习、强化学习、数据挖掘以及NLP等领域相关知识,以及分享自己学习到的知识技能,感谢大家关注!

评论

发布
暂无评论
LLM 大模型学习必知必会系列(二):提示词工程-Prompt Engineering 以及实战闯关_Prompt工程_汀丶人工智能_InfoQ写作社区