什么是 Prompt Engineering
Prompt Engineering(提示词工程)是通过设计和优化输入文本,引导大语言模型生成期望输出的技术。它是当前使用 LLM 时最直接、成本最低的优化手段。
基本原则
1. 清晰明确
模型对模糊指令的理解往往不可靠。用具体、可衡量的语言描述需求。
❌ 写一篇关于 AI 的文章
✅ 写一篇 800 字的中文科普文章,面向高中生,解释 Transformer 的自注意力机制,
要求包含一个类比和一张 ASCII 示意图
2. 分步指示
复杂的任务拆解成多个步骤,模型在每一步都能看到中间结果,减少出错概率。
第一步:分析用户问题的实体和关系
第二步:检索相关知识库
第三步:基于检索结果生成回答
第四步:检查回答中是否存在事实错误
3. 提供示例
用输入输出对来定义格式和风格预期。这在结构化输出任务中尤其重要。
4. 指定角色和约束
给模型一个”角色”能显著改变输出风格和内容选择。
你是一个资深 Python 技术面试官。你的任务是出题考察候选人对
异步编程的理解。每次只出一个问题,用中文提问,难度为中级。
高级技巧
Few-shot Prompting
在提示词中提供少量示例,让模型通过模式匹配理解任务。
# 结构化输出示例
examples = [
{"input": "苹果发布了新款 MacBook Pro", "output": '{"entity": "MacBook Pro", "org": "Apple", "type": "product_release"}'},
{"input": "特斯拉股价下跌 5%", "output": '{"entity": "Tesla", "org": "Tesla Inc.", "type": "stock_movement"}'},
]
def build_few_shot_prompt(examples, query):
prompt = "从文本中提取结构化信息:\n\n"
for ex in examples:
prompt += f"输入:{ex['input']}\n输出:{ex['output']}\n\n"
prompt += f"输入:{query}\n输出:"
return prompt
Chain-of-Thought (CoT)
引导模型在给出最终答案前展示推理步骤。CoT 在数学、逻辑推理任务上有显著提升。
问题:一个长方形长 12 米,宽是长的 1/3,求面积。
让我们逐步推理:
1. 宽 = 12 × 1/3 = 4 米
2. 面积 = 长 × 宽 = 12 × 4 = 48 平方米
答案:48 平方米
Tree-of-Thought (ToT)
ToT 让模型在多个推理分支上同时探索,评估各分支的可行性后选择最优路径。在需要规划或搜索的任务中,ToT 比 CoT 更有效。
问题:用 4 升和 9 升的水壶量出 6 升水。
探索方案 A:
- 装满 9L,倒入 4L(剩 5L)
- 倒空 4L,再倒入(剩 1L)
- ... 继续
探索方案 B:
- 装满 4L,倒入 9L(4/9)
- 再装满 4L,倒入(8/9)
- ... 继续
评估:方案 A 只需 4 步,方案 B 需 7 步,选择方案 A。
ReAct (Reasoning + Acting)
将推理和行动交替进行,适合需要调用外部工具的 Agent 场景。
# ReAct 循环伪代码
def react_loop(question, tools):
thought = analyze(question)
action = decide_action(thought, tools)
observation = call_tool(action)
if goal_achieved(observation):
return final_answer(observation)
else:
return react_loop(f"{question}\n新信息:{observation}", tools)
系统提示词设计
系统提示词定义模型的全局行为。一个好的系统提示词包含:
- 角色定义:你是谁,你能做什么
- 行为边界:什么能做,什么不能做
- 输出格式:偏好结构还是自由文本
- 安全约束:如何处理敏感内容
你是一个专业的学术写作助手。
- 只基于事实信息回答,不确定时明确说不知道
- 保持中立客观的语气
- 支持 Markdown 格式输出
- 拒绝回答涉及违法的请求
- 每次回复控制在 500 字以内
常见陷阱
- 过度约束:过多的规则会让模型”想太多”,反而降低效果
- 位置偏差:模型对提示词开头和结尾的内容更敏感,重要的信息放在这两处
- 否定指令:“不要提到 X” 有时会产生反效果,不如正面引导
- 模板固化:提示词模板需要定期测试,模型版本更新后行为可能会变