随着GPT-3等大语言模型的发展,Prompt工程越来越受到关注。同样的模型,不同的Prompt,效果天差地别。有人用GPT-3写出了惊艳的文章,有人却觉得它"人工智障",区别往往就在于Prompt写得好不好。

Prompt工程(Prompt Engineering)就是研究如何设计和优化提示词,让大语言模型输出更好结果的一门技术。它不是玄学,而是有原理、有方法、有技巧的。

我研究大语言模型和Prompt工程有一段时间了,做过很多实验,也踩过不少坑。今天深入剖析一下Prompt工程的底层机制,包括大语言模型的工作原理、Prompt设计的核心原则、常用技巧、进阶方法,以及实际应用案例。希望能帮你写出更好的Prompt,充分发挥大模型的能力。

先说明一下,本文主要基于GPT-3系列模型(包括Davinci、Curie等),很多原理也适用于其他大语言模型。2022年初,大语言模型还在快速发展中,本文的内容可能会随着模型演进而变化。

一、大语言模型是怎么工作的

要理解Prompt工程,首先要理解大语言模型是怎么工作的。

1. 语言模型的本质:预测下一个词

大语言模型(Large Language Model,LLM)的本质,就是一个"下一个词预测器"。给它一段文本,它会预测下一个最可能出现的词是什么,然后把这个词加进去,再预测下一个,如此循环,直到生成完整的回答。

比如你输入"今天天气真",模型可能预测下一个词是"好",然后是"啊",再是",",最后生成"今天天气真好啊,适合出去玩"。

这个过程看起来简单,但模型是在庞大的文本数据上训练出来的,学到了语言的规律、知识和逻辑,所以预测出来的内容往往很通顺、很合理。

2. Prompt就是上下文

模型预测下一个词,依据的是你给它的上下文,也就是Prompt。Prompt里有什么,模型就会基于什么来生成。

如果你给的Prompt是"请把以下英文翻译成中文:Hello",模型就会基于"翻译"这个上下文,预测下一个词是"你好"。如果你给的Prompt是"Hello的中文意思是",模型也会生成"你好"。

所以,Prompt就是你给模型的"上下文"和"指令",它决定了模型会从哪个角度、用什么方式来生成内容。

3. 模型没有"理解",只有模式匹配

很多人以为大语言模型真的"理解"了你的问题,其实不是。它只是在训练数据中学到了模式,根据Prompt的模式,预测最可能的输出。

这就是为什么Prompt这么重要。你给它什么样的模式,它就会输出什么样的结果。Prompt写得清楚、准确、有例子,模型就能"猜"到你想要什么;Prompt写得模糊、有歧义,模型就可能输出你不想要的东西。

理解了这一点,你就理解了Prompt工程的核心:通过设计Prompt,给模型一个清晰的模式,让它"猜"到你想要的输出。

二、Prompt设计的核心原则

在讲具体技巧之前,先说说Prompt设计的几个核心原则。这些原则是基础,比具体技巧更重要。

1. 明确指令

Prompt里要明确告诉模型你要它做什么。不要让模型猜你的意图,要直接说出来。

不好的例子:"写点关于人工智能的东西" 好的例子:"写一篇500字的文章,介绍人工智能在医疗领域的三个应用,语言通俗易懂,适合普通读者"

第二个例子明确了主题、长度、内容、受众和风格,模型输出的质量会高很多。

2. 提供上下文

模型不知道你的背景、你的目的、你的使用场景。你需要在Prompt里提供足够的上下文,让模型知道"在什么情况下,为谁,做什么"。

比如你要写一封邮件,要告诉模型:这封邮件是发给谁的(客户/老板/同事),目的是什么(请假/推销/道歉),你的身份是什么,语气应该是什么样的。

3. 给出示例(Few-shot)

如果任务比较复杂,光说指令可能不够,最好给几个示例。示例是最有效的Prompt技巧之一,模型会模仿示例的格式和风格来输出。

比如你想让模型把一句话改得更礼貌,可以给几个例子: 输入:"把这个文件发给我" 输出:"麻烦你把这个文件发给我,谢谢" 输入:"明天开会" 输出:"明天有个会议,请准时参加" 然后再给你要处理的句子,模型就会按照示例的格式来改。

4. 指定格式

如果你需要特定格式的输出(比如JSON、表格、列表),一定要在Prompt里明确指定。最好给一个格式示例。

比如:"请以JSON格式输出,包含name、age、city三个字段",然后给一个示例:{"name": "张三", "age": 25, "city": "北京"}。

5. 分步引导

对于复杂的任务,可以把它拆成几步,引导模型一步步完成。比如:"第一步,总结这篇文章的主要观点。第二步,分析每个观点的论据。第三步,给出你的评价。"

分步引导能让模型的输出更有条理,也能减少错误。

三、常用Prompt技巧

掌握了核心原则,再来看看具体的技巧。这些技巧都是经过大量实验验证有效的。

1. Zero-shot vs Few-shot

  • Zero-shot(零样本):不给示例,只给指令。适合简单的任务,比如翻译、总结、简单问答。
  • Few-shot(少样本):给几个示例。适合复杂的任务,比如特定格式的输出、风格模仿、复杂分类。

一般来说,Few-shot的效果比Zero-shot好,但会消耗更多的token(费用更高,输入更长)。根据任务复杂度选择。

2. 角色扮演

让模型扮演一个角色,能显著提升输出质量。比如: "你是一个有10年经验的资深前端工程师,请回答以下问题..." "你是一个专业的文案编辑,请帮我修改以下文案..."

角色扮演能让模型进入特定的"模式",用那个角色的知识和语气来回答。

3. 思维链(Chain of Thought)

对于需要推理的问题(数学题、逻辑题),让模型"一步步思考",能大幅提升准确率。方法是在Prompt里加一句"请一步步思考,并给出推理过程",或者给一个带推理过程的示例。

比如:"一个苹果3元,买5个苹果多少钱?请一步步思考。" 模型会先写"一个苹果3元,买5个就是3×5=15元",然后给出答案。这样比直接问答案准确率高很多。

4. 指令前缀

用明确的指令词开头,比如"请翻译:""请总结:""请写一篇关于...的文章"。不要用模糊的提问,比如"这个怎么弄"。

指令前缀能让模型快速识别任务类型,进入正确的模式。

5. 分隔符

用分隔符把指令和内容分开,比如用"""、---、###等。比如: """请总结以下文章的主要内容:


(文章内容)

---"""

分隔符能让模型清楚地知道哪里是指令,哪里是要处理的内容,减少混淆。

6. 温度(Temperature)参数

Temperature是API的参数,控制输出的随机性。Temperature越低(比如0.1),输出越确定、越保守;Temperature越高(比如0.9),输出越随机、越有创意。

  • 事实性任务(问答、翻译、总结):用低Temperature(0-0.3)
  • 创意性任务(写故事、写诗、头脑风暴):用高Temperature(0.7-1.0)

这个不是Prompt本身的技巧,但和Prompt配合使用很重要。

四、进阶Prompt方法

除了基础技巧,还有一些进阶方法,能处理更复杂的任务。

1. 自我一致性(Self-Consistency)

对于推理问题,让模型生成多个答案(用不同的随机种子),然后选出现次数最多的那个。比如同一个数学题,生成5次答案,如果3次是15,2次是12,就选15。

这种方法能显著提升推理任务的准确率,因为模型偶尔会犯错误,但多次生成后,正确答案出现的概率更高。

2. 迭代优化

不要指望一次就能写出完美的Prompt。先写一个版本,看看输出哪里不好,然后针对性地修改Prompt,再测试,反复迭代。

比如模型输出太啰嗦,就在Prompt里加"请简洁明了,不超过200字";模型输出格式不对,就加一个格式示例;模型遗漏了某个点,就在指令里明确要求包含那个点。

Prompt工程是一个实验的过程,不断测试、不断优化,才能得到最好的结果。

3. 提示词模板

对于重复性的任务,可以做一个Prompt模板,把可变的部分用占位符代替,每次只填占位符就行。

比如一个翻译模板: """你是一个专业翻译,请把以下{sourcelang}翻译成{targetlang},要求:

  1. 准确传达原意
  2. 符合{target_lang}的表达习惯
  3. 专业术语保持一致

原文:


{text}


译文:"""

每次使用时,填入sourcelang、targetlang和text就行。模板能保证一致性,提高效率。

4. 知识增强

如果模型缺少某个领域的知识,可以在Prompt里提供相关的背景知识,让模型基于这些知识来回答。比如: """以下是关于XXX的背景资料: (资料内容) 请基于以上资料,回答以下问题:XXX"""

这种方法叫"检索增强生成"(RAG)的简化版,能有效减少模型的幻觉(编造不存在的事实)。

五、常见的坑

最后说说Prompt工程中常见的坑,很多人都踩过。

坑一:Prompt太模糊

最常见的问题就是Prompt太模糊,模型不知道你要什么。比如"写一篇关于健康的文章",模型可能写饮食,可能写运动,可能写心理健康,写出来的不一定是你想要的。

解决方法:明确主题、长度、受众、风格、要点。越具体越好。

坑二:一次给太多任务

一个Prompt里塞太多任务,模型可能顾此失彼。比如"请总结这篇文章,翻译成英文,再写一篇读后感",模型可能总结得不好,翻译得也不好,读后感也敷衍。

解决方法:复杂任务拆成多个Prompt,分步完成。先总结,再翻译,再写读后感。

坑三:相信模型说的都是对的

大语言模型会"幻觉",也就是一本正经地胡说八道。它可能编造不存在的事实、引用不存在的论文、给出错误的答案。尤其是专业领域的问题,一定要核实。

解决方法:重要的事实要交叉验证,不要完全相信模型的输出。可以用知识增强的方法,给模型提供可靠的资料。

坑四:忽略token限制

模型有最大token限制(比如GPT-3 Davinci是2048或4096 token),Prompt太长会被截断,或者报错。

解决方法:控制Prompt长度,必要时精简内容。长文本可以分段处理,或者先摘要再处理。

坑五:不测试就上线

Prompt写好后不测试,直接用到生产环境,可能会出问题。比如模型偶尔输出奇怪的内容,或者格式不对。

解决方法:用多个测试用例测试Prompt,覆盖各种情况。看看边界情况(输入很短、很长、很奇怪)模型的表现。

六、实际应用案例

分享几个我实际用过的Prompt案例,供参考。

案例一:文章摘要

请总结以下文章的主要内容,要求:
1. 不超过200字
2. 包含文章的核心观点
3. 语言简洁,适合快速阅读
文章:
---
{article}
---
总结:

这个Prompt用来给公众号文章写摘要,效果不错。明确了长度、内容和风格。

案例二:代码解释

你是一个资深软件工程师,请解释以下代码的功能和逻辑。要求:
1. 先用一句话概括代码功能
2. 然后逐段解释关键逻辑
3. 最后指出可能的问题或改进建议
代码:
---
{code}
---
解释:

这个Prompt用来理解陌生的代码,模型会给出清晰的解释,比自己读快很多。

案例三:邮件撰写

你是一个专业的商务人士,请帮我写一封邮件。
背景:我要给客户发一封邮件,告知项目延期一周,原因是需求变更,需要客户确认新的时间线。
要求:
1. 语气诚恳但专业
2. 说明延期原因和新的时间计划
3. 请客户确认是否接受
4. 不超过300字
邮件:

这个Prompt写出来的邮件质量很高,稍微改改就能用。

七、写在最后

Prompt工程是大语言模型时代的核心技能。随着模型越来越强大,会不会写Prompt,决定了你能不能充分发挥模型的能力。

但Prompt工程不是玄学,也不是什么高深的技术。它的核心就是:理解模型的工作原理,明确你的需求,给模型清晰的指令和上下文,然后不断测试和优化。

2022年了,大语言模型还在快速发展,能力越来越强,应用场景越来越广。掌握Prompt工程,就像掌握了搜索引擎的使用技巧一样,会成为一项基础能力。

希望这篇文章能帮你理解Prompt工程的原理,写出更好的Prompt。如果你有其他技巧或者问题,欢迎在评论区交流。

最后提醒一句:大语言模型虽然强大,但不是万能的。它会犯错,会幻觉,会有偏见。重要的事情一定要人工审核,不要完全依赖模型。用它来提高效率,而不是代替你的思考。

祝大家都能玩转Prompt,让AI成为你的得力助手。