跳转至

大模型提示工程指南

学习目标

  • 了解什么是提示工程
  • 掌握提示工程的设计技巧

1 概念

  • 提示工程(Prompt Engineering),也称为 In-Context Prompting,是指在不更新模型权重的情况下如何与 大模型交互以引导其行为以获得所需结果的方法。
  • 在人工智能领域,Prompt指的是用户给大型语言模型发出的指令。例如,“「讲个笑话」”、“「用Python编个贪吃蛇游戏」”、“「写封情书」"等。虽然看似简单,但实际上,Prompt的设计对于模型的结果影响很大。因此如何设计prompt,进而与模型更好的交互,是研究人员必备的必不可少的技能(提示工程)。
  • 提示工程不仅仅是关于设计和研发提示词。它包含了与大语言模型交互和研发的各种技能和技术。提示工程在实现和大语言模型交互、对接,以及理解大语言模型能力方面都起着重要作用。用户可以通过提示工程来提高大语言模型的安全性,也可以赋能大语言模型,比如借助专业领域知识和外部工具来增强大语言模型能力。

2 提示工程的原则

  • 基于OpenAI官网文档,我们提炼出了5条大原则:
  • 清晰的指令
  • 文本参考
  • 复杂任务拆分简单子任务
  • 给模型"思考"的时间
  • 借助外部工具
  • 接下来,我们将对每一种具体的原则进行原理讲解以及举例实时,以帮助我们在日常工作准确的使用LLM。

2.1 清晰的指令

  • 任何Prompt技巧,都不如清晰的表达你的需求。这就类似人与人沟通,如果话说不明白,不可能让别人理解你的思想。因此,写出清晰的指令,是核心。
  • 那么如何写出清晰的指令呢?下面罗列几个小技巧:

2.1.1 详细的描述

  • 当我们进行模型的提问时,不要描述的太笼统,而是尽量多的提供重要的详细信息或上下文.

eg: 不要直接说,"帮我写一封情书";而是说:"用一些温柔的话语写一封情书,来表达我对你的仰慕和思念。最后,我要求书写字体数要不低于500个字"

2.1.2 让模型充当某个角色

  • 当我们使用大模型时,可以让模型充当一个角色,这样模型会更专业更明确的对你的问题进行回复.

Eg:我需要你充当一个AI算法面试官的角色,要求你自主的对我进行AI面试过程中常考的面试题,你可以一次说一个问题,然后我回答完,你再出第二道题

2.1.3 使用分隔符标明输入的不同部分

  • 中括号、XML标签、三引号等分隔符可以帮助划分要区别对待的文本,也可以帮助模型更好的理解文本内容。常用''''''把内容框起来

eg:用20个字符总结由三引号分割的文本。"""在此插入文本"""

2.1.4 对任务指定步骤

  • 对于可以拆分的任务可以尽量拆开,最好能为其指定一系列步骤,明确步骤可以让模型更容易实现它们。

eg:利用下面分步情况来响应用户的输入。

步骤1: """"用户输入文本"""",用一句话总结这段文本,并加上前缀"Summary".

步骤2: 将步骤1中的摘要翻译成英语,并添加前缀"翻译:"

2.1.5 提供例子

  • 本质类似于few-shot leaning。先扔给大模型举例,然后让模型按照例子来输出

eg: 按照这句评论文本的格式:'""用户输入文本""',帮我创造新的样本

2.1.6 指定输出长度

  • 可以要求模型生成给定目标长度的输出。目标输出长度可以根据单词、句子、段落、要点等的计数来指定。中文效果不明显,同时你给定的长度只是个大概, 多少个字这种肯定会不精准,但是像多少段这种效果相对较好.

eg: 用三个段落、30个字符概括由三引号分隔的文本。"""在此插入你的文本"""


2.2 文本参考

  • 文本参考目的:基于文本文档,辅助大模型问答,降低模型"幻觉"(一本正经的胡说八道)问题。

2.2.1 使用参考文本作答

  • 经典的知识库用法,让大模型使用我们提供的信息来组成答案。

eg:根据下文中三重引号引起来的文章来回答问题。如果在文章中找不到答案,请写“我找不到答案”,不要自己造答案。"""<在此插入文档>""""""<在此插入文档>""" 问题:<在此插入问题>

2.3 复杂任务拆分为简单子任务

  • 类似于人工,如果你作为领导,让下属一次性完成一个非常大的事,那么出错的概率是很大的,很多大项目也是这样,你甚至无从下手。所以我们经常在工作中,都要讲任务,拆各种细节、子任务、子目标等等。大模型也是同样的道理。
  • 把复杂的任务给拆为更为简单的子任务,大模型会有更好的表现

2.3.1 对用户query进行意图识别

  • 意图识别是一个很经典的例子。比如在客服场景中,用户问了一个问题“我断网了咋整”,你让大模型直接回复其实是挺鸡肋的,但是这时候就可以拆,先拆大分类下的意图识别,再回答具体类别的问题。
  • 步骤1, 先判断问题类别:

接下来,将为您提供客户服务查询,将每个查询分为主要类别和次要类别。提供json格式的输出,具体内容如下: 主要类别:计费、技术支持、账户管理

计费次要类别:1.取消订阅;2.条件付款方式;3.收费说明;4.对收费提出争议

技术支持次要类别:1.故障排除;2.设备兼容性;3.软件更新

账户管理次要类别:1.重置密码;2.更新个人信息;3.关闭帐户;4.账户安全

如果大模型根据步骤1,知道“我断网了咋整”是属于技术支持中的故障排除了,我们可以继续第二个步骤

  • 步骤2,根据类别在得到具体的解决方案:

您将收到需要在技术支持上下文中进行故障排除的客户服务查询。通过以下方式帮助用户:

要求他们检查与路由器相连的所有电缆是否连接。请注意,随着时间的推移,电缆常常会松动。

如果所有电缆连接正常且问题仍然存在,请询问他们使用的路由器型号。

2.3.2 处理长对话:总结或过滤信息

  • 因为大模型都具有固定的上下文长度,因此用户和模型之间的对话无法无限期地继续。解决此问题有多种解决方法:
  • 第一个方法是总结之前的对话记录。一旦输入的大小达到预定的阈值长度,模型就会自动把一部分内容进行总结。
  • 另外一种办法就是在整个对话过程中,让模型在背后不断地把对话内容进行总结。这就像你在读一本书的时候,可能会时不时地在脑子里回顾一下之前的情节,这样就不会忘记故事的主线。

  • 这两种方法都行,或者还可以把过去的所有聊天记录存成向量库,后续跟用户对话的时候动态查询嵌入,也可以。

2.3.3 分段总结长文本并递归构建完整摘要

  • 类似于ChatGPT的大模型 是个有点像有记忆力限制的机器人,他记住的东西长度有限。因此,如果让他一口气读完一本非常长的书然后再总结,他可能会记不住所有的内容。那怎么办呢?
  • 我们可以用一种“分段总结,再汇总”的方法来解决这个问题。就好比,你在学习很长的一篇文章或者一本书的时候,你可能会先总结每一小节的内容,然后再把这些小节的总结放在一起,再做一次总结,这样就能得到整个文章或者书的总结了。
  • 处理长对话和长文的基本方法,基本是一样的:总结前一部分的时候,带上之前的内容。 不同点是:有的长文章节之间,关系较弱,可以用分段总结,再汇总的方法,不用每次总结都带上之前的总结。

2.4 给模型"思考"的时间

  • 给模型思考实践,本质为链式思考(CoT),Chain-of-Thought Prompting。目的,让模型think step by step(一步步思考).
  • 比如,直接问你4234567*375821等于多少,你肯定也"懵",但是如果给你时间让你一步步计算,学过小学数学的都能算出来对吧.
  • 接下来,我们将探讨如何给ChatGPT足够的时间来“思考”,以得出更准确和合理的答案。

2.4.1 引导模型在得出结论前生成自己的答案

  • 有时候,我们希望ChatGPT能够在得出最终答案之前,先生成一些自己的答案,然后再进行选择和调整。这样可以引导模型思考问题,并激发一些新的创意。

用户: 问题:1+1=3是否正确 答案:正确,因为在三维空间里1+1则是立体的,所以等于3。请判断答案是否正确。要求:判断之前先自己思考答案,然后再判断答案是否正确。

ChatGPT:在标准的数学运算中,1+1的结果是2。然而,你提到了在三维空间中的立体概念。在数学上,1+1仍然等于2,即使我们考虑到不同的维度。因此,根据标准的数学运算规则,答案应该是不正确。如果问题涉及到特殊的上下文或领域,请提供更多的信息以便我更好地理解并回答。

通过引导模型在得出结论前生成自己的答案,我们可以激发模型的思考过程,并获得更加丰富和多样的回答。

2.4.2 隐藏推理过程,只展示最终答案

  • 在某些情况下,我们可能更关注最终答案,而不是模型的推理过程。通过隐藏推理过程,我们可以简化回答,并使其更加直接和易于理解。

用户:如何用Python反转一个字符串。要求:只需要输出代码,不输出其它任何文字。

ChatGPT:

string = "Hello, World!"
reversed_string = string[::-1]
print(reversed_string)

2.4.3 处理答案不完整的问题

  • 有时,ChatGPT可能会生成一些不完整的回答,缺少一些重要的细节或信息。在这种情况下,我们可以通过补充细节或提供额外的信息来完善回答。

用户: JavaScript是世界上最好的语言吗?要求:只需要回答最终结论。

ChatGPT: 没有绝对的最好的编程语言,因为每种语言都有自己的优点和适用场景。不同的语言适用于不同的任务和需求。所以,JavaScript并不是世界上最好的语言,但它在Web开发中具有广泛的应用和强大的生态系统。

用户:在前端开发中,JavaScript是世界上最好的语言吗?要求:只需要回答最终结论

ChatGPT: 在前端开发中,JavaScript是最主要的语言,并且具有广泛的应用和强大的生态系统。因此,可以说在前端开发中,JavaScript是世界上最好的语言之一。

通过补充细节和提供额外的信息,我们可以完善回答,使其更加全面和有用。

2.5 借助外部工具

  • 大模型并不是万能的,比如一些实时问题等等大模型不能很好的回答,所以需要一些外部工具来帮助处理。接下来我们将学习如何使用外部工具来增强ChatGPT的功能。

2.5.1 基于嵌入(embedding)的搜索技术

  • 动态知识库:比如,我们向大模型提问如何评价马上要上映的电影《敢死队4》,由于大模型的知识都是基于以往的经验得到的,并不具备实时信息,根本不知道《敢死队4》要上映了,所以需要先去联网进行查询,查完以后将资料进行整体,让大模型根据自己查到的这些资料进行回答。这是动态的信息。
  • 静态知识库:就是用的向量匹配的方式,常见步骤:加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的top k个 -> 匹配出的文本作为上下文和问题一起添加到prompt中 -> 提交给大模型生成回答。【后续实战应用讲解】

2.5.2 使用代码执行来进行更准确的计算或调用外部API

  • 一般情况,大模型计算能力表现一般,所以OpenAI建议,如果遇到需要计算的东西,最好让大模型写一段计算的Python代码,因为大模型对于Python等其他编程语言的计算题很成熟了。
  • 比如:求以下多项式的所有实值根:3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10。您需要通过将 Python 代码括在三个反引号中来编写和执行,例如"""代码放在这里"""。用它来执行计算。

本节小结

本章节主要讲解了关于Prompt Engineering的使用技巧。