LESSON · 04
好的
Prompt
= 半个产品
Prompt 工程:从零样本到思维链,把语言变成控制权。
凭什么
它听你的?
LLM 没有程序逻辑,你说的方式就是它的行为。
好 Prompt 的四要素
- 角色 — 你是谁?给模型一个身份
- 任务 — 具体做什么?动词驱动
- 上下文 — 背景 / 约束 / 受众
- 输出格式 — JSON / 列表 / 长度限制
- 四要素不必全有,但缺一个往往差一截
Zero-shot
你是一位代码审查专家。
审查下面这段 Python 代码,
列出所有安全隐患,每条一行。
```python
import os
query = input()
os.system("ls " + query)
```
零样本:直接告诉模型做什么,不给例子
Few-shot · 少样本
- 原理:用例子激活模型的"上下文学习"能力
- 用途:统一输出格式、风格迁移、特殊判断逻辑
- 数量:1~5 条通常够用,超过 10 条边际效益递减
- 质量 > 数量:坏例子会误导模型
- → 当 Zero-shot 结果不稳定时,先试 Few-shot
"Let's think
step by step."
Wei et al., 2022 — Chain-of-Thought Prompting
CoT · 思维链
- 为什么有效:把"答案"变成"过程 + 答案",减少捷径
- Zero-shot CoT:直接加 "Let's think step by step"
- Manual CoT:Few-shot 里的例子包含推理步骤
- 适用场景:数学 / 逻辑 / 多步推理
- → 复杂任务首选 CoT,简单任务没必要
ReAct · 推理 + 行动
- Thought 模型推理当前状态
- Action 调用工具 / 搜索 / 执行
- Observation 获得结果,继续推理
- 循环直到得出最终答案
- → ReAct 是 Agent 的思维骨架
N×
采样 → 投票 → 最优答案
Self-Consistency · 自洽采样
- 方法:同一问题跑 N 次 CoT,取多数答案
- 代价:N 倍 token 消耗
- 收益:复杂推理准确率显著提升
- 适合离线批量处理,不适合实时对话
结构化输出
// System prompt 里声明:
"用 JSON 返回,格式如下:
{
\"severity\": \"high|medium|low\",
\"issues\": [\"...\"],
\"suggestion\": \"...\"
}"
// 或使用 Tool Use / Function Calling
// 直接绑定 JSON Schema
System · User · Assistant
System
- 角色 / 规则 / 人格
- 全局约束
- 不被 User 覆盖
+
Assistant 是模型历史回复,Multi-turn 对话的记忆载体
Prompt 注入攻击
- 直接注入:用户输入 "Ignore previous instructions..."
- 间接注入:从外部数据(网页/文档)混入恶意指令
- 越狱:角色扮演 / 编码绕过 / 语言混淆
- 防御 系统提示明确边界,输入/输出过滤,最小权限原则
- → 把 Prompt 当代码,安全同样重要
可维护的 Prompt 模板
SYSTEM = """
你是一位资深 {role}。
目标受众:{audience}
输出语言:中文
输出格式:{format}
约束:{constraints}
"""
def build_prompt(role, audience, format, constraints):
return SYSTEM.format(
role=role,
audience=audience,
format=format,
constraints=constraints
)
怎么知道 Prompt 真的好
- 建测试集:用真实样本 + 标注答案
- 自动评分:LLM-as-judge(用另一个模型打分)
- A/B 对比:两版 Prompt 跑同一批样本
- 工具:Promptfoo / LangSmith / PromptLayer
- → 没有评测的 Prompt 优化是玄学
Promptfoo 评测实战
# promptfoo.yaml - 3分钟跑一次 Prompt 评测
# npm install -g promptfoo
prompts:
- "你是代码审查员。审查以下代码,列出问题:\n{{code}}"
- "作为资深工程师,找出代码中的 3 个最严重问题:\n{{code}}"
providers:
- openai:gpt-4o-mini
tests:
- vars:
code: "def add(a, b): return a + b # no type hints"
assert:
- type: contains
value: "type"
npx promptfoo eval && npx promptfoo view
什么情况选什么 Prompt 技术
- 简单分类 / 抽取 → Zero-shot + JSON Schema
- 需要推理 / 数学 → CoT(或直接用 o1 / R1)
- 格式要稳定 → Few-shot(2-3 个示例)
- 需要外部信息 → ReAct + Tool Use
- 要确保准确 → Self-consistency(多次采样)
- → 简单的先试简单的,别上来就上全家桶
本课收获
四要素
Zero/Few-shot
CoT 思维链
ReAct
结构化输出
注入防御
下一课 · RAG 检索增强:把外部知识塞进 LLM 的标准方案。