提示词工程完全指南

Prompt Engineering Complete Guide

来源参考:OpenAI 官方指南、DAIR.AI Prompt Engineering Guide、IBM、Google Research、斯坦福 CS224N
整理用于学习交流


目录

  1. 什么是提示词工程
  2. 六大核心策略(OpenAI 官方)
  3. 基础技巧
  4. 进阶技巧
  5. 高级推理技术
  6. 结构化输出
  7. 提示词框架
  8. 资源推荐

一、什么是提示词工程

提示词工程(Prompt Engineering)是一门与大型语言模型(LLM)有效交互的技术学科,涵盖提示词的设计、优化和管理。其核心目标是引导 AI 模型准确、高效地完成各类任务。

AI 时代的关键技能:
Prompt(提示词) = AGI 时代的「编程语言」
Prompt Engineering = AGI 时代的「软件工程」
提示工程师 = AGI 时代的「程序员」

提示词的四大核心要素

┌─────────────────────────────────────────┐
│           完整的 Prompt 应包含:           │
├─────────────────────────────────────────┤
│  1. Instruction(指令)—— 必须           │
│     你希望模型执行的具体任务               │
│                                         │
│  2. Context(上下文)—— 可选              │
│     背景信息、额外知识、参考资料            │
│                                         │
│  3. Input Data(输入数据)—— 可选          │
│     需要模型处理的内容                    │
│                                         │
│  4. Output Indicator(输出指示器)—— 可选   │
│     期望的输出格式、类型、风格             │
└─────────────────────────────────────────┘

二、六大核心策略(OpenAI 官方)

OpenAI 官方发布的提示词工程指南,推荐所有学习者优先阅读。
原文:https://platform.openai.com/docs/guides/prompt-engineering

策略一:写出清晰的指令

模型无法读懂你的心思,写得越清晰,输出越符合预期。

1.1 在 prompt 中包含详细信息
# 差:模糊
"总结一下这份文件。"

# 好:具体
"总结这份产品需求文档,包含:核心功能(不超过3点)、
用户体验改进、主要风险,每点用一句话说明。"
1.2 要求模型扮演专家角色
"你是一位有10年经验的高级软件架构师,
擅长设计高可用、可扩展的系统架构。
请评审以下架构设计:..."
1.3 使用分隔符清晰地划分不同部分
"""
请分析以下内容,按照要求输出:

===== 内容开始 =====
{article_content}
===== 内容结束 =====

分析要求:
1. 提取核心论点(3点)
2. 判断作者立场(支持/反对/中立)
3. 找出最主要的论据

===== 你的分析 =====
"""
1.4 明确指定完成任务所需的步骤
"请按以下步骤处理这段文本:

Step 1: 识别文本中提到的所有人名
Step 2: 提取每个人名的职位信息
Step 3: 用表格形式输出结果,列为【姓名 | 职位】

文本:{text}
"""

策略二:提供参考文本(RAG 思想来源)

让模型基于你提供的内容回答,而非凭"记忆"。

"基于以下参考资料回答问题。如果资料中没有相关信息,请直接回答'资料不足',
不要编造内容。

参考资料:
{reference_text}

问题:{question}"

策略三:将复杂任务分解为简单步骤

# 不要让模型一步到位完成复杂任务
"写一个完整的电商系统"

# 分解为多个简单任务
"帮我开发一个电商系统,请按以下顺序进行:

Step 1: 列出核心功能模块和优先级
Step 2: 设计数据库表结构
Step 3: 给出 API 接口设计

请先完成 Step 1,等我确认后再进行下一步。"

策略四:指定输出的结构格式

# 要求模型输出 JSON
"请以 JSON 格式返回用户的等级信息:
{
  "user_id": "用户ID",
  "level": "等级(铜/银/金/钻)",
  "points": "当前积分",
  "next_level": "距离下一等级还需多少积分"
}"

# 要求表格输出
"将以下数据整理为 Markdown 表格:
商品名称 | 原价 | 折扣价 | 节省金额"

# 要求分点输出
"用 Markdown 列表格式输出,不超过5点,每点不超过20字"

策略五:使用"最具体"的指令

# 差:笼统
"让代码更好。"

# 好:具体
"优化这段 Python 代码:
1. 减少时间复杂度(目前是 O(n^2))
2. 添加类型注解
3. 添加 docstring
4. 确保通过 PEP8 检查"

策略六:系统性地测试变化

# 测试不同 prompt 版本的效果
prompts = [
    "简洁回答",
    "详细回答,包括利弊分析",
    "用专业术语回答,适合技术人员"
]

results = {}
for prompt in prompts:
    response = llm.generate(prompt)
    score = evaluate(response)  # 自定义评估函数
    results[prompt] = {"response": response, "score": score}

# 选择得分最高的 prompt
best_prompt = max(results, key=lambda x: results[x]["score"])

三、基础技巧

3.1 零样本提示(Zero-shot Prompting)

不给任何示例,直接下达指令。

# 直接指令
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "user", "content": "将以下句子分类为积极、消极或中立:今天天气真好!"}
    ]
)
# 输出:积极

适用场景:简单任务、模型已具备的能力、指令足够清晰时。


3.2 少样本提示(Few-shot Prompting)

通过提供少量示例,让模型理解任务模式和输出格式。

# 无示例(可能输出不统一)
"翻译:苹果"

# 有示例(输出格式稳定)
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "user", "content": """将中文水果名翻译为英文。

示例:
- 香蕉 -> Banana
- 葡萄 -> Grape
- 橙子 -> Orange

请翻译:
- 苹果"""}
    ]
)
# 输出:Apple
Few-shot 的核心要点
要点 说明 示例
示例数量 1-5 个为宜,过多反而降低效果 翻译任务:3-5 个水果
示例覆盖 覆盖常见情况和边缘情况 包含阳性/阴性/中性情感
格式一致 Input 和 Output 格式保持统一 都用 “中文 -> 英文” 格式
正负示例 必要时提供负示例帮助模型理解边界 “苹果不是 Apple Watch”
动态 Few-shot(从知识库选取最相关示例)
from sklearn.metrics.pairwise import cosine_similarity

def find_similar_examples(query: str, examples: list, k: int = 3) -> list:
    """根据语义相似度选取最相关的 few-shot 示例"""
    query_embedding = embedding.embed_query(query)
    example_embeddings = [embedding.embed_query(e["input"]) for e in examples]
    
    similarities = cosine_similarity([query_embedding], example_embeddings)[0]
    top_k_idx = similarities.argsort()[-k:][::-1]
    
    return [examples[i] for i in top_k_idx]

# 构建动态 prompt
relevant_examples = find_similar_examples(user_query, few_shot_examples, k=3)
prompt = build_few_shot_prompt(relevant_examples, user_query)

3.3 角色扮演提示(Role Prompting)

赋予模型特定身份,提升回答的专业度和适配度。

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": """你是一位资深律师,擅长合同审查和风险评估。
你的回答风格:
- 语言严谨,使用法律术语
- 先说结论,再说依据
- 指出潜在风险点"""},
        {"role": "user", "content": "请审查这份劳动合同中的竞业限制条款"}
    ]
)
角色描述的黄金结构
[专业背景] 你是一名[职业],[年限]年经验
[擅长领域] 擅长[具体领域],尤其是[细分技能]
[回答风格] 你的回答风格:[描述风格]
[输出格式] 请按以下格式回答:[描述格式]
[限制条件] 注意:[重要约束]

3.4 使用分隔符(Delimiters)

防止提示词注入攻击,同时帮助模型理解结构。

# 使用 XML 标签作为分隔符
prompt = """<instruction>
你是新闻编辑,负责改写文章标题,使其更吸引人。
</instruction>

<rules>
1. 标题不超过20个字
2. 使用数字开头效果更好
3. 避免标题党,保持真实性
</rules>

<article>
{article_content}
</article>

<output_format>
直接输出标题,不要解释。
</output_format>"""

# 使用 Markdown 代码块作为分隔符
prompt = """请分析以下代码:

{
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
}

分析维度:
1. 时间复杂度
2. 空间复杂度
3. 优化建议"""

四、进阶技巧

4.1 思维链提示(Chain-of-Thought, CoT)

核心思想:让模型在给出最终答案之前,先展示推理过程。

# 普通推理(容易出错)
"小明有5个苹果,小红给了他3个,小明吃了2个,还剩几个?"
# 模型可能直接答错

# CoT 推理(分步思考)
cot_prompt = """问题:小明有5个苹果,小红给了他3个,小明吃了2个,还剩几个?

请按以下步骤思考:
Step 1: 小明最初有几个苹果? -> 5个
Step 2: 小红给了他几个? -> 3个,现在有 5+3=8个
Step 3: 小明吃了几个? -> 2个,现在有 8-2=6个
Step 4: 最终答案:6个

答案:6个"""

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": cot_prompt}]
)
Zero-shot CoT(自动触发)
# 在问题后加一句"请一步一步思考"
prompt = """问题:一个商店上午卖了30件商品,下午比上午多卖了10件。
一天总共卖了75件商品。下午卖了多少件?

请一步一步思考:"""

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": prompt}]
)
CoT 的适用场景
场景 效果 原因
数学推理 显著提升 需要多步计算
逻辑推理 显著提升 需要因果链分析
代码调试 显著提升 需要定位问题根源
常识问答 一般提升 简单问题无需拆解
情感分类 无需使用 单步判断即可

4.2 自我一致性(Self-Consistency)

核心思想:让模型生成多条推理链,选择出现最多的答案。

def self_consistency(query: str, n_samples: int = 5) -> str:
    """自我一致性:从多条推理路径中选择最一致的答案"""
    
    # 让模型生成多个答案
    answers = []
    for _ in range(n_samples):
        prompt = f"""{query}

请一步一步思考:"""
        response = llm.generate(prompt)
        # 提取答案(如从响应中解析数字结果)
        answer = extract_answer(response)
        answers.append(answer)
    
    # 多数投票
    from collections import Counter
    most_common = Counter(answers).most_common(1)[0]
    return most_common[0]

# 示例
result = self_consistency(
    "一个书店进了60本书,第一天卖了1/3,第二天卖了剩下的1/2,还剩多少本?",
    n_samples=5
)

4.3 生成知识提示(Generated Knowledge)

核心思想:让模型先生成相关知识,再基于知识回答。

def generated_knowledge_prompt(query: str) -> str:
    """先生成相关知识,再回答问题"""
    
    # Step 1: 生成相关知识
    knowledge_prompt = f"""关于"{query}",请列出5个最相关的事实或背景知识。
格式:每条一行,简明扼要。"""
    knowledge = llm.generate(knowledge_prompt)
    
    # Step 2: 基于知识回答
    answer_prompt = f"""基于以下知识回答问题:

知识:
{knowledge}

问题:{query}

回答(引用知识来源):"""
    answer = llm.generate(answer_prompt)
    return answer

4.4 自动思维链(Auto-CoT)

核心思想:让模型自动生成带推理链的示例,再用于 few-shot。

def auto_cot(dataset: list[dict], k: int = 5) -> list[str]:
    """Auto-CoT:从数据集中自动生成带推理的示例"""
    
    # 1. 对每个问题生成推理
    demonstrations = []
    for item in dataset[:k]:
        prompt = f"""{item['question']}

请一步一步思考,给出详细推理过程。"""
        reasoning = llm.generate(prompt)
        demonstrations.append(f"Q: {item['question']}\nA: {reasoning}")
    
    return demonstrations

# 2. 用生成的示例构建最终 prompt
def build_cot_prompt(query: str, demonstrations: list[str]) -> str:
    return f"""请参考以下示例的推理方式回答新问题:

{chr(10).join(demonstrations)}

新问题:{query}

请一步一步思考:"""

五、高级推理技术

5.1 ReAct 模式(Reasoning + Acting)

核心思想:让模型在推理过程中调用外部工具,形成「思考 -> 行动 -> 观察」的循环。

ReAct = Thought(思考) + Action(行动) + Observation(观察)

循环:
┌─────────────┐
│ Thought     │  模型思考:"我需要知道..."
│ (推理)       │
└──────┬──────┘
       ▼
┌─────────────┐
│ Action      │  调用工具(如搜索、计算)
│ (行动)       │
└──────┬──────┘
       ▼
┌─────────────┐
│ Observation │  获取结果,喂回给模型
│ (观察)       │
└──────┬──────┘
       │
       └──────► 继续下一轮循环,直到得出答案
ReAct Prompt 模板
SYSTEM_PROMPT = """你是一个能使用工具的智能助手。

可用工具:
- search(query): 搜索互联网获取信息
- calculate(expression): 计算数学表达式
- get_weather(city): 获取城市天气

请按以下格式推理:

Question: 用户的问题
Thought: 我需要思考下一步该做什么
Action: tool_name(arguments) 或 finished
Observation: 工具返回的结果(或 final answer 的解释)

当问题已经解决时:
Question: [重复问题]
Thought: 我已经知道答案了
Action: finished
Observation: [最终答案]"""

def run_react(question: str, max_steps: int = 10) -> str:
    messages = [{"role": "user", "content": SYSTEM_PROMPT + f"\n\nQuestion: {question}"}]
    
    for _ in range(max_steps):
        response = llm.generate(messages)
        messages.append(response)
        
        # 解析格式
        if "Action: finished" in response:
            # 提取最终答案
            return extract_final_answer(response)
        
        # 执行工具并添加观察结果
        tool_name, args = parse_action(response)
        observation = execute_tool(tool_name, args)
        messages.append({"role": "user", "content": f"Observation: {observation}"})
    
    return "达到最大步数限制"
ReAct vs CoT vs Act
方法 核心 优势 劣势
CoT 推理过程在内部 简单,API 调用少 无法获取外部信息
ReAct 推理 + 工具调用 实时信息 + 可解释 Prompt 复杂
Act 让模型决定工具 灵活 推理链可能混乱

5.2 思维树(Tree of Thoughts, ToT)

核心思想:将问题分解为多步推理路径,像树一样探索,评估每条路径,最终选择最优解。

IO Prompting(一步到位):
输入 -> 输出

CoT(线性推理):
输入 -> 思考1 -> 思考2 -> 思考3 -> 输出

ToT(树状探索):
         输入
      ┌────┼────┐
   思考A  思考B  思考C
   ┌─┴─┐  │   ┌─┴─┐
  延伸A  延伸B  延伸C  延伸D
   │
  最优解

每个节点评估:是否有前途?是否回溯?
ToT 实现框架
from typing import Callable

class TreeOfThoughts:
    def __init__(self, llm, num_candidates: int = 3, max_depth: int = 5):
        self.llm = llm
        self.num_candidates = num_candidates
        self.max_depth = max_depth
    
    def generate_thoughts(self, state: str, prompt: str) -> list[str]:
        """生成多个候选思考"""
        generate_prompt = f"""{prompt}
        
当前状态:{state}

请提出3个不同的思考方向,每个一行:
"""
        response = self.llm.generate(generate_prompt)
        return [line.strip() for line in response.split('\n') if line.strip()]
    
    def evaluate_state(self, state: str) -> float:
        """评估当前状态的质量(0-1)"""
        eval_prompt = f"""评估以下方案的质量,从0到10打分,并说明理由。

方案:{state}

评分(只需输出数字)和理由:"""
        response = self.llm.generate(eval_prompt)
        return extract_score(response)
    
    def solve(self, initial_prompt: str) -> str:
        """ToT 主循环:广度优先搜索"""
        # 初始状态队列
        queue = [(initial_prompt, 0)]  # (状态, 深度)
        
        best_state = initial_prompt
        best_score = 0
        
        while queue:
            current, depth = queue.pop(0)
            
            if depth >= self.max_depth:
                score = self.evaluate_state(current)
                if score > best_score:
                    best_score = score
                    best_state = current
                continue
            
            # 生成多个思考方向
            thoughts = self.generate_thoughts(current, initial_prompt)
            
            for thought in thoughts:
                new_state = current + "\n" + thought
                score = self.evaluate_state(new_state)
                
                # 剪枝:只保留有前途的路径
                if score > 0.5:
                    queue.append((new_state, depth + 1))
                    if score > best_score:
                        best_score = score
                        best_state = new_state
        
        return best_state

# 使用示例
tot = TreeOfThoughts(llm)
solution = tot.solve("如何将一个创业公司从0做到IPO?")
print(solution)
ToT 的适用场景
场景 ToT 效果 说明
复杂规划 极佳 多种方案可选
创意写作 多角度发散
数学证明 探索多条证明路径
代码优化 较好 多版本对比
简单问答 无需 杀鸡焉用牛刀

六、结构化输出

6.1 指定 JSON Schema

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "user", "content": f"""提取以下文本中的关键信息,以 JSON 格式返回:

{text}

JSON 格式:
{{
    "title": "文章标题",
    "author": "作者名",
    "date": "发布日期(YYYY-MM-DD)",
    "key_points": ["要点1", "要点2", "要点3"],
    "sentiment": "positive | neutral | negative"
}}

如果某字段无法提取,设为 null。"""}
    ]
)

6.2 使用 OpenAI Structured Outputs

from pydantic import BaseModel, Field

class UserProfile(BaseModel):
    name: str = Field(description="用户全名")
    age: int = Field(description="用户年龄", ge=0, le=150)
    email: str = Field(description="用户邮箱")
    interests: list[str] = Field(description="用户兴趣标签,最多5个")

# 使用 response_format 强制结构化输出
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": f"从以下文本中提取用户信息:{text}"}],
    response_format=UserProfile  # 模型输出严格遵循 schema
)

profile = UserProfile.model_validate_json(response.choices[0].message.content)
print(profile.name, profile.interests)

6.3 Markdown 表格输出

# 格式要求
"请以 Markdown 表格格式输出,包含以下列:

| 电影名称 | 上映年份 | 导演 | 评分 | 一句话评价 |

数据从以下列表中提取:
{text}"

七、提示词框架

7.1 CRISPE 框架(角色+约束+意图+风格+示例)

CRISPE = Capacity/Role(角色)+ Insight(洞察)+ Statement(陈述)
        + Personality(人格)+ Experiment(实验)

示例:
┌──────────────────────────────────────────────────────────────┐
│ [Role]     你是一名资深产品经理,10年互联网经验               │
│ [Insight]  擅长从用户痛点出发设计产品功能                     │
│ [Statement] 你的任务是评估需求文档的可行性和市场价值          │
│ [Personality] 回复风格严谨专业,带有建设性批评                │
│ [Experiment] 提供2-3个可选方案,每个方案列出优缺点             │
└──────────────────────────────────────────────────────────────┘

7.2 BROKE 框架

BROKE = Background(背景)+ Role(角色)+ Objective(目标)
       + Key Results(关键结果)+ Evolve(演化)

"作为[BROKE]:
Background: [背景描述]
Role: [角色]
Objective: [目标]
Key Results: [期望达成的具体结果]
Evolve: [如何迭代优化]"

7.3 通用的提示词模板库

模板一:专家问答
【角色】你是一名 [职业],[年限] 年经验,专注于 [领域]。

【你的优势】
- [技能1]
- [技能2]
- [技能3]

【回答规则】
1. [规则1]
2. [规则2]
3. [规则3]

【输出格式】
[描述输出格式]

【开始】
用户问题:{user_question}
模板二:内容转换
【输入类型】[描述输入内容]
【输出类型】[描述期望输出]

【转换要求】
1. [要求1]
2. [要求2]
3. [要求3]

【示例】
输入:[示例输入]
输出:[示例输出]

【开始转换】
{content}
模板三:多版本生成
请生成 [数量] 个版本的 [内容类型]:

要求:
1. [要求1]
2. [要求2]
3. [要求3]

版本 1([风格1]):
[内容]

版本 2([风格2]):
[内容]

...

你最推荐哪个版本?为什么?

八、资源推荐

官方文档

来源 内容 链接
OpenAI 官方提示词工程指南(6大策略) https://platform.openai.com/docs/guides/prompt-engineering
Anthropic Claude 提示词最佳实践 https://docs.anthropic.com/claude/docs
Google Gemini API 提示工程 https://ai.google.dev/docs/prompting
DeepSeek 模型提示词指南 https://platform.deepseek.com

学习资源

资源 说明
Prompt Engineering Guide (DAIR.AI) 最全面的提示词工程知识库,涵盖所有主流技术
GitHub: dair-ai/Prompt-Engineering-Guide 开源项目,包含论文、教程、代码示例
斯坦福 CS224N LLM 提示工程课程部分
IBM: Chain of Thought CoT 技术官方解释

进阶阅读

论文 核心贡献
Chain-of-Thought Prompting Elicits Reasoning in Large Language Models (Google, 2022) 提出 CoT 技术
Self-Consistency Improves Chain of Thought Reasoning (Google, 2023) 自我一致性提升推理
ReAct: Synergizing Reasoning and Acting in Language Models (ICLR 2023) 提出 ReAct 范式
Tree of Thoughts: Deliberate Problem Solving with Large Language Models (Princeton, 2023) 提出 ToT 框架
Generated Knowledge Prompting for Commonsense Reasoning 生成知识增强推理
PAL: Program-Aided Language Models 程序辅助语言模型

附录:提示词反推法(学习他人优秀 Prompt)

当遇到优秀的 AI 输出时,可以反推背后的 Prompt:

反推模板:
"以下是一个优秀的 AI 输出,请反推可能使用的提示词。

===== 优秀输出开始 =====
{excellent_output}
===== 优秀输出结束 =====

请分析并重建这个提示词,包含:
1. 角色设定
2. 核心指令
3. 格式要求
4. 约束条件
5. 可能的 few-shot 示例(如果有)"

附录:常见错误及解决方案

错误 原因 解决方案
输出格式不稳定 格式要求不明确 使用 JSON Schema 或更详细的格式说明
模型"幻觉" 缺乏参考资料 提供 RAG 知识或明确要求"不知道就说不知道"
输出过长/过短 没有明确字数限制 “不超过X字”、“至少包含X点”
角色扮演效果差 角色描述不够具体 补充专业背景、回答风格、输出格式
复杂任务失败 任务粒度太大 分解为多个简单步骤
Few-shot 效果差 示例不够多样 确保覆盖主要场景,包括边界情况
工具调用失败 工具描述不清晰 明确参数类型、范围、含义

整理用于学习交流 | 最后更新:2026-03-25
参考来源:OpenAI、Anthropic、DAIR.AI、Google Research、IBM

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐