跳转至

如何写 Prompt

Prompt n. [C] /prɑːmpt/
(电脑终端的)提示符;(给演员的)提词。
(不是 promote,不是 promote,不是 promote)

这里 Prompt 引申为了给 LLM 的 ”提示词“,即,提示大模型开始执行什么工作。

就像演员水平越高、向演员的提词越准确,演员的表演就越顺利,提示词越准确、越贴切,LLM 本身能力越强,最后完成工作的效果就越好。

同样类似向演员提词,演员在表演过程中,能看到的提词是有上限的,过多的提词会占用演员的注意力让其分心;LLM 也遵循类似的原理。甚至因为 LLM 是通过预测下一个 token 进行连续输出、输入和输出实际上是做直接拼接的,输入如果没有提供详细且有效的信息,反而会干扰 LLM 的输出表现。

因此,我们需要学习如何以更好的方式来书写 Prompt。你可以充分运用下面的五种技巧来学习如何书写 Prompt。

1. 格式化

LLM 是以大量的格式化的内容进行训练的,因此 LLM 天生偏好格式化的文本形式和内容。

简单起见,可以直接使用 markdown 来书写 Prompt。注意在内容中,按照总分/总分总 + 额外注意事项的顺序组织内容,且书写内容循序渐进,按照顺序执行的流程,事无巨细向 LLM 描述。

一个供参考的格式如下:

# 任务
任务内容

# 任务详细介绍
详细介绍

# 任务完成过程
## 步骤1
### 步骤细则1
### 步骤细则2
## 步骤2
### 步骤细则2
……

# 注意事项
## 事项1
## 事项2

# 用户输入
用户输入

2. 恰当使用角色扮演的格式

LLM 的另一个常见功能是“角色”扮演。这里的”角色“并不局限为人,而是范围更加广阔的、能以连续的字符形式输出内容的一切事物。

LLM 可以扮演以下的“角色”:

  • 一只可爱猫娘,说话可爱粘人,句尾必然带“喵”;
  • 一个严苛的审稿人,准备以领域顶会的视角审视你的学术论文、指出其中的问题,并提出相应意见;
  • 一个系统命令行,假装自己是一台 linux 虚拟机,你输入指令,它输出返回的结果、报错等;
  • 一个CV打标器,根据用户输入的图片和指定的物品类型,输出能够框选物品的方框的四角坐标;
  • 一个 SVG 图片生成器,直接生成一个 SVG 图片对应的代码; 等等。

因此,可以使用如下的简单的角色扮演 Prompt 来约束 LLM:

你是 [需要扮演的角色],你的任务是[接受何种输入,进行何种工作,输出何种内容]。

# 格式化规则1
## 1.1. 格式化细则1

# 格式化规则2
## 1.2. 格式化细则2
……

更复杂的例子,可以自行搜索以下关键词:

  • 角色卡:极其复杂的角色扮演 Prompt 格式,当下角色扮演的事实标准;
  • 赛博酒馆 SillyTarven:目前最复杂、功能最强大的的开源角色扮演框架,使用角色卡驱动 LLM 进行角色扮演;
  • DeepSeek 官方角色扮演教程:来自 DeepSeek 研究员陈德里,DeepSeek-V4 的角色扮演标准格式。

3. Few-Shot

Few-Shot,即“少样本学习”,来自于 OpenAI 于2020年发布的 GPT3 论文 Language Models are Few-Shot Learners。它指的是在推理阶段,通过将少量任务示例(通常为10到100个)作为上下文条件提供给模型,在不更新模型本身权重的前提下,仅根据这些示例和自然语言指令,来理解并执行新任务的一种设置。

例如,在将英语翻译成法语的任务中,先给模型展示几个英法翻译示例,再给出一个新的英语句子,模型即可预测其法语翻译。

Few-Shot 的核心机制是“上下文学习”(in-context learning):模型在海量文本上预训练时已习得广泛的模式和技能,此时无需调整权重,只需在输入序列中展示几个“输入-输出”对作为演示,模型便能“领悟”任务模式,并补全后续新输入的预期输出。例

Few-Shot 的优势在于能够充分发挥 LLM 的泛化能力。LLM 仅需少量参考样本就能学到大部分任务的效果,而且非常接近于人类通过少量示例或简单指令进行快速学习的过程。

在 Prompt 中进行 Few-Shot 的示例如下:

你是 [需要扮演的角色],你的任务是[接受何种输入,进行何种工作,输出何种内容]。

# 格式化规则1
## 1.1. 格式化细则1
例:
样例输入1
样例输出1
样例输入2
样例输出2

4. 充分利用缓存

大模型的多轮对话,实际上是把前面所有问答进行顺序拼接,并添加用户最后一次的问题,再进行推理并返回 Token 的。也就是说,每新增一轮对话,前面的轮次理论上都要重复计算。工程师发明了一种缓存旧的计算状态的办法(KVCache),可以把历史对话保存一段时间。这样,如果用户在缓存还存在的时候,接续旧的内容进行提问,服务商就可以只计算用户的新输入,而旧的输入可以直接从缓存读取并拼接。

缓存对 LLM 服务商和用户是双赢的,可以参考 DeepSeek 命中/未命中缓存的价格,以及DeepSeek 的缓存方式

缓存可以只缓存一段 Prompt 的一部分,也就是说,只要 Prompt 靠前的不可变内容越多,整体上就能吃到越多的缓存,相对来说就会更加省钱。

这提醒我们,书写 Prompt 的时候,需要尽量把可变内容放到靠后的位置。常见的可变内容有用户输入,时间、地点等系统信息,等等。

5. 让 LLM / Agent 教你

这可能是最简单粗暴的方法。 对于网页端用户,你可以直接把你的需求、任务、注意事项等直接发给 AI,或者和它进行多轮讨论,并最终得到可用的 Prompt;对于 CLI,可以打开计划模式,不同的 Agent 打开方式不同,但是大部分都可以通过直接在终端输入 /plan 并直接回车以进入计划模式。计划模式结束后, Agent 会直接给你一大串接下来要执行的计划,可以直接学习这个计划 Prompt 的结构和书写方式,以及它的思考方法。