Prompt Engineering
提示工程通过设计提供给 AI 模型的指令、上下文和示例来引导模型输出,无需重新训练,适用范围从 LLM 到视觉模型。
提示工程是设计生成式模型输入的实践,内容包括指令、上下文、示例和所需的输出格式,以引导模型的生成结果,而不改变模型的权重。它随着 GPT-3的出现而兴起:Language Models are Few-Shot Learners(2020)一文中,OpenAI 展示了一个拥有 1750 亿参数的模型如何在无需任何梯度更新的情况下执行新任务,只要提示描述了任务并提供少量示例;论文将这种能力称为上下文学习。如今,提示是控制大型语言模型(LLM)、视觉语言模型(VLM)、文本生成图像模型和可提示视觉模型的主要方式。
核心技术#
- 指令和角色:系统提示会设定模型的角色、规则和目标受众;标题或 XML 风格标签等分隔符则将指令与待处理数据分开。
- 少样本示例:成对展示输入和输出的示例,比文字描述更清楚地说明任务和答案格式。不含示例的提示称为零样本提示。
- 输出格式:提示会指定输出格式,例如列表或包含指定键的 JSON。当代码必须解析结果时,结构化输出会在解码期间强制遵循模式,而不是仅仅依赖请求。
- 思维链提示:要求模型在给出答案前提供中间推理步骤,这能提高模型解决多步问题的准确性。
- 提示链:将复杂任务拆分成多个提示,每个提示只负责一项范围明确的任务,并由代码将它们连接起来。
- 检索上下文:插入通过搜索找到的文档或数据,让模型根据提供的事实而非记忆作答。
提供事实可以减少幻觉,而事实的位置也很重要:Lost in the Middle研究发现,对于较长的上下文窗口,模型在信息位于开头或结尾时利用效果最好,信息埋在中间时效果最差。
在从未经过指令微调的基础模型上,示例的效果最容易观察。下面的代码片段使用 Hugging Face Transformers 加载 GPT-2,并分别在有三个示例和没有示例的情况下向它提供相同指令:
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
# The same instruction, without and with three worked examples that show the answer format
instruction = "Convert each country to its capital city.\n"
prompts = {
"zero-shot": instruction + "Italy:",
"few-shot": instruction + "France: Paris\nJapan: Tokyo\nCanada: Ottawa\nItaly:",
}
for name, prompt in prompts.items():
inputs = tokenizer(prompt, return_tensors="pt")
output = model.generate(**inputs, max_new_tokens=4, do_sample=False, pad_token_id=tokenizer.eos_token_id)
completion = tokenizer.decode(output[0, inputs.input_ids.shape[1] :])
print(f"{name}: {completion!r}")它会打印zero-shot: '\n\nItaly is'和few-shot: ' Rome\nSpain:'。单独提供指令时,GPT-2 会写一段关于意大利的文字;加入三个示例后,它就会按预期格式回答“Rome”,并按模式继续回答下一个国家。
提示设计需要实证验证#
措辞或布局的细微变化就可能显著影响结果。Melanie Sclar 及其同事测得,仅格式变化(例如分隔符、大小写和间距)就能让 LLaMA-2-13B 的准确率相差多达 76 个百分点;即使使用更大的模型、更多示例并进行指令微调,这种敏感性依然存在。因此,提示的开发方式应像代码一样:针对一组固定且已有正确输出的输入进行测试,根据失败案例修订并进行版本管理;这也是 LLMOps中的常规工作。
这个迭代过程可以自动化。Yongchao Zhou 及其同事提出的自动提示工程师(APE)会让 LLM 提出候选指令,并保留在示例上得分最高的指令;在 Large Language Models Are Human-Level Prompt Engineers中,他们发现 APE 在 24 项任务中的 19 项上,其指令效果与人工编写的指令持平或更好。
视觉模型的提示#
在计算机视觉中,提示有多种形式。像 Stable Diffusion这样的文生图生成器会根据主体、风格、光线和构图的描述,以及列出需避免内容的负向提示进行响应。可提示分割模型接受点和框等视觉提示;Meta 的 SAM 3还接受简短名词短语,并分割所有被提及概念的实例,Ultralytics Platform 会用它进行文本提示自动标注。
开放词汇检测器会将类别名称转换为提示。Ultralytics YOLOE可以检测和分割set_classes()所命名的任意类别,例如“forklift”或“double-decker bus”;它通过将区域特征与这些名称的文本嵌入进行比较来完成这一操作,因此措辞会直接影响模型找到的内容。由于匹配依据是外观,依赖状态、位置或比较的提示(例如“damaged”“left-most”或“the one being carried”)没有可靠的视觉特征可供匹配;与日常类别接近的名称效果最好。










