Prompt Engineering 进阶:从"提问"到"工程"

同样一个问题,好的 Prompt 和差的 Prompt 输出质量差距可以达到 10 倍以上。Prompt 不是"问问而已",而是一门工程学科。

一、为什么 Prompt 重要

LLM 本质是概率预测:给定上文,预测下一个最可能的 token。

  • 模糊的 Prompt = 模糊的上下文 = 模糊的输出
  • 结构化的 Prompt = 清晰的指令 = 稳定高质量的输出

二、Prompt 的五大原则

2.1 明确具体

❌ "写一篇文章" ✅ "写一篇 800 字的技术博客,主题是 Kubernetes 入门,面向后端开发者,包含 3 个代码示例,语气友好"

2.2 结构化组织

# 角色
你是 {role}

# 任务
{task}

# 要求
- 要求 1
- 要求 2

# 输出格式
按以下格式:
1. ...
2. ...

# 示例(可选)
输入:xxx
输出:xxx

2.3 提供上下文

你不知道的事情:用户的产品是 XX SaaS 平台,主要客户是中小企业。

2.4 给出示例(Few-shot)

将以下句子翻译为英文:
示例:
输入:你好
输出:Hello

输入:今天天气真好
输出:

现在请翻译:机器学习很有趣

2.5 指定输出格式

请以 JSON 格式输出:
{
  "category": "...",
  "tags": ["...", "..."],
  "summary": "..."
}

三、核心技巧

3.1 角色扮演

你是一位有 20 年经验的资深 PHP 工程师,擅长性能优化。
请帮我分析以下代码的性能瓶颈:
...

效果:AI 会调用相关"领域知识",输出更专业。

3.2 思维链(Chain of Thought)

请一步步思考:
1. 先分析问题
2. 再列出每种方案的优缺点
3. 最后给出推荐

问题:如何设计一个高并发的评论系统?

效果:AI 不会跳过推理步骤,复杂问题正确率提升 30-50%。

3.3 少样本提示(Few-shot)

把评论分类为:好评/差评/中性

示例:
评论:这个东西真棒 → 好评
评论:太差了 → 差评
评论:还行吧 → 中性

现在分类:发货速度挺快 → 

3.4 ReAct 模式

让 AI 推理 + 行动:
回答问题时,请按以下格式:

思考:你的推理过程
行动:使用什么工具(如果有)
观察:工具返回的结果
...

最终答案:xxx

这是 LangChain Agent 的核心思想。

3.5 自我批评

回答后,请审视你的回答:
1. 是否完整回答了用户问题?
2. 是否有错误?
3. 是否有更优的方案?

如果有,请修正。

四、常用模板

4.1 内容创作

你是 {角色}。

主题:{主题}
读者:{目标读者}
长度:{字数}
风格:{风格}
要求:
- 论点 1
- 论点 2
- 必须包含一个案例

请撰写。

4.2 代码生成

你是 {语言} 专家。

任务:{任务}
输入:{输入数据}
输出格式:完整的、可运行的代码,包含注释
约束:
- 使用 {框架}
- 性能优化
- 错误处理

4.3 数据提取

从以下文本中提取 {字段}。

文本:{文本}

输出 JSON:
{
  "field1": "value",
  "field2": ["v1", "v2"]
}

4.4 翻译

将以下文本翻译为 {目标语言}。
要求:
- 保留原文格式(Markdown、代码等)
- 专业术语用 {领域} 习惯译法
- 语气:{正式/随意}

文本:{text}

五、高级技术

5.1 Meta-Prompting

让 AI 帮你写 Prompt:
我想要一个 Prompt,用于 {场景},要求:
1. 输入是 xxx
2. 输出是 xxx
3. 风格要 xxx

请帮我设计这个 Prompt,并解释为什么这样设计。

5.2 Prompt 链

复杂任务拆成多步:
def pipeline(input):
    # 步骤 1: 提取关键信息
    keywords = llm(f"从以下文本提取关键词:{input}")
    
    # 步骤 2: 基于关键词生成大纲
    outline = llm(f"基于关键词 {keywords},生成大纲")
    
    # 步骤 3: 基于大纲写文章
    article = llm(f"基于大纲 {outline},写一篇 1000 字文章")

    return article

每步用更小、专门的 Prompt,比一个大 Prompt 效果更好。

5.3 自一致性(Self-Consistency)

同一个问题问多次,取多数答案:
answers = [llm(prompt) for _ in range(5)]
final = most_common(answers)

适合需要确定性的场景(数学题、选择题)。

5.4 树形思考(ToT)

让 AI 探索多条思路:
对每个方案:
1. 评估可行性
2. 列出优缺点
3. 给出评分

最后选择最优方案。

六、避坑指南

❌ 坑 1:Prompt 太长

不是越长越好。模型有注意力衰减,Prompt 超过 2000 tokens 后指令跟随能力下降。

❌ 坑 2:指令冲突

请简洁回答,不要超过 100 字,详细说明每个步骤...

简洁 + 详细互相矛盾,AI 会困惑。

❌ 坑 3:依赖 AI 知识

请根据官方文档说明 Laravel 11 的新特性

如果 AI 训练数据没包含,它会编造。要提供原文。

❌ 坑 4:忽视版本

用 Python 3.5 写代码  # 太老

指定当前主流版本(如 Python 3.12)。

七、Prompt 优化工具

  • Promptfoo:A/B 测试 Prompt
  • LangSmith:追踪 Prompt 效果
  • Helicone:LLM 可观测性
  • Vellum:Prompt 实验室

八、实战示例

8.1 文章摘要

你是内容编辑。

任务:为以下文章写 3 个不同风格的摘要:
1. 学术风(严谨)
2. 营销风(吸引点击)
3. 简洁风(一句话)

要求:
- 每条不超过 50 字
- 保留核心信息

文章:[粘贴文章]

8.2 代码审查

你是资深代码审查员。

请审查以下代码,重点关注:
1. 安全漏洞(SQL 注入、XSS、CSRF)
2. 性能问题(N+1 查询、内存泄漏)
3. 可维护性(命名、结构、注释)

输出格式:
🔴 严重:[问题 + 修复建议]
🟡 警告:[...]
🟢 建议:[...]

代码:[粘贴代码]

8.3 SQL 生成

你是 SQL 专家,擅长 MySQL 8.0。

表结构:
- users (id, name, email, created_at)
- orders (id, user_id, amount, status, created_at)

需求:找出 2025 年 1 月消费超过 1000 元的 VIP 客户邮箱,按消费总额降序。

要求:
- 索引友好
- 处理 NULL
- LIMIT 100

九、Prompt 的未来

  • Auto-Prompt:LLM 自动优化 Prompt(DSPy、TextGrad)
  • Multi-Modal Prompt:图像 + 文本
  • Dynamic Prompt:根据上下文动态调整
Prompt 是 AI 时代的"编程语言"。会写 Prompt,等于会编程。