大型语言模型使用强化学习中的人类反馈来学习,这个过程中与人类对话的提问通常是通俗易懂的,也就是说,大型语言模型可以理解并回答一般人能听懂的问题(可以看到,后面我们所提到的技巧,用到我们日常的交流中也是可以更清晰的表达自己的目的的)。因此,即使我们不进行prompt学习,也可以使用大型语言模型来帮助我们解决问题了。但是,如果想要解决更加专业,更加复杂的问题,就需要我们学习prompt工程,以便更好的让大型语言模型来输出我们想要的结果。
解释这个词之前,首先需要解释 prompt 这个词。简单的理解它是给 AI 模型的指令。它可以是一个问题、一段文字描述,甚至可以是带有一堆参数的文字描述。AI 模型会基于 prompt 所提供的信息,生成对应的文本,亦或者图片。
比如我在文心一言里输入 <天上有几个太阳?> ,这个问题就是Prompt。
而 Prompt Engineering (中文意思为提示工程,后缩写为 PE)则是:
Prompt Engineering 是一种人工智能(AI)技术,它通过设计和改进 AI 的 prompt 来提高 AI 的表现。Prompt Engineering 的目标是创建高度有效和可控的 AI 系统,使其能够准确、可靠地执行特定任务。
因为人类的语言从根本上说是不精确的,目前机器还没法很好地理解人类说的话,所以才会出现 PE 这个技术。另外,受制于目前大语言模型 AI 的实现原理,部分逻辑运算问题,需要额外对 AI 进行提示。
另外,目前的 AI 产品还比较早期,因为各种原因,产品设置了很多限制,如果你想要绕过一些限制,或者更好地发挥 AI 的能力,也需要用到 Prompt Engineering 技术。这个我们在后续的章节会讲到。
所以,总的来说,Prompt Engineering 是一种重要的 AI 技术:
如果你是 AI 产品用户,可以通过这个技术,充分发挥 AI 产品的能力,获得更好的体验,从而提高工作效率。
如果你是产品设计师,或者研发人员,你可以通过它来设计和改进 AI 系统的提示,从而提高 AI 系统的性能和准确性,为用户带来更好的 AI 体验。
坦率说来,大家对 PE 有一些争议,
前面一节我们解释了 prompt 的各种好处。但也有人认为这个就像当年搜索工具刚出来的时候,出现了不少所谓的「搜索专家」,熟练使用各种搜索相关的奇技淫巧。但现在这些专家都不存在了。因为产品会不断迭代,变得更加易用,无需再使用这些技巧。
但综合我们对产品和用户的理解,以及各位大佬的看法,我们的理解是:
现在 AI 的发展还比较早期,了解和学习 PE 价值相对比较大,但长远来看可能会被淘汰。这个「长远」可能是 3 年,亦或者 1 年。
从用户的角度看,学习 prompt 可以让你更好地使用 ChatGPT 等产品。
从产品的角度看,对于用户来说,prompt 会是个短期过度形态,未来肯定会有更友好的交互形式,或者理解能力更强的 AI 产品。
本章节会简单介绍下 prompt。我们说一下它的基础用法:
你只需要登录 文心一言 官网后,在输入框内输入问题,或者指令即可。AI 会根据你的指令,返回相应的内容,在后续的章节中,我们会介绍更详细的用法与技巧
另外,还有一个特别留意的,文心一言还支持多轮对话,比如当你问<中国的首都是什么?>,它回答<北京>,你可以接着问<那里居住了多少人>,你不需要在问题里重复北京这个词。文心一言知道那里指的就是北京。
在和文心一言对话时,亦或者在使用和设计 prompt 时,有以下几个原则与建议。记住这几个原则,能让你写出更好的 prompt。
如果是直接官网使用 文心一言,那无需在意这个原则。如果是通过 API 的方式使用,则建议先使用最新的模型测试。
这个是对结果影响最大的因素。比如如果你想让 AI 写一首关于 西施 的诗。当我们明确使用七言绝句时,就可以得到我们想要的七言绝句。
比如我们应该尽量减少不要太多等这种无法定量的词汇,可以使用3至5句话,或不少于500字等这种定量的描述。
这个场景应该是使用 AI 产品最常见的方法。以 文心一言 为例,一般就是你提一个问题,文心一言 会给你答案,比如像这样:
在这个场景下,prompt 只要满足前面提到的基本原则,基本上就没有什么问题。但需要注意,不同的 AI 模型擅长的东西都不太一样,prompt 可能需要针对该模型进行微调。另外,目前的 AI 产品,也不是无所不能,有些问题你再怎么优化 prompt 它也没法回答你。
这种直接提问的 prompt ,我们称之为 Zero-shot prompt。模型基于一些通用的先验知识或模型在先前的训练中学习到的模式,对新的任务或领域进行推理和预测。你会在高级篇看到相关的介绍,以及更多有意思的使用方法。
在某些场景下,我们能比较简单地向 AI 描述出什么能做,什么不能做。但有些场景,有些需求很难通过文字指令传递给 AI,即使描述出来了,AI 也不能很好地理解。
比如算一道数学题,先算乘法后算加法,需要给出过程。此时你就可以在 prompt里增加一些例子,我们看看这个例子。
这个是没有任何示例的 Prompt:
这个是给了样例之后的 Prompt,可以看到,符合我们预期的结果:
在问答这个大场景下,还有一个子场景是推理,这个场景非常有意思,而且是个非常值得深挖的场景,prompt 在此场景里发挥的作用非常大。
举个比较简单的例子,将一个古典的鸡兔同笼问题输入到 文心一言 中,会得到这样的解答结果:
除了回答问题外,另一个重要的场景是让 AI 根据你的要求完成一些内容生成任务,根据输出的结果差异,我将其概括为以下几个主要场景:
1.无中生有
2.锦上添花
3.化繁为简
本章,我们先来聊聊「无中生有」场景。顾名思义,就是让 AI 给你生成一些内容。你只需要向 AI 描述你想写的内容,AI 就会按你的要求写出该内容。比如:
1.撰写招聘信息
2.撰写电商平台的货物描述
3.撰写短视频脚本
4.甚至让它写代码都可以
像撰写招聘信息等,你只需要明确目标,将目标定得比较明确即可生成能让你较为满意的答案。本章我想聊下写代码。下面是一个让 文心一言 写代码的案例。
如下是让 文心一言 用python写一段将图片转为灰度图的代码,并在jupyter notebook中展示。
from PIL import Image
# 读取图片
img = Image.open('image.jpg')
# 将图片转换为灰度图像
gray_img = img.convert('L')
# 显示灰度图像
gray_img.show()
# 保存灰度图像
gray_img.save('gray_image.jpg')
除了从 0 生成内容外,你也可以先给 AI 一段已经写好的内容,然后让 AI 对其进行修改,让 AI 帮你将内容改得更好。实际的场景有如:
翻译:将中文文档翻译成英文,亦或者将英文翻译成中文。关于翻译,我还想强调,像 文心一言 除了能翻译人类的语言外,还能翻译编程语言,比如将 Python 代码翻译成 Haskell 代码。
修改:修改内容的语法,甄别内容里的错别字。
润色:润色文章,将内容改成另一种风格。
本章重点介绍下润色场景,下面这是个润色的例子。
技巧:增加角色或人物
我再介绍一个更有效的技巧,就是在 prompt 里增加一些 role(角色)相关的内容,让 AI 生成的内容更符合你的需求。
比如还是上面那个 rewrite 的例子,我在例子前加入这样的一段话,我让 AI 假设自己是一个小学老师,并且很擅长将复杂的内容转变成 7、8岁小朋友也能听懂的话,然后再改写这段话。就会得到下面这样的结果,话语变得更加活泼可爱了。
锦上添花下的第二大的场景是信息解释。它跟改写内容有点像,但又不太一样,信息解释有可能提供超过原文内容的信息。
举几个信息解释的例子,大家应该就能理解了:
解释代码:比如你看到一段 Python 的代码,但你看不懂,你可以让 AI 解释下代码的含义。
解释论文:看某篇论文看不懂,或者论文里的某一段看不懂,你也可以让 AI 解释。
以解释代码为例,它阐述了这段代码是拿来干什么的,同时还阐述了各个参数的含义。
内容生成大场景下的第二个场景是化繁为简,这个场景其实很好理解,就是将复杂的内容,转为简单的内容,一般常遇到的场景有:
信息总结:顾名思义,就是对一堆信息进行总结。
信息解释:这个跟改写内容有点像,但这个更偏向于解释与总结。下一章会给大家介绍更多的例子。
信息提取:提取信息里的某一段内容,比如从一大段文字中,找到关键内容,并分类。
本章会讲一下信息总结。信息总结还是比较简单的,基本上在 prompt 里加入总结 summarize 就可以了。但如果你想要一些特别的效果,不妨组合使用之前介绍的技巧,比如:
增加总结示例,让 AI 总结符合你需求的内容
增加 role,让 AI 总结的内容具有一定的风格
不过在这个场景,还有个技巧需要各位注意——使用 ”“” 符号将指令和需要处理的文本分开。不管是信息总结,还是信息提取,你一定会输入大段文字,甚至多段文字,此时有个小技巧。可以用 “”“ 将指令和文本分开。根据我的测试,如果你的文本有多段,增加 ”“” 会提升 AI 反馈的准确性。像我们之前写的 prompt 就属于 Less effective prompt。为什么呢?据我的测试,主要还是 AI 不知道什么是指令,什么是待处理的内容,用符号分隔开来会更利于 AI 区分。
介绍完信息总结,再聊聊信息提取,我认为这个场景是继场景3推理以外,第二个值得深挖的场景。这个场景有非常多的有意思的场景,比如:
将一大段文字,甚至网页里的内容,按要求转为一个表格。按照这个思路你可以尝试做一个更智能的,更易懂的爬虫插件。
按照特定格式对文章内容进行信息归类。
第二个可能比较难理解,举个 文心一言 里的例子,它的 prompt 是这样的
看完基础篇的各种场景介绍后,你应该对 Prompt 有较深的理解。
之前的章节我们讲的都是所谓的「术」,更多地集中讲如何用,但讲「道」的部分不多。高级篇除了会讲更高级的运用外,还会讲更多「道」的部分。
高级篇的开篇,我们来讲一下构成 prompt 的框架。
查阅了非常多关于文心一言 prompt 的框架资料,我目前觉得写得最清晰的是 Elavis Saravia 总结的框架,他认为一个 prompt 里需包含以下几个元素:
Instruction(必须): 指令,即你希望模型执行的具体任务。
Context(选填): 背景信息,或者说是上下文信息,这可以引导模型做出更好的反应。
Input Data(选填): 输入数据,告知模型需要处理的数据。
Output Indicator(选填): 输出指示器,告知模型我们要输出的类型或格式。
只要你按照这个框架写 prompt ,模型返回的结果都不会差。当然,你在写 prompt 的时候,并不一定要包含所有4个元素,而是可以根据自己的需求排列组合。比如拿前面的几个场景作为例子:
推理:Instruction + Context + Input Data
信息提取:Instruction + Context + Input Data + Output Indicator
另一个我觉得很不错的 Framework 是 Matt Nigh 的 CRISPE Framework,这个 framework 更加复杂,但完备性会比较高,比较适合用于编写 prompt 模板。CRISPE 分别代表以下含义:
CR: Capacity and Role(能力与角色)。你希望 文心一言 扮演怎样的角色。
I: Insight(洞察力),背景信息和上下文(坦率说来我觉得用 Context 更好)。
S: Statement(指令),你希望 文心一言 做什么。
P: Personality(个性),你希望 文心一言 以什么风格或方式回答你。
E: Experiment(尝试),要求 文心一言 为你提供多个答案。
以下是这几个参数的例子:
Step | Example |
---|---|
Capacity and Role | 把你想象成机器学习框架主题的软件开发专家,以及专业博客作者。 |
Insight | 这个博客的读者主要是有兴趣了解机器学习最新进展技术的专业人士。 |
Statement | 提供最流行的机器学习框架的全面概述,包括它们的优点和缺点。包括现实生活中的例子,和研究案例,以说明这些框架如何在各个行业中成功地被使用。 |
Personality | 在回应时,混合使用 Andrej Karpathy、Francois Chollet、Jeremy Howard 和 Yann LeCun 的写作风格。 |
Experiment | 给我多个不同的例子。 |
在文心一言中进行实验,会得到如下结果。
在基础篇里的推理场景,我提到了 Zero-Shot Prompting 的技术,本章会详细介绍它是什么,以及使用它的技巧。
Zero-Shot Prompting 是一种自然语言处理技术,可以让计算机模型根据提示或指令进行任务处理。各位常用的 文心一言 就用到这个技术。
传统的自然语言处理技术通常需要在大量标注数据上进行有监督的训练,以便模型可以对特定任务或领域进行准确的预测或生成输出。相比之下,Zero-Shot Prompting 的方法更为灵活和通用,因为它不需要针对每个新任务或领域都进行专门的训练。相反,它通过使用预先训练的语言模型和一些示例或提示,来帮助模型进行推理和生成输出。
举个例子,我们可以给 文心一言 一个简短的 prompt,比如 描述某部电影的故事情节,它就可以生成一个关于该情节的摘要,而不需要进行电影相关的专门训练。
但这个技术并不是没有缺点的:
1.Zero-Shot Prompting 技术依赖于预训练的语言模型,这些模型可能会受到训练数据集的限制和偏见。比如在使用 文心一言 的时候,它常常会在一些投资领域,使用男性的「他」,而不是女性的「她」。那是因为训练 文心一言 的数据里,提到金融投资领域的内容,多为男性。
2.尽管 Zero-Shot Prompting 技术不需要为每个任务训练单独的模型,但为了获得最佳性能,它需要大量的样本数据进行微调。像 文心一言 就是一个例子,它的样本数量是过千亿。
3.由于 Zero-Shot Prompting 技术的灵活性和通用性,它的输出有时可能不够准确,或不符合预期。这可能需要对模型进行进一步的微调或添加更多的提示文本来纠正。
基于上述的第三点缺点,研究人员就找到了一个叫 Chain of Thought 的技巧。
这个技巧使用起来非常简单,只需要在问题的结尾里放一句 Let‘s think step by step (让我们一步步地思考),模型输出的答案会更加准确。
这个技巧来自于 Kojima 等人 2022 年的论文 Large Language Models are Zero-Shot Reasoners。在论文里提到,当我们向模型提一个逻辑推理问题时,模型返回了一个错误的答案,但如果我们在问题最后加入 Let‘s think step by step 这句话之后,模型就生成了正确的答案:
论文里有讲到原因,感兴趣的朋友可以去看看,我简单解释下为什么( 如果你有更好的解释,不妨反馈给我):
1.首先各位要清楚像 文心一言 这类产品,它是一个统计语言模型,本质上是基于过去看到过的所有数据,用统计学意义上的预测结果进行下一步的输出(这也就是为什么你在使用 文心一言 的时候,它的答案是一个字一个字地吐出来,而不是直接给你的原因,因为答案是一个字一个字算出来的)。
2.当它拿到的数据里有逻辑,它就会通过统计学的方法将这些逻辑找出来,并将这些逻辑呈现给你,让你感觉到它的回答很有逻辑。
3.在计算的过程中,模型会进行很多假设运算(不过暂时不知道它是怎么算的)。比如解决某个问题是从 A 到 B 再到 C,中间有很多假设。
4.它第一次算出来的答案错误的原因,只是因为它在中间跳过了一些步骤(B)。而让模型一步步地思考,则有助于其按照完整的逻辑链(A > B > C)去运算,而不会跳过某些假设,最后算出正确的答案。
按照论文里的解释,零样本思维链涉及两个补全结果,左侧气泡表示基于提示输出的第一次的结果,右侧气泡表示其收到了第一次结果后,将最开始的提示一起拿去运算,最后得出了正确的答案:
这个技巧,除了用于解决复杂问题外,还适合生成一些连贯主题的内容,比如写长篇文章、电影剧本等。但需要注意其缺点,连贯不代表,它就一定不会算错,如果其中某一步骤算错了,错误会因为逻辑链,逐步将错误积累,导致生成的文本可能出现与预期不符的内容。另外,根据 Wei 等人在 2022 年的论文表明,它仅在大于等于 100B 参数的模型中使用才会有效。如果你使用的是小样本模型,这个方法不会生效。
我们在1.4.2中,提到我们可以给模型一些示例,从而让模型返回更符合我们需求的答案。这个技巧其实使用了一个叫 Few-Shot 的方法。这个方法最早是 Brown 等人在 2020 年发现的,论文里有一个这样的例子,非常有意思,通过这个例子你应该更能体会,像 文心一言 这类统计语言模型,其实并不懂意思,只是懂概率。
我输入的内容是这样的(追云、断月和落红雨 其实只是王者荣耀里的英雄技能):
不过这并不代表,Few-Shot 就没有缺陷,我们试试下面这个例子:
实际应该是:把所有的奇数相加(15,5,13,7,1)是41。答案是假的。
要想解决这个问题,可以使用Few-Shot Chain of Thought这个技巧。
要解决这个缺陷,就要使用到新的技巧,Few-Shot Chain of Thought。根据 Wei 他们团队在 2022 年的研究表明:
通过向大语言模型展示一些少量的样例,并在样例中解释推理过程,大语言模型在回答提示时也会显示推理过程。这种推理的解释往往会引导出更准确的结果。下面是论文里的案例,使用方法很简单,在技巧2 的基础上,再将逻辑过程告知给模型即可。从下面这个案例里,你可以看到加入解释后,输出的结果就正确了。
聊完技巧,我们再结合前面的 Zero-Shot Chain of Thought,来聊聊 Chain of Thought 的关键知识。根据 Sewon Min 等人在 2022 年的研究 表明,思维链有以下特点:
“the label space and the distribution of the input text specified by the demonstrations are both key (regardless of whether the labels are correct for individual inputs)” 标签空间和输入文本的分布都是关键因素(无论这些标签是否正确)。
the format you use also plays a key role in performance, even if you just use random labels, this is much better than no labels at all. 即使只是使用随机标签,使用适当的格式也能提高性能。
理解起来有点难,我找一个 prompt 案例给大家解释( 如果你有更好的解释,不妨反馈给我)。我给 文心一言 一些不一定准确的例子:
在上述的案例里,每一行,我都写了一句话和一个情感词,并用 情感分类 分开,但我给这些句子都标记了错误的答案,比如第一句其实应该是 积极的 才对。但:
1.即使我给内容打的标签是错误的(比如第一句话,其实应该是 积极的),对于模型来说,它仍然会知道需要输出什么东西。 换句话说,模型知道 情感分类: 后要输出一个衡量该句子表达何种感情的词(积极的 或 负面的)。这就是前面论文提到的,即使我给的标签是错误的,或者换句话说,是否基于事实,并不重要。标签和输入的文本,以及格式才是关键因素。
2.只要给了示例,即使随机的标签,对于模型生成结果来说,都是有帮助的。这就是前面论文里提到的内容。
最后,需要记住,思维链仅在使用大于等于 100B 参数的模型时,才会生效。
Self-Consistency 自洽是对 Chain of Thought 的一个补充,它能让模型生成多个思维链,然后取最多数答案的作为最终结果。
按照 Xuezhi Wang 等人在 2022 年发表的论文 https://arxiv.org/pdf/2203.11171.pdf 表明。当我们只用一个逻辑链进行优化时,模型依然有可能会算错,所以 XueZhi Wang 等人提出了一种新的方法,让模型进行多次运算,然后选取最多的答案作为最终结果:
就我目前使用下来,在 文心一言 上,其自洽性非常高,暂时没有遇到过出现多种答案的情况。查阅多份资料,我发现这个自洽性可能更多的用于评估模型的优劣,好的模型一般自洽性会比较高。
PAL Models,全称为 Program-Aided Language Models。需要各位注意,这个方法,真的非常高级,甚至我觉得有点 Hack。
但我在很多 PE 的教程里都有看到这个方法,所以我这里就简单介绍一下,这个方法来自于 2022 年,Luyu Gao 等人的研究 https://arxiv.org/pdf/2211.10435.pdf ,根据他们的研究,在 LLM 模型中,即使使用了前面提到的 Chain of Thought 的方法,也未必能拿到答案,论文中使用的 prompt 是这样的:
TODO:添加文心一言的例子。
这里汇总了所有 prompt 技巧,方便各位查阅。
在问答场景里,为了让 AI 回答更加准确,一般会在问题里加条件。比如让 AI 推荐一部电影给你。但这个 prompt 太空泛了,AI 无法直接回答,接着它会问你想要什么类型的电影,但这样你就需要跟 AI 聊很多轮,效率比较低。所以,为了提高效率,一般会在 prompt 里看到类似这样的话(意思是不要询问我对什么感兴趣,或者问我的个人信息):
<不要询问我对什么感兴趣,或者问我的个人信息>
如果你在 文心一言 里这样提问,或者使用 文心一言 最新的 API ,它就不会问你问题,而是直接推荐一部电影给你,它的 输出 是这样的:
但如果你使用的是如 Davinci-003 这样的模型,它的 Output 很可能是这样的,它还会问你的兴趣爱好:
<当然,我可以根据你的兴趣推荐一部电影。你想看什么样的电影?你喜欢动作片、喜剧片、爱情片还是其他的?>
所以 OpenAI 的 API 最佳实践文档里,提到了一个这样的最佳实践:与其告知模型不能干什么,不妨告诉模型能干什么。 我自己的实践是,虽然现在最新的模型已经理解什么是 Not Todo ,但如果你想要的是明确的答案,加入更多限定词,告知模型能干什么,回答的效率会更高,且预期会更明确。还是电影推荐这个案例,你可以加入一个限定词:推荐一部全球热门电影给我。
当然并不是 Not Todo 就不能用,如果:
你已经告知模型很明确的点,然后你想缩小范围,那增加一些 Not Todo 会提高不少效率。
你是在做一些探索,比如你不知道如何做精准限定,你只知道不要什么。那可以先加入 Not Todo ,让 AI 先发散给你答案,当探索完成后,再去优化 prompt。
直接告知 AI 什么能做,什么不能做外。在某些场景下,我们能比较简单地向 AI 描述出什么能做,什么不能做。但有些场景,有些需求很难通过文字指令传递给 AI,即使描述出来了,AI 也不能很好地理解。
比如算一道数学题,先算乘法后算加法,需要给出过程。此时你就可以在 prompt里增加一些例子,我们看看这个例子:
这个是没有任何示例的 Prompt:
这个是给了样例之后的 Prompt,可以看到,符合我们预期的结果:
如下是另一个将电影名字变成表情符号的示例,添加示例后,模型输出的结果明显更符合我们的预期。
在代码生成场景里,有一个小技巧,上面提到的案例,其 prompt 还可以继续优化,在 prompt 最后,增加一个代码的引导,告知 AI 我已经将条件描述完了,你可以写代码了。
如下是让 文心一言 用python写一段将图片转为灰度图的代码,并在jupyter notebook中展示。
介绍下润色场景,下面这是个润色的例子。
技巧:增加角色或人物
我再介绍一个更有效的技巧,就是在 prompt 里增加一些 role(角色)相关的内容,让 AI 生成的内容更符合你的需求。
比如还是上面那个 rewrite 的例子,我在例子前加入这样的一段话,我让 AI 假设自己是一个小学老师,并且很擅长将复杂的内容转变成 7、8岁小朋友也能听懂的话,然后再改写这段话。就会得到下面这样的结果,话语变得更加活泼可爱了。
使用 ”“” 符号将指令和需要处理的文本分开。不管是信息总结,还是信息提取,你一定会输入大段文字,甚至多段文字,此时有个小技巧。可以用 “”“ 将指令和文本分开。根据我的测试,如果你的文本有多段,增加 ”“” 会提升 AI 反馈的准确性。像我们之前写的 prompt 就属于 Less effective prompt。为什么呢?据我的测试,主要还是 AI 不知道什么是指令,什么是待处理的内容,用符号分隔开来会更利于 AI 区分。
关于这个场景和技巧,我想再解释一下为什么潜力很大。
根据我使用各种 Summary 或者信息提取的产品,我发现 AI 并不知道什么是重点,所以在总结的过程中,会丢失很多内容。如何引导 AI 进行总结,就变得非常重要,且具有一定的可玩性。
参考 2.2.3 节这个技巧使用起来非常简单,只需要在问题的结尾里放一句 Let‘s think step by step (让我们一步步地思考),模型输出的答案会更加准确。
这个技巧来自于 Kojima 等人 2022 年的论文 Large Language Models are Zero-Shot Reasoners。在论文里提到,当我们向模型提一个逻辑推理问题时,模型返回了一个错误的答案,但如果我们在问题最后加入 Let‘s think step by step 这句话之后,模型就生成了正确的答案:
参考 2.3.2 节。通过向大语言模型展示一些少量的样例,并在样例中解释推理过程,大语言模型在回答提示时也会显示推理过程。这种推理的解释往往会引导出更准确的结果。下面是论文里的案例,使用方法很简单,在技巧2 的基础上,再将逻辑过程告知给模型即可。从下面这个案例里,你可以看到加入解释后,输出的结果就正确了。
聊完技巧,我们再结合前面的 Zero-Shot Chain of Thought,来聊聊 Chain of Thought 的关键知识。根据 Sewon Min 等人在 2022 年的研究 表明,思维链有以下特点:
“the label space and the distribution of the input text specified by the demonstrations are both key (regardless of whether the labels are correct for individual inputs)” 标签空间和输入文本的分布都是关键因素(无论这些标签是否正确)。
the format you use also plays a key role in performance, even if you just use random labels, this is much better than no labels at all. 即使只是使用随机标签,使用适当的格式也能提高性能。
理解起来有点难,我找一个 prompt 案例给大家解释( 如果你有更好的解释,不妨反馈给我)。我给 文心一言 一些不一定准确的例子:
在上述的案例里,每一行,我都写了一句话和一个情感词,并用 情感分类 分开,但我给这些句子都标记了错误的答案,比如第一句其实应该是 积极的 才对。但:
1.即使我给内容打的标签是错误的(比如第一句话,其实应该是 积极的),对于模型来说,它仍然会知道需要输出什么东西。 换句话说,模型知道 情感分类: 后要输出一个衡量该句子表达何种感情的词(积极的 或 负面的)。这就是前面论文提到的,即使我给的标签是错误的,或者换句话说,是否基于事实,并不重要。标签和输入的文本,以及格式才是关键因素。
2.只要给了示例,即使随机的标签,对于模型生成结果来说,都是有帮助的。这就是前面论文里提到的内容。
最后,需要记住,思维链仅在使用大于等于 100B 参数的模型时,才会生效。
通过使用示例教学的方式,让模型知道当遇到超出回答范围时,需要如何处理。或者只希望模型用某些指定的词语来进行回答。
如下在 文心一言 上进行测试。可以看到,大模型可以降维成为文本分类器,但是与传统不同,我们并没有对其进行微调训练,只是用了prompt进行引导。
参考链接:https://aistudio.baidu.com/aistudio/projectdetail/5939683