Skip to main content

prompt工程

Prompt 工程(Prompt Engineering)可以被视为一门设计和优化输入提示(Prompt)的艺术和科学,以指导大型语言模型(LLM)高效、准确地完成特定任务。

下面我为你梳理一下学习 Prompt 工程需要掌握的方面:

阶段一:Prompt 工程基础与核心概念

  1. 理解 Prompt 的构成:

    • 指令 (Instruction): 明确告诉模型要做什么。例如:“将下面的英文翻译成中文:”
    • 上下文 (Context): 提供相关的背景信息,帮助模型理解任务。例如:在翻译任务中提供待翻译的文本。
    • 输入数据 (Input Data): 需要模型处理的具体内容。例如:在情感分析中提供待分析的句子。
    • 输出指示器/格式 (Output Indicator/Format): 提示模型期望的输出形式。例如:“输出JSON格式的结果:”、“请用一句话总结:”
  2. Prompt 的基本原则:

    • 清晰性 (Clarity): Prompt 应该简洁明了,避免歧义。
    • 具体性 (Specificity): 越具体,模型越容易理解你的意图。避免过于宽泛的指令。
    • 简洁性 (Conciseness): 在保证清晰和具体的前提下,尽量简短。过长的 Prompt 可能会引入噪音或让模型“分心”。(但有时为了提供充足上下文,长 Prompt 也是必要的)
    • 角色扮演 (Role Playing): 赋予模型一个角色,例如 "你现在是一个资深的市场分析师...",有时能引导模型产生更符合期望的输出。
  3. 基本的 Prompting 技巧 (Zero-shot, Few-shot):

    • Zero-shot Prompting (零样本提示): 直接给出指令和问题,不提供任何示例。依赖模型在预训练阶段学到的通用能力。
      • 例子: "将 'Hello, world!' 翻译成法语。"
    • Few-shot Prompting (少样本提示): 在 Prompt 中提供几个输入输出的示例 (demonstrations/examples),引导模型理解任务模式和期望的输出格式。
      • 例子:
        将英文翻译成法文:
        sea otter => loutre de mer
        peppermint => menthe poivrée
        plush girafe => girafe en peluche
        cheese =>  // 模型会续写 "fromage"
        
      • 示例的选择非常重要:
        • 示例的格式应与最终期望的输出格式一致。
        • 示例应覆盖任务的不同方面或边缘情况。
        • 示例的顺序有时也会影响结果。

阶段二:高级 Prompt 工程技巧

  1. 思维链 (Chain-of-Thought, CoT) Prompting:

    • 核心思想: 引导模型在给出最终答案之前,先输出一系列中间的推理步骤。这对于需要复杂推理的任务(如数学问题、逻辑推理)特别有效。
    • 做法: 在 Few-shot 示例中,不仅给出问题和答案,还给出详细的解题/思考过程。
    • 例子 (数学应用题):
      问:Natalia卖了48个贝果,早上卖了一些,下午卖了12个。她早上卖了多少个贝果?
      答:Natalia早上卖的贝果数量是总数减去下午卖的数量。总共卖了48个,下午卖了12个。所以她早上卖了 48 - 12 = 36 个贝果。最终答案是36。
      
      问:自助餐厅有23个苹果。如果他们用了20个做午餐,又买了6个,他们现在有多少个苹果?
      答: // 模型会尝试生成类似上面的推理步骤和答案
      
    • Zero-shot CoT: 甚至可以通过简单的指令如 "Let's think step by step." 来触发模型进行逐步思考,而无需提供示例。
  2. 自洽性 (Self-Consistency):

    • 核心思想: 对同一个问题,使用 CoT 进行多次采样(生成多个不同的推理路径),然后通过多数投票等方式选择最一致的答案。
    • 做法:
      1. 使用 Few-shot CoT Prompt。
      2. 对同一个输入,多次调用模型(通常设置较高的 temperature 以增加多样性),得到多个推理路径和答案。
      3. 选择出现次数最多的答案作为最终答案。
    • 效果: 能显著提高复杂推理任务的准确性,因为错误的推理路径通常更多样化,而正确的路径更容易收敛。
  3. 生成知识 Prompting (Generated Knowledge Prompting):

    • 核心思想: 先让模型生成与问题相关的知识或事实,然后将这些生成的知识加入到 Prompt 中,再让模型回答原始问题。
    • 做法:
      1. Prompt 1: "关于[主题X],生成一些有用的知识点。"
      2. 模型输出知识点 K。
      3. Prompt 2: "已知以下知识:[知识点K]。现在请回答:[原始问题]"
    • 效果: 对于需要背景知识的任务(如常识问答)有帮助。
  4. 指令微调 (Instruction Tuning) 与 Prompt Tuning (区分概念):

    • 指令微调:也是微调 这是一个模型训练的范畴。通过在大量 (指令, 输出) 对的数据集上微调预训练模型,使其更好地理解和遵循人类指令。很多强大的 LLM (如 GPT-3.5, GPT-4, Llama 2-Chat) 都经过了指令微调。
    • Prompt Tuning (PEFT 技术之一): 这是一种参数高效微调 (Parameter-Efficient Fine-Tuning, PEFT) 技术。它保持预训练模型的主体参数冻结,只学习一个小的、特定于任务的“软提示”(soft prompt) 向量。这个软提示向量会作为前缀添加到输入嵌入中。
      • 与我们这里主要讨论的“手动设计 Prompt”(硬提示)不同,软提示是可学习的向量,不是自然语言文本。
      • 学习 Prompt 工程时,重点是手动设计硬提示,但了解 Prompt Tuning 的概念有助于理解 LLM 技术的全貌。
  5. 结构化输出 (Structured Output Prompting):

    • 引导模型以特定的格式输出结果,如 JSON, XML, Markdown 表格等。
    • 技巧:
      • 在指令中明确要求输出格式。
      • 在 Few-shot 示例中展示期望的格式。
      • 有时可以提供部分输出的开头,让模型补全。
      • 例子: "请提取以下文本中的人名、地名和组织名,并以JSON格式输出,键为 'name', 'location', 'organization'。"
  6. 分解任务 (Decomposition / Step-by-step Prompting):

    • 将复杂任务分解为一系列更简单的子任务,为每个子任务设计 Prompt,然后逐步引导模型完成。
    • 类似于 CoT 的思想,但更侧重于将问题分解。
    • 例子:
      1. Prompt 1: "总结以下文章的主要观点。" (得到总结 S)
      2. Prompt 2: "基于以下总结:[总结S],生成三个相关的后续问题。"
  7. ReAct (Reasoning and Acting) 框架思想:

    • 核心思想: 迭代地让模型交替进行“思考/推理 (Thought)”和“行动 (Action)”。行动可以是查询外部知识库、使用工具(如计算器、搜索引擎API)等。
    • 这是一种更高级的 Agent 构建思路,Prompt 在其中扮演生成思考和决定行动的角色。
    • 例子:
      问题: "法国的首都是哪里?那里的现任市长是谁?"
      Thought 1: 我需要先找到法国的首都。
      Action 1: Search("法国 首都") -> (外部工具返回: "巴黎")
      Observation 1: 法国的首都是巴黎。
      Thought 2: 现在我需要找到巴黎的现任市长。
      Action 2: Search("巴黎 现任市长") -> (外部工具返回: "安妮·伊达尔戈")
      Observation 2: 巴黎的现任市长是安妮·伊达尔戈。
      Answer: 法国的首都是巴黎,现任市长是安妮·伊达尔戈。
      

阶段三:Prompt 迭代、评估与工具

  1. 迭代与实验:

    • Prompt 工程不是一蹴而就的,需要不断尝试、观察结果、调整 Prompt。
    • 记录不同 Prompt 的表现。
    • A/B 测试: 对比不同 Prompt 版本的效果。
  2. 评估 Prompt 效果:

    • 人工评估: 对于复杂或主观的任务,人工判断输出质量。
    • 自动评估指标:
      • 对于有标准答案的任务:准确率、F1 分数、BLEU (翻译)、ROUGE (摘要) 等。
      • 使用 LLM 作为评估者 (LLM-as-a-judge): 设计 Prompt 让另一个 LLM 来评估当前 LLM 的输出质量。
  3. Prompt 工程工具与平台:

    • Playgrounds: OpenAI Playground, Hugging Face Spaces, Google AI Studio 等,提供交互式环境测试 Prompt。
    • Prompt 管理工具: 一些工具帮助组织、版本控制和共享 Prompt (如 PromptPerfect, Langfuse, Vellum 等)。
    • 框架: LangChain, LlamaIndex 等框架提供了构建 LLM 应用的工具链,其中包含 Prompt 模板化、管理等功能。
  4. 理解模型局限性与 Prompt 陷阱:

    • 敏感性 (Sensitivity): LLM 对 Prompt 的微小改动可能非常敏感。
    • 幻觉 (Hallucination): 模型可能生成看似合理但不符合事实的内容。Prompt 需要引导模型基于提供的上下文或其可靠知识。
    • 偏见 (Bias): 模型的输出可能反映训练数据中的偏见。设计 Prompt 时要注意避免强化偏见。
    • 啰嗦/重复 (Verbosity/Repetition): 有时需要 Prompt 来限制输出长度或避免重复。
    • 指令漂移 (Instruction Drifting): 在长对话或复杂 Prompt 中,模型可能逐渐偏离最初的指令。

学习建议:

  1. 动手实践是王道: 理论学习后,立即去 Playground 或用代码实际尝试。
  2. 从简单开始: 先掌握 Zero-shot 和 Few-shot,再逐步尝试 CoT 等高级技巧。
  3. 阅读优秀 Prompt 案例: 学习别人是如何设计 Prompt 来解决特定问题的 (例如,GitHub 上有很多 Prompt 集合)。
  4. 关注最新的研究: Prompt 工程是一个快速发展的领域,新的技巧和方法层出不穷。
  5. 针对特定模型学习: 不同模型对 Prompt 的响应方式可能略有不同。例如,针对 GPT-3.5 优化的 Prompt 可能不完全适用于 Llama 2。
  6. 思考“为什么”: 当一个 Prompt 有效或无效时,尝试分析其原因,这能帮助你建立直觉。