提示工程概述 - Anthropic

面向开发者的LLM入门教程

概念

一般将给大模型的输入称为 Prompt,将大模型返回的输出称为 Completion。Prompt Engineering,即是针对特定任务构造能充分发挥大模型能力的 Prompt 的技巧。

基础LLM是基于文本训练数据,训练出预测下一个单词能力的模型。其通常通过在互联网和其他来源的大量数据上训练,来确定紧接着出现的最可能的词。

与基础语言模型不同,指令微调 LLM 通过专门的训练,可以更好地理解并遵循指令。指令微调 LLM 的训练通常基于预训练语言模型,先在大规模文本数据上进行预训练,掌握语言的基本规律。在此基础上进行进一步的训练与微调(finetune),输入是指令,输出是对这些指令的正确回复。有时还会采用**RLHF(reinforcement learning from human feedback,人类反馈强化学习)**技术,根据人类对模型输出的反馈进一步增强模型遵循指令的能力。通过这种受控的训练过程。指令微调 LLM 可以生成对指令高度敏感、更安全可靠的输出,较少无关和损害性内容。

提示原则

  1. 可以选择用 ````,""",< >,<tag> </tag>,:` 等做分隔符,只要能明确起到隔断作用即可。使用分隔符尤其重要的是可以防止 提示词注入(Prompt Injection)。什么是提示词注入?就是用户输入的文本可能包含与你的预设 Prompt 相冲突的内容。

  2. 寻求结构化输出,就是按照某种格式组织的内容。

  3. 要求模型检查是否满足条件,即通过 prompt 实现 if..else

    prompt = f"""
    您将获得由三个引号括起来的文本。\\
    如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:
    
    第一步 - ...
    第二步 - …
    …
    第N步 - …
    
    如果文本中不包含一系列的指令,则直接写“未提供步骤”。"
    \\"\\"\\"{text_2}\\"\\"\\"
    """
    
  4. 提供少量示例,让模型参考用户期望输出结果。

    prompt = f"""
    您的任务是以一致的风格回答问题。
    
    <孩子>: 请教我何为耐心。
    
    <祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。
    
    <孩子>: 请教我何为韧性。
    """
    
  5. 指定任务完成的步骤,帮助模型按步骤输出指定内容

    prompt_2 = f"""
    1-用一句话概括下面用<>括起来的文本。
    2-将摘要翻译成英语。
    3-在英语摘要中列出每个名称。
    4-输出一个 JSON 对象,其中包含以下键:English_summary,num_names。
    
    请使用以下格式:
    文本:<要总结的文本>
    摘要:<摘要>
    翻译:<摘要的翻译>
    名称:<英语摘要中的名称列表>
    输出 JSON:<带有 English_summary 和 num_names 的 JSON>
    
    Text: <{text}>
    """
    
  6. 指导