Prompt Engineering:与大模型高效对话的艺术

Prompt Engineering:与大模型高效对话的艺术

AI 核心技能系列 · 第 3 篇


导语

同样一个模型,有人用得好,有人用得烂。差别往往就在 Prompt。

这不是玄学。Prompt Engineering 是目前 ROI 最高的 AI 技能——零成本、立竿见影。你不需要训练模型,不需要搭基础设施,只需要学会"怎么跟模型说话",就能让它的输出质量提升一个档次。

很多人以为 Prompt Engineering 就是"把问题问清楚"。没错,但这只是冰山一角。真正的 Prompt Engineering 包括:策略选择、System Prompt 设计、结构化输出控制、失败诊断、甚至工程化管理。

这篇文章把 Prompt Engineering 从"个人技巧"拉到"专业技能"的高度。


一、Prompt 的本质:给模型的"工作说明书"

1.1 为什么 Prompt 这么重要

大模型的能力是"固定的"(在部署后),但你能释放多少,完全取决于 Prompt。

一个类比:大模型像一个什么都学过的博士。你问他"讲讲量子力学",他可能讲得太学术你听不懂。但如果你说"用给高中生讲课的方式,解释量子力学的核心思想,限制在 200 字内",他就能给你一个恰到好处的回答。

模型的能力是固定的,Prompt 决定了你能释放多少。

1.2 一个好 Prompt 的构成要素

一个好 Prompt 的五要素:

┌─────────────────────────────────────────────┐
│  1. 角色 (Role)       "你是一个资深后端工程师"   │
│  2. 任务 (Task)       "审查以下代码的安全问题"   │
│  3. 上下文 (Context)  "这是一个金融交易系统"     │
│  4. 格式 (Format)     "用表格列出问题和修复建议" │
│  5. 约束 (Constraint) "只关注 SQL 注入和 XSS"   │
└─────────────────────────────────────────────┘

1.3 效果对比

差 Prompt:

帮我看看这段代码有什么问题

好 Prompt:

你是一个有 10 年经验的后端安全工程师。
请审查以下 Python Flask 代码的安全漏洞,重点关注:
1. SQL 注入
2. XSS 攻击
3. 认证/授权缺陷

请用以下格式输出:
| 行号 | 漏洞类型 | 严重程度 | 问题描述 | 修复建议 |

代码如下:
<code>
...
</code>

同一个模型,前者可能给你一个模糊的"看起来还行",后者会给你一份结构化的安全审查报告。


二、基础技巧:五种核心 Prompting 策略

2.1 Zero-shot Prompting(零样本)

直接提问,不给例子。

import openai

response = openai.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "user", "content": "把以下英文翻译成中文:The future of AI is both exciting and uncertain."}
    ]
)
print(response.choices[0].message.content)
# 输出: AI 的未来既令人兴奋又充满不确定性。

适用场景:简单任务、模型能力范围内的常见任务。

2.2 Few-shot Prompting(少样本)

给几个示例,让模型学会你想要的模式。

response = openai.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "user", "content": """请按以下格式对商品评价进行情感分析:

评价: "这个手机电池很耐用,拍照也清晰" → 情感: 正面 | 关键词: 电池、拍照
评价: "包装破损,而且颜色和图片差别很大" → 情感: 负面 | 关键词: 包装、色差
评价: "一般般吧,没什么特别的" → 情感: 中性 | 关键词: 无

现在分析这条评价:
评价: "物流很快第二天就到了,但是用了一周就坏了" → """}
    ]
)
# 输出: 情感: 负面 | 关键词: 物流、质量

适用场景:需要特定输出格式、分类任务、模型需要"对齐"你的预期。

2.3 Chain-of-Thought(思维链)

让模型一步步推理,而不是直接给答案。

# 不用 CoT
prompt_bad = "一个水池有两个水管,A管每小时放水3吨,B管每小时放水5吨。水池容量40吨,同时打开两个水管,多久能放满?"
# 模型可能直接给出 5 小时(错误)

# 用 CoT
prompt_good = """一个水池有两个水管,A管每小时放水3吨,B管每小时放水5吨。水池容量40吨,同时打开两个水管,多久能放满?

请一步步推理:"""

# 模型输出:
# 1. A管每小时放水 3 吨
# 2. B管每小时放水 5 吨
# 3. 同时打开,每小时放水 3 + 5 = 8 吨
# 4. 水池容量 40 吨
# 5. 需要时间 = 40 / 8 = 5 小时
# 答案:5 小时

更强的变体是加一句魔法咒语:"Let's think step by step"——仅此一句,在 GSM8K 数学测试上能将 GPT-3 的准确率从 17.7% 提升到 78.7%。

适用场景:数学、逻辑推理、复杂分析等需要多步推理的任务。

2.4 Tree-of-Thought(思维树)

CoT 是一条推理链,ToT 是多条推理链并行探索,选最优的。

prompt_tot = """
问题:一家公司年收入 1000 万,想在三年内翻倍。请提出策略方案。

请用以下方式分析:
1. 提出 3 个不同的策略方向
2. 对每个策略,分析优势、风险和可行性
3. 综合评估,推荐最优方案

方向一:扩大市场份额
[分析...]

方向二:提高客单价
[分析...]

方向三:开拓新业务线
[分析...]

综合评估与推荐:
[...]
"""

适用场景:复杂决策、方案比较、需要考虑多种可能性的问题。

2.5 ReAct(推理 + 行动)

ReAct 模式让模型交替进行"思考"和"行动",是 Agent 的核心 Prompting 模式。

Prompt: 查一下今天北京的天气,然后告诉我适合穿什么衣服。

Thought 1: 用户想知道北京天气和穿衣建议,我需要先查天气。
Action 1: search_weather(city="北京")
Observation 1: 北京今天晴,气温 -2°C ~ 8°C,西北风 3-4 级

Thought 2: 气温较低,有风,需要穿保暖衣物。
Action 2: 无需额外工具,直接给出建议

Answer: 北京今天晴天但气温较低(-2°C ~ 8°C),建议穿羽绒服或厚棉服,
里面穿毛衣。有 3-4 级西北风,记得戴围巾和手套。

适用场景:需要调用外部工具、信息不完整需要逐步获取、Agent 场景。

2.6 五种策略对比

策略 复杂度 适用场景 Token 消耗 效果提升
Zero-shot 简单任务 基准
Few-shot ★★ 需要格式对齐 显著
CoT ★★ 推理任务 数学/逻辑大幅提升
ToT ★★★ 复杂决策 开放式问题提升大
ReAct ★★★★ Agent/工具调用 需要外部信息时必备

三、进阶技巧:System Prompt 设计

3.1 System Prompt 的作用

System Prompt 是你和模型之间的"合同"——它定义了整个对话的基调、规则和边界。

response = openai.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": """你是一个资深 Python 后端架构师。

## 角色设定
- 10 年 Python 开发经验,精通 FastAPI、SQLAlchemy、Redis
- 沟通风格:直接、务实,不说废话
- 代码风格:PEP 8 规范,类型注解,完整异常处理

## 回答规则
1. 给出代码时必须包含类型注解和 docstring
2. 指出潜在的性能问题和安全风险
3. 推荐最佳实践而不是"能跑就行"的方案
4. 如果问题不够清晰,先确认需求再给方案

## 输出格式
- 代码用 ```python 代码块包裹
- 关键决策点用 ⚠️ 标注
- 替代方案用 💡 标注"""},
        {"role": "user", "content": "帮我设计一个用户认证模块的接口"}
    ]
)

3.2 System Prompt 设计最佳实践

结构化模板:

# 角色
[一句话定义角色]

# 能力
- 擅长什么
- 知识范围

# 规则
1. 必须做什么
2. 不能做什么
3. 遇到边界情况怎么处理

# 输出格式
[定义输出的结构]

# 示例(可选)
[一个完整的输入-输出示例]

常见技巧:

  1. 角色越具体越好:"资深后端工程师" > "工程师" > "助手"
  2. 规则用编号列表:模型更容易遵循结构化的规则
  3. 用 Markdown 分区# ## 分区让模型更好地理解结构
  4. 给负面约束:"不要使用 eval()" 比 "用安全的方式" 更明确
  5. 长 System Prompt 放重要信息在开头和结尾:注意力分布在这两个位置最强

四、结构化输出控制

4.1 JSON Mode

当你需要模型输出结构化数据时,JSON Mode 可以保证输出格式。

from openai import OpenAI
from pydantic import BaseModel

client = OpenAI()

# 方法一:JSON Mode
response = client.chat.completions.create(
    model="gpt-4o",
    response_format={"type": "json_object"},
    messages=[
        {"role": "system", "content": "你是一个 API 接口。请以 JSON 格式返回数据。"},
        {"role": "user", "content": "分析这条评价的情感:'手机很好用,但是价格太贵了'"}
    ]
)
print(response.choices[0].message.content)
# {"sentiment": "mixed", "positive": ["好用"], "negative": ["价格贵"], "score": 0.6}

4.2 Structured Output(推荐)

OpenAI 的 Structured Output 功能更强——直接用 Pydantic 模型定义输出 Schema:

from pydantic import BaseModel
from typing import List

class SentimentAnalysis(BaseModel):
    sentiment: str  # "positive", "negative", "mixed", "neutral"
    confidence: float
    positive_aspects: List[str]
    negative_aspects: List[str]
    summary: str

response = client.beta.chat.completions.parse(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "分析用户评价的情感。"},
        {"role": "user", "content": "物流很快,但包装简陋,商品本身质量还不错。"}
    ],
    response_format=SentimentAnalysis,
)

result = response.choices[0].message.parsed
print(f"情感: {result.sentiment}")
print(f"置信度: {result.confidence}")
print(f"正面: {result.positive_aspects}")
print(f"负面: {result.negative_aspects}")

4.3 处理模型"不听话"的常见手段

问题 解决方案
不输出 JSON 使用 JSON Mode 或 Structured Output
输出格式不稳定 Few-shot 给标准格式示例
总是加多余的解释 明确说 "只输出 JSON,不要任何解释文字"
字段缺失 在 Schema 中设置 required 字段
值的范围不对 在描述中明确约束(如 "score 范围 0-1")

五、常见失败模式与修复

5.1 幻觉(Hallucination)

现象:模型自信地输出错误或编造的信息。

原因:模型在做 Token 预测,不是在"查事实"。当它不确定时,依然会输出最"合理"的下一个 Token。

缓解策略

  1. 加约束:"如果你不确定,请明确说'我不确定'"
  2. 要求引用来源:"请基于以下资料回答,不要添加资料中没有的信息"
  3. 使用 RAG:提供事实性上下文
  4. 降低 temperature:减少随机性
  5. 交叉验证:让模型自己检查答案

5.2 指令遗忘

现象:长对话中模型开始"忘记"之前的指令。

原因:注意力机制在长上下文中的衰减(虽然 100 万 Token 窗口理论上够了,但注意力分布不均)。

缓解策略

  1. 关键指令放在 System Prompt 中(最不容易被遗忘)
  2. 在长对话中定期重复重要规则
  3. 使用分隔符标记重要信息:### 重要规则 ###

5.3 格式不稳定

现象:同样的 Prompt,每次输出的格式不一样。

缓解策略

  1. 使用 Structured Output(从根源解决)
  2. 给多个 Few-shot 示例强化格式
  3. temperature 设为 0(确定性输出)
  4. 在 Prompt 末尾重复格式要求

5.4 速查表

问题 原因 快速修复
幻觉 模型生成最可能的 Token,而非事实 RAG + "不确定就说不知道"
指令遗忘 长上下文注意力衰减 重要规则放 System Prompt
格式不稳定 缺乏明确的格式约束 Structured Output / Few-shot
拒绝回答 过度安全对齐 调整措辞,提供合理上下文
回答太长 没有长度约束 明确 "限制在 X 字内"
回答太短 缺乏深度要求 "请详细解释" + CoT
偏离主题 指令不够聚焦 收窄任务范围 + 负面约束

六、Prompt 工程化:从个人技巧到团队规范

6.1 Prompt 版本管理

Prompt 和代码一样需要版本管理。推荐做法:

prompts/
├── sentiment-analysis/
│   ├── v1.0.md          # 初版
│   ├── v1.1.md          # 修复了幻觉问题
│   ├── v2.0.md          # 大改版,加了 Few-shot
│   └── CHANGELOG.md     # 变更记录
├── code-review/
│   └── ...
└── README.md            # Prompt 目录索引

6.2 Prompt 模板化

from string import Template

# 定义 Prompt 模板
SENTIMENT_TEMPLATE = Template("""
你是一个情感分析专家。请分析以下 $domain 领域的用户评价。

## 分析维度
$dimensions

## 输出格式
$output_format

## 评价内容
$review
""")

# 使用时填入参数
prompt = SENTIMENT_TEMPLATE.substitute(
    domain="电商",
    dimensions="- 商品质量\n- 物流速度\n- 客服态度",
    output_format='JSON: {"sentiment": "...", "scores": {...}}',
    review="手机质量不错,但物流太慢了"
)

6.3 A/B 测试与评估

不要凭感觉判断 Prompt 好不好——用数据说话。

import json

def evaluate_prompt(prompt_version, test_cases):
    """评估一个 Prompt 版本在测试集上的表现"""
    results = []
    for case in test_cases:
        response = call_llm(prompt_version, case["input"])
        score = compare(response, case["expected_output"])
        results.append({
            "input": case["input"],
            "expected": case["expected_output"],
            "actual": response,
            "score": score
        })
    
    avg_score = sum(r["score"] for r in results) / len(results)
    return {"prompt_version": prompt_version, "avg_score": avg_score, "details": results}

# 对比两个版本
result_v1 = evaluate_prompt("v1.0", test_cases)
result_v2 = evaluate_prompt("v2.0", test_cases)
print(f"v1.0 平均分: {result_v1['avg_score']:.2f}")
print(f"v2.0 平均分: {result_v2['avg_score']:.2f}")

七、职业视角:Prompt Engineering 在岗位中的价值

7.1 面试高频问题

问题 考察点 核心答案要点
如何设计一个好的 Prompt? 方法论 五要素:角色、任务、上下文、格式、约束
CoT 的原理是什么? 技术深度 让模型逐步推理,减少直接跳跃到答案时的错误
Few-shot 和 Fine-tuning 什么时候用哪个? 决策能力 Few-shot:任务简单、数据少;Fine-tuning:特定风格/格式、大量重复调用
怎么减少模型幻觉? 实战经验 RAG 提供事实来源、温度降低、要求引用来源、交叉验证
你在项目中怎么管理 Prompt? 工程能力 版本管理、模板化、A/B 测试、评估指标

7.2 Prompt Engineer 的职业定位

2024 年 "Prompt Engineer" 一度被炒得很热,年薪开到百万。2026 年更理性了:

现实是:Prompt Engineering 不是一个独立岗位,而是每个 AI 从业者都必须掌握的基础能力——就像"会写 SQL"不是一个独立岗位,但数据相关的岗位都得会一样。

  • AI 应用工程师:Prompt 是日常工具
  • AI 产品经理:需要能写 Prompt 做原型验证
  • Agent 开发者:System Prompt + Tool Description 是核心
  • 数据分析师:Prompt 驱动 LLM 做数据分析

总结

Prompt Engineering 的核心知识点:

  1. 五要素:角色、任务、上下文、格式、约束——好 Prompt 的基本框架
  2. 五种策略:Zero-shot → Few-shot → CoT → ToT → ReAct,按复杂度递增选用
  3. System Prompt:定义对话的"合同",用结构化 Markdown 编写
  4. 结构化输出:用 JSON Mode / Structured Output 控制格式,告别格式不稳定
  5. 失败诊断:幻觉、遗忘、格式问题都有对应的修复策略
  6. 工程化:Prompt 也需要版本管理、模板化、A/B 测试

这是你进入 AI 领域最快能见效的技能。掌握了 Prompt Engineering,你立刻就能在工作中用大模型提效。而这也是后面 RAG、Function Calling、Agent 开发的基础——所有和模型的交互,最终都落到 Prompt 上。


本文是 AI 核心技能系列 第 3 篇,共 12 篇。上一篇:大模型训练全景:预训练与后训练 | 下一篇:Embedding 与向量数据库:语义理解的基础设施

关注公众号「coft」,获取完整系列更新、配套代码和学习路线图。一起交流 AI 转行经验,助力职业跃升,迈向高薪岗位。

posted @ 2026-02-27 15:32  warm3snow  阅读(11)  评论(0)    收藏  举报