Prompt Engineering 提示词工程
Prompt Engineering 是设计和优化输入提示(Prompt) ,让大语言模型(LLM)输出更准确、更有用结果的技术。简单说:怎么跟 AI 说话,它才能听得懂、答得好。
一、为什么需要 Prompt Engineering?
LLM 本质上是一个"概率预测器",你给它什么输入,它预测最可能的输出。同样的模型,不同的提示词,结果天差地别:
| 提问方式 | 结果 |
|---|---|
| "帮我写个冒泡排序" | 可能只给代码,也可能给代码+解释,也可能给错 |
| "请用 Java 实现冒泡排序,并添加详细注释,说明时间复杂度和空间复杂度" | 稳定输出高质量答案 |
核心价值:
- 提升回答准确性
- 控制输出格式(JSON、Markdown 等)
- 减少幻觉(Hallucination)
- 实现复杂推理(Chain of Thought)
- 控制"人设"和语气
二、Prompt 的构成要素
一个完整的 Prompt 通常包含以下要素(可根据需要组合):
┌─────────────────────────────────────────┐
│ 1. 角色 (Role) │
│ "你是一位资深 Java 架构师..." │
├─────────────────────────────────────────┤
│ 2. 任务 (Task) │
│ "请设计一个高并发秒杀系统的方案" │
├─────────────────────────────────────────┤
│ 3. 上下文 (Context) │
│ "系统预估 QPS 1万,库存 100件..." │
├─────────────────────────────────────────┤
│ 4. 示例 (Examples) │
│ "例如:..." │
├─────────────────────────────────────────┤
│ 5. 输出格式 (Output Format) │
│ "请以 JSON 格式返回" │
├─────────────────────────────────────────┤
│ 6. 约束 (Constraints) │
│ "回答不超过 500 字" │
└─────────────────────────────────────────┘
三、核心技术与技巧
1. Zero-shot / Few-shot
| 技术 | 说明 | 示例 |
|---|---|---|
| Zero-shot | 不给示例,直接提问 | "将这句话翻译成英文:你好" |
| Few-shot | 给几个示例,让模型学会模式 | 给 2-3 个翻译示例,再要求翻译新句子 |
Few-shot 示例:
将以下中文翻译成英文:
中文:苹果 → 英文:apple
中文:汽车 → 英文:car
中文:电脑 → 英文:computer
中文:人工智能 → 英文:
2. Chain of Thought (CoT) 思维链
让模型一步一步思考,显著提升复杂推理问题的准确率。
| 方式 | 提问 | 效果 |
|---|---|---|
| 直接问 | "小明有 5 个苹果,给了小红 2 个,又买了 3 个,现在有几个?" | 可能答对,但复杂题容易错 |
| CoT | "请一步步思考:1. 初始有 5 个;2. 给了小红 2 个,剩下 3 个;3. 买了 3 个,现在有 6 个。所以答案是 6 个" | 推理清晰,准确率高 |
高级变体:
- Self-Consistency:让模型多次推理,取多数答案
- Tree of Thoughts (ToT):探索多条推理路径,分支回溯
- Graph of Thoughts (GoT):更复杂的推理图结构
3. 角色扮演
给模型设定"人设",影响输出风格和专业度。
你是一位资深后端架构师,有 10 年高并发系统经验。
请从架构角度评价以下设计方案,指出潜在风险...
4. 结构化输出
强制模型以特定格式返回,便于程序解析:
请以 JSON 格式返回以下信息:
{
"summary": "摘要内容",
"keywords": ["关键词1", "关键词2"],
"sentiment": "positive/negative/neutral"
}
5. 思维链的进阶
问题:一个水池,进水管 3 小时注满,出水管 5 小时排空。
如果同时打开,几小时能注满?
请一步步推理:
1. 进水管每小时注水 1/3 池
2. 出水管每小时排水 1/5 池
3. 净进水速度 = 1/3 - 1/5 = 2/15 池/小时
4. 注满需要 1 ÷ (2/15) = 7.5 小时
四、不同场景的 Prompt 模板
代码生成
你是一位资深 Java 开发工程师。
请用 Java 实现一个 LRU 缓存,要求:
1. 使用泛型支持任意类型
2. 线程安全
3. 添加详细注释
4. 包含单元测试示例
文本总结
请总结以下文章的核心观点,要求:
- 不超过 200 字
- 分 3 个要点列出
- 保持客观,不添加评论
文章内容:...
数据分析
你是一位数据分析师。
根据以下销售数据,请分析:
1. 季度趋势
2. 异常波动点
3. 给出 3 条业务建议
数据:...
角色设定
从现在开始,你是一位专业的面试官,正在面试 Java 后端开发岗位。
请依次提问技术问题,并根据我的回答给出评价。
第一题:
五、常见问题与优化
| 问题 | 表现 | 优化方法 |
|---|---|---|
| 回答太啰嗦 | 给出大量无关信息 | 加约束:"回答控制在 200 字以内" |
| 答案太简略 | 只说结论,没过程 | 加指令:"请给出推理过程" |
| 格式混乱 | 无结构,难以解析 | 指定输出格式:"以 Markdown 表格返回" |
| 幻觉 | 编造不存在的事实 | 加约束:"如果不确定,请说'不确定'" + 提供上下文 |
| 偏离主题 | 跑题,答非所问 | 加角色限定 + 明确任务边界 |
| 语言不一致 | 中英混杂 | 指定语言:"请用中文回答" |
六、Prompt 调试方法
- 迭代优化:不要期望一次完美,反复调整
- 对比实验:同一问题用不同 Prompt 对比效果
- 拆解复杂任务:把大问题拆成小步骤,分步提问
- 增加示例:Few-shot 往往比 Zero-shot 更稳定
- 温度参数调整 :
- 低温度(0-0.3):输出确定性高,适合代码、事实问答
- 高温度(0.7-1):输出更有创造性,适合写作、头脑风暴
七、从 Prompt 到 Agent
Prompt Engineering 的进阶是让 AI 能自主使用工具:
你可以使用以下工具:
1. search(query): 搜索最新信息
2. calculator(expression): 计算数学表达式
3. code_execute(code): 执行代码
用户问题:今天北京和上海的气温差是多少?
请调用工具回答。
这样 AI 会:search("北京天气") → search("上海天气") → calculator(气温差) → 输出答案。
八、总结
| 核心要点 | 说明 |
|---|---|
| 本质 | 与 AI 高效沟通的技术 |
| 目标 | 提升回答准确性、控制输出格式、减少幻觉 |
| 基础技巧 | Few-shot、Chain of Thought、角色扮演、结构化输出 |
| 进阶方向 | Agent、工具调用、多轮对话、自我一致性 |
| 调试方法 | 迭代优化、对比实验、拆解任务、调整温度 |
| 价值 | 决定 LLM 应用的上限,是 AI 应用开发的核心能力 |
一句话:Prompt Engineering 就是"用 AI 听得懂的方式,问出它能答好的问题"。
提示词网址:
https://github.com/anthropics/prompt-eng-interactive-tutorial