提示工程(Prompt Engineering)¶
提示工程是不修改模型参数的前提下,通过精心设计输入提示(Prompt),引导 LLM 输出高质量回答的技术。它是当前使用 LLM 最直接、最高效的方式。
为什么 Prompt 如此重要?¶
同一个模型,不同的 Prompt 可能带来天壤之别的效果:
Prompt 质量对比
差的 Prompt: "写一首诗"
→ 模型可能输出一首平庸的诗
好的 Prompt: "请以李白的风格,写一首关于月亮和思乡之情的五言绝句,要求意境深远、用词古朴"
→ 模型更可能输出高质量的诗作
Prompt Engineering 的本质是:用语言精确地传达你的意图、约束和期望,让模型准确理解你想要什么。
基础技巧¶
1. 角色设定(System Prompt)¶
给模型设定一个角色/身份,影响其回答的风格和专业度。
2. 明确任务和格式¶
不要让模型猜你想要什么格式——直接说明。
3. 提供上下文¶
模型不知道你的具体场景,你需要提供足够的背景信息。
4. 分隔符¶
用明确的分隔符区分指令和内容,避免歧义。
核心策略¶
Few-shot Learning(少样本学习)¶
在 Prompt 中给出几个示例,让模型理解你期望的输入-输出模式。
| 策略 | 示例数量 | 适用场景 |
|---|---|---|
| Zero-shot | 0 个 | 任务简单明确 |
| One-shot | 1 个 | 需要明确格式 |
| Few-shot | 2~5 个 | 任务复杂或格式特殊 |
Few-shot 示例
模型会根据前面的示例,理解任务的模式并输出"正面"。
Few-shot 的选择技巧
- 示例应该覆盖多样性:包含不同类型的输入/输出
- 示例的质量要高:错误的示例会误导模型
- 示例与目标问题具有相关性:越相似效果越好
Chain-of-Thought(思维链推理) ⭐¶
CoT 是提示工程中最具突破性的技术——让模型逐步推理而非直接给出答案,显著提升了 LLM 在数学、逻辑、编程等推理任务上的表现。
有无 CoT 的对比
无 CoT:
有 CoT:
CoT 的实现方式:
方式一:Zero-shot CoT(最简单)
只需在问题末尾加一句话:
这句话就像一把"钥匙",能激活模型的推理能力。
方式二:Few-shot CoT
在示例中展示推理步骤,模型会模仿这种推理模式:
问:Roger 有 5 个网球,他又买了 2 罐网球,每罐有 3 个。他现在有多少个网球?
答:Roger 初始有 5 个球。2 罐 × 3 个/罐 = 6 个球。5 + 6 = 11。答案是 11。
问:食堂有 23 个苹果,用了 20 个做午餐,又买了 6 个。现在有多少个苹果?
答:
Self-Consistency(自一致性)¶
核心思想:多次推理,投票选最佳。
- 用 CoT 让模型对同一个问题推理 多次(比如 5 次),每次用不同的推理路径
- 对所有最终答案进行多数投票,选出出现次数最多的答案
这种方法牺牲了推理速度,但显著提升了准确率。
Tree-of-Thought(思维树)¶
CoT 是线性推理(一条路走到底),而 ToT 将推理过程变成一棵树:
- 在每个推理步,生成多个可能的思路(分支)
- 对每个分支评估其前景(自评或投票)
- 选择最有前景的分支继续深入,剪掉差的分支
- 支持回溯——走到死胡同可以退回来尝试其他路径
graph TD
A["问题"] --> B1["思路 A"]
A --> B2["思路 B"]
A --> B3["思路 C ✗"]
B1 --> C1["A-1"]
B1 --> C2["A-2 ✗"]
B2 --> C3["B-1"]
C1 --> D1["最终答案 ✓"]
适用于需要探索和回溯的复杂问题,如创意写作、数学证明、策略规划。
ReAct(Reasoning + Acting)¶
ReAct 让 LLM 交替进行思考和行动,将推理与外部工具调用结合起来。
问题:2024 年奥斯卡最佳影片的导演出生在哪个城市?
思考:我需要先查2024年奥斯卡最佳影片是什么。
行动:搜索("2024 奥斯卡最佳影片")
观察:2024年奥斯卡最佳影片是《奥本海默》,导演是克里斯托弗·诺兰。
思考:现在我需要查克里斯托弗·诺兰的出生地。
行动:搜索("克里斯托弗·诺兰 出生地")
观察:克里斯托弗·诺兰出生于英国伦敦。
思考:我现在有了完整的答案。
最终答案:克里斯托弗·诺兰出生于英国伦敦。
ReAct 是 Agent(智能体) 框架的核心推理模式,让 LLM 能够调用搜索引擎、计算器、代码执行器等外部工具。
高级技巧¶
输出约束¶
明确要求输出格式,便于程序解析:
请将以下文章的关键信息提取为 JSON 格式:
{
"title": "文章标题",
"summary": "一句话摘要",
"keywords": ["关键词1", "关键词2"],
"sentiment": "positive/negative/neutral"
}
负面指令¶
告诉模型不要做什么,有时比正面指令更有效:
拆解复杂任务¶
将复杂任务分解为多个简单步骤,逐步完成:
我需要你帮我完成一篇技术博客的写作。请按以下步骤进行:
第 1 步:根据主题"Transformer 注意力机制"列出文章大纲(5~7 个小节)
第 2 步:等我确认大纲后,逐节展开写作
第 3 步:最后添加一段总结和参考文献
Prompt 模板参考¶
通用问答模板¶
代码审查模板¶
请审查以下代码,从这几个维度评估:
1. 正确性:逻辑是否正确?
2. 性能:有无性能瓶颈?
3. 安全性:有无安全漏洞?
4. 可读性:命名和结构是否清晰?
对每个问题给出:[问题描述] → [修复建议] → [修改后的代码]
代码如下:
[粘贴代码]
常见误区¶
| 误区 | 正确做法 |
|---|---|
| Prompt 写得越长越好 | 精练清晰更重要,去除冗余信息 |
| 一次让模型做所有事 | 复杂任务拆分为多步 |
| 认为 Prompt 对所有模型通用 | 不同模型对 Prompt 的响应不同,需要调试 |
| 不给示例直接问复杂问题 | 对复杂/格式敏感的任务,Few-shot 显著更好 |
| 忽略温度参数(Temperature) | 事实性问题用低温(00.3),创意任务用高温(0.71.0) |