提示词工程完全指南
提示词工程完全指南
Prompt Engineering Complete Guide
来源参考:OpenAI 官方指南、DAIR.AI Prompt Engineering Guide、IBM、Google Research、斯坦福 CS224N
整理用于学习交流
目录
一、什么是提示词工程
提示词工程(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 |
| 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
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)