Prompt Engineering 进阶:结构化提示与少样本学习
同样的 LLM,用不同的提示词,输出质量可能天差地别。**Prompt Engineering(提示工程)**不是"怎么问问题"的技巧,而是"如何精确传达意图"的系统方法。
为什么需要结构化提示
大多数人与 LLM 交互的方式是这样的:
"帮我写个 Python 爬虫"
结果往往不尽人意——代码没有错误处理、没有反爬策略、输出格式混乱。问题的根源在于:意图太模糊,LLM 只能"猜"你想要什么。
结构化提示通过固定模板,把模糊需求转化为精确指令。
CRISPE 框架:五维提示结构
一个高质量的提示应该包含五个维度:
Context(上下文)→ Role(角色)→ Intent(意图)→ Specifics(细节)→ Examples(示例)
实战对比
普通提示:
分析这段代码的性能问题
结构化提示:
【Context】你是一名有 10 年经验的 Python 性能优化专家。
【Role】请以技术顾问的身份给出建议。
【Intent】找出以下代码中的性能瓶颈,并给出优化方案。
【Specifics】
- 关注时间复杂度与内存占用
- 给出优化前后的对比数据
- 说明使用的 Python 版本为 3.11
【Examples】
优化前:O(n²) 的嵌套循环
优化后:使用 dict 将复杂度降为 O(n)
【代码】
def find_duplicates(items):
result = []
for i in range(len(items)):
for j in range(i+1, len(items)):
if items[i] == items[j] and items[i] not in result:
result.append(items[i])
return result
后者的输出质量通常显著高于前者。
少样本学习(Few-Shot Learning)
LLM 擅长"照猫画虎"。给出输入-输出的示例对,它就能快速掌握你想要的格式和风格。
格式规范示例
请按以下格式总结技术文章:
输入:《Redis 缓存穿透、击穿与雪崩》
输出:
- 核心问题:缓存失效导致请求直达数据库
- 解决方案:布隆过滤器 + 互斥锁 + 随机 TTL
- 适用场景:高并发读缓存系统
输入:《MySQL 索引优化》
输出:
- 核心问题:查询未命中索引导致全表扫描
- 解决方案:覆盖索引、最左前缀原则、EXPLAIN 分析
- 适用场景:大数据量 OLTP 系统
输入:{用户输入的文章标题}
输出:
通常 2-3 个示例就能让 LLM 稳定输出期望格式。
链式思考(Chain-of-Thought)
对于复杂推理任务,让 LLM "说出思考过程"能显著提升准确率。
直接提问:
一个农场有鸡和兔共 35 只,脚共 94 只,问鸡兔各多少?
LLM 可能直接给答案,也可能算错。
CoT 提示:
请逐步思考:设鸡有 x 只,兔有 y 只。根据题意列出方程组,然后求解。
LLM 会输出完整的推导过程,错误率大幅降低。
进阶技巧:Zero-Shot CoT
在提示末尾加一句"Let's think step by step",即使不给示例,也能触发链式思考。
自我一致性(Self-Consistency)
对于需要高可靠性的任务,可以让 LLM 多次采样并投票:
请独立回答以下问题 3 次,然后选择出现次数最多的答案作为最终结果。
问题:...
这种方法虽然增加了 Token 消耗,但能有效降低"幻觉"概率。
提示优化清单
在提交提示前,对照以下清单检查:
- 是否明确了角色和专业背景?
- 输出格式是否通过示例定义?
- 约束条件(长度、风格、禁用词)是否列出?
- 是否提供了足够的上下文?
- 复杂任务是否要求分步思考?
- 是否说明了目标受众(技术小白 / 资深工程师)?
写在最后
Prompt Engineering 的本质是沟通能力的延伸。它不需要高深的算法知识,但需要对 LLM 的能力边界有清晰认知——知道它擅长什么、容易在哪里出错、如何通过提示规避弱点。
下一篇,我们将进入实战环节:使用 Claude API 构建生产级应用。