Prompt工程与优化
一、基础概念
Q1: 什么是Prompt?为什么Prompt对LLM这么重要?
Prompt是给LLM的输入指令/上下文,决定了模型的输出方向和质量。由于LLM是基于统计规律的生成模型,它的行为完全由Prompt驱动——没有良好设计的Prompt,即使是最强的GPT-4也可能产出不满意的结果。
类比:
- Prompt就像是给人的"指令"
- 同样的问题,不同的问法得到的答案质量差异很大
- 对LLM来说,"好问题"比"大模型"更重要
Prompt的组成部分:
┌──────────────────────────────────────────────────────┐
│ Prompt结构 │
├──────────────────────────────────────────────────────┤
│ 1. 🎭 角色设定 (Role/Persona) │
│ "你是一个资深的前端架构师..." │
│ │
│ 2. 📋 任务描述 (Task) │
│ "请帮我优化以下React组件的性能..." │
│ │
│ 3. 📚 上下文 (Context) │
│ "这是一个电商网站的商品列表组件,日访问量10万..." │
│ │
│ 4. 📝 示例 (Examples/Few-shot) │
│ "输入:XXX → 输出:YYY" │
│ │
│ 5. 🎯 输出格式 (Format) │
│ "请输出JSON格式:{'suggestion': ...}" │
│ │
│ 6. ⚙️ 约束条件 (Constraints) │
│ "回答不超过200字,用中文" │
└──────────────────────────────────────────────────────┘Q2: Prompt的核心设计原则
| 原则 | 说明 | 示例 |
|---|---|---|
| 明确具体 | 避免模糊描述,给出详细要求 | ❌"优化代码" → ✅"指出3个具体性能问题并给出优化后代码" |
| 结构化 | 使用分隔符、列表、标签组织内容 | <question>...</question><context>...</context> |
| 提供示例 | Few-shot比Zero-shot效果更好 | 给2-3个输入输出示例 |
| 分步思考 | 让模型展示推理过程(CoT) | "请先分析问题,再给出方案,最后总结" |
| 指定角色 | 让模型扮演特定专家 | "你是一位有10年经验的技术面试官" |
| 设定边界 | 防止模型越权或产生不合适内容 | "如果问题超出范围,请明确说明" |
Q3: Zero-shot、One-shot、Few-shot的区别
Zero-shot Learning(零样本):
Prompt: "请将以下中文翻译成英文:我爱人工智能"
特点:直接给任务,无示例
适用:简单任务,模型能力强
One-shot Learning(单样本):
Prompt: "翻译:
中文:你好 → English: hello
中文:我爱人工智能 → English: "
特点:给1个示例
适用:有明确输入输出格式的任务
Few-shot Learning(少样本):
Prompt: "文本情感分类:
这部电影很棒 → 正面
体验太差了 → 负面
质量还可以 → 中性
服务态度不错 → "
特点:给2-5个示例
适用:分类、提取、格式转换等任务经验法则:
- 简单任务用Zero-shot
- 需要特定格式/风格用Few-shot
- 复杂推理任务用CoT(给推理示例)
二、Prompt进阶技巧
Q4: CoT(Chain of Thought,思维链)为什么有效?
CoT通过显式的推理步骤引导模型逐步思考,让模型有"思考时间",从而提升复杂问题的解决能力。
标准Prompt vs CoT Prompt:
❌ 标准Prompt(直接问答案):
问题:小明有23个苹果,吃了5个,又买了12个橘子,
然后把苹果平分给3个人,每人有几个水果?
(模型直接输出答案,容易算错)
✅ CoT Prompt(要求分步推理):
问题:小明有23个苹果,吃了5个,又买了12个橘子,
然后把苹果平分给3个人,每人有几个水果?
请一步步思考:
1. 首先确定苹果数量:23 - 5 = 18个苹果
2. 橘子不参与平分(只平分苹果)
3. 18个苹果 ÷ 3人 = 每人6个苹果
4. 所以每人有6个水果
答案:6CoT适用场景:
- ⭐ 数学推理(应用题、计算)
- ⭐ 多步决策(需要逻辑链条)
- ⭐ 符号推理(字符串操作、代码分析)
- ⭐ 复杂判断(多条件约束问题)
Q5: ReAct(Reasoning + Acting)模式
ReAct将推理(Reasoning)和行动(Acting)结合,让模型在推理后可以调用工具获取外部信息。
示例:用户问"2024年全球GDP排名前十的国家是哪些?"
ReAct过程:
思考(Thought):用户问的是2024年GDP排名,这是需要
最新数据的任务,模型训练数据可能不包含
2024年的信息,我需要调用搜索工具。
行动(Action):Search["2024 GDP ranking top 10 countries"]
观察(Observation):搜索返回2024年GDP排名数据:
1. 美国 - $28.7万亿
2. 中国 - $18.5万亿
...
思考(Thought):现在我有了最新数据,可以组织答案。
答案(Answer):根据2024年最新数据,GDP排名前十的国家是...**ReAct是Agent的核心模式:**推理→行动→观察→循环,直到得到答案。
Q6: 提示词优化的系统性方法
方法1:角色扮演 + 结构化输出
你是一个资深的Python代码审查专家。请审查以下代码,
要求输出JSON格式:
{
"bug_count": "<发现的bug数量>",
"issues": [
{
"type": "<问题类型:bug/性能/风格>",
"line": "<行号>",
"description": "<问题描述>",
"fix_suggestion": "<修复建议>"
}
],
"overall_score": "<1-10分>"
}
代码:
[这里放代码]方法2:分步思考 + 自我审查
请分析这个系统设计方案:
步骤1:先理解需求要点(用3句话总结)
步骤2:分析架构的核心挑战(列出3个关键问题)
步骤3:提出改进建议(每个建议说明理由)
步骤4:自我审查(检查是否有遗漏,如有补充)
方案描述:
[需求描述]方法3:对比式输出
对比 A方案 和 B方案 的优劣:
要求:
- 至少从5个维度对比
- 每个维度给出评分(1-5)
- 最后给出推荐和适用场景
A方案描述:...
B方案描述:...Q7: 如何让模型输出格式稳定(JSON/XML)?
技巧1:提供完整JSON Schema示例
请严格按以下JSON格式输出,不要添加任何解释文字:
{
"name": "string",
"age": number,
"skills": ["string", "string"],
"is_active": boolean
}
输入:[用户描述]技巧2:使用特殊标记分隔
# 角色
你是数据分析师
# 任务
分析以下数据并输出报告
# 数据
[数据内容]
# 输出要求(严格遵守)
- 只输出Markdown格式
- 包含:概述、关键发现、建议三部分
- 每部分不超过100字
# 开始输出技巧3:末尾引导
...(你的Prompt)
现在,请输出JSON:
{技巧4:使用Function Calling(推荐)
如果使用OpenAI等支持Function Calling的API,直接定义函数参数的JSON Schema,由API保证格式输出。
三、常见任务的Prompt模板
Q8: 文本摘要(Summarization)
# 角色
你是专业的内容编辑
# 任务
将以下长文本摘要为100字以内的要点
# 要求
- 保留核心信息:时间、地点、关键事件
- 语言简洁,不用修饰词
- 按重要性排序输出要点
# 原文
[长文本内容]
# 摘要输出:Q9: 代码助手(Code Assistant)
# 角色
你是一个全栈开发工程师,精通Python和JavaScript
# 任务
审查并优化以下代码
# 检查清单
1. 语法错误
2. 性能问题(循环、IO、算法复杂度)
3. 安全漏洞(SQL注入、XSS、敏感信息)
4. 代码风格(命名、注释、结构)
5. 边界条件处理
# 代码
[代码片段]
# 输出格式
问题:[问题描述]
位置:[行号/函数名]
修复代码:[修复后的代码]Q10: 数据提取(Information Extraction)
从以下文本中提取信息,输出JSON:
{
"people": [{"name": "", "title": ""}],
"organizations": [{"name": "", "type": ""}],
"dates": [{"event": "", "date": ""}],
"key_points": ["", ""]
}
文本:
阿里巴巴集团于2024年3月15日宣布,集团CEO张勇将...Q11: 推理/分析任务
请分析以下问题,按步骤回答:
步骤1:理解问题核心(1句话总结)
步骤2:列出相关的关键因素
步骤3:分析每个因素的影响(正向/负向)
步骤4:给出最终结论
问题:
[复杂问题描述]Q12: 翻译任务(中↔英)
# 角色
你是专业的中英文翻译
# 要求
- 保持原文的语气和风格
- 专业术语准确(如技术术语用行业标准)
- 长句子适当拆分,但不改变原意
# 输入
[待翻译文本]
# 翻译输出:四、Prompt失败案例与修复
Q13: 常见Prompt错误及修复
| ❌ 错误示例 | 问题 | ✅ 修复方案 |
|---|---|---|
| "写一篇好文章" | 太模糊,不知道写什么主题、多少字、什么风格 | "用新闻报道风格写一篇关于AI医疗应用的300字文章,包含:1个真实案例、2个技术突破、3个未来展望" |
| "优化代码" | 没有说明优化方向和输出格式 | "从性能、可读性、安全性三个维度优化以下Python代码,输出:1.问题分析 2.优化代码 3.优化前后对比" |
| "给我讲Transformer" | 不知道深度和重点 | "用200字向非技术人员解释Transformer核心原理,用日常生活类比" |
| "总结这篇文章" | 没有说明摘要长度、要点数量 | "总结以下文章,输出:1个核心观点 + 3个支持论据 + 2个实际应用,总字数不超过150字" |
Q14: 模型产生幻觉(Hallucination)怎么办?
策略1:提供权威上下文(RAG模式)
根据以下参考资料回答问题,如果资料中没有答案,
请明确说明"参考资料中未包含该信息"。
参考资料:
[维基百科/官方文档等内容]
问题:
[用户问题]策略2:要求引用来源
回答时请标注每个关键信息的来源编号,如[1][2]。
参考资料:
[1] 文档A第3段
[2] 文档B第5段策略3:加入置信度评估
回答后请附带置信度评分(0-100%),
并说明不确定的部分。策略4:"不知道"安全出口
如果你不确定答案,请直接输出"暂无明确信息",不要编造。Q15: Prompt过长时怎么办?
策略1:摘要关键信息
- 将长文档先让模型做100字摘要,再用摘要做推理
策略2:分块处理
- 超长文档分成多个chunk分别处理,最后汇总结果
策略3:使用支持长上下文的模型
- GPT-4 Turbo: 128K
- Claude: 200K
- Kimi: 200K
策略4:只保留核心信息
- 分析原Prompt,删除重复、冗余信息
- 合并同类信息,使用结构化格式
五、Prompt工程最佳实践
Q16: Prompt工程的系统方法论
┌──────────────────────────────────────────────────────┐
│ Prompt开发迭代流程 │
│ │
│ Step 1: 定义问题 │
│ └─ 明确输入是什么?期望输出是什么? │
│ │
│ Step 2: 草拟初版Prompt │
│ └─ 按"角色+任务+上下文+输出格式"组织 │
│ │
│ Step 3: 测试10+个典型案例 │
│ └─ 简单/复杂/边界情况各测试至少3个 │
│ │
│ Step 4: 收集失败案例,分析原因 │
│ └─ 格式错误?内容错误?遗漏信息? │
│ │
│ Step 5: 迭代优化Prompt │
│ └─ 补充约束/增加示例/调整指令顺序 │
│ │
│ Step 6: 固化为模板,监控生产表现 │
│ └─ 记录Prompt版本,收集用户反馈 │
│ │
└──────────────────────────────────────────────────────┘Q17: 测试Prompt的评估维度
| 评估维度 | 检查方法 | 指标/示例 |
|---|---|---|
| 正确性 | 人工抽查关键案例 | 错误率 < 5% |
| 完整性 | 是否包含所有期望信息 | 要点覆盖率 > 95% |
| 格式稳定性 | 10次测试是否保持一致格式 | JSON可解析率 100% |
| 鲁棒性 | 对输入变化的敏感度 | 轻微变化不应影响输出质量 |
| 性能 | 平均响应时间 | Token消耗/延迟 |
| 安全性 | 是否会泄露敏感信息、产生不当内容 | 违规率 < 1% |
Q18: Prompt版本管理
实际项目中Prompt是需要版本管理的"代码":
/prompts
/summarization
v1.0_basic.md
v1.1_added_constraints.md
v2.0_cot_prompt.md ← 当前生产版本
/prompt_tests
test_cases_summarization.json
expected_outputs.json
每次修改Prompt:
1. 创建新版本文件,保留历史
2. 更新测试用例
3. 在测试集上评估,指标下降不允许上线
4. 记录变更日志六、实战技巧速查
Prompt工具箱
| 场景 | 推荐技巧 | 模板关键词 |
|---|---|---|
| 代码生成 | Few-shot + 角色设定 | "你是一个XX语言的专家..." |
| 文本摘要 | 角色+格式约束 | "按以下要点输出摘要..." |
| 数据提取 | JSON Schema + 示例 | "输出格式严格为:{...}" |
| 复杂推理 | CoT思维链 | "请一步步推理..." |
| Agent工具 | ReAct模式 | "思考:... 行动:... 观察:..." |
| 风格迁移 | 示例+约束 | "参考以下风格重写..." |
| 创意生成 | 角色+多方案 | "请提供3种不同方案..." |
| 翻译 | 角色+专业领域 | "你是XX领域的翻译..." |
常见约束词速查
| 约束类型 | 示例用词 |
|---|---|
| 长度约束 | "不超过X字/词/句"、"控制在X-Y字" |
| 格式约束 | "输出JSON"、"Markdown格式"、"用列表" |
| 风格约束 | "正式/口语化/技术风格"、"新闻报道风格" |
| 受众约束 | "面向初学者"、"给资深工程师看" |
| 内容约束 | "不要输出代码"、"只输出数据"、"不要解释" |
| 角色约束 | "你是一个XX"、"以XX的口吻" |