【学习记录】提示词工程完全指南:从API参数到结构化输出,像调音师一样控制大模型
提示词工程(Prompt Engineering)是使用大语言模型最核心、也最容易被忽视的技能。它不是"写几句话让模型猜",而是一门结合了参数调优、结构化设计、思维链引导的系统性技术。本文从零开始,带你掌握提示词工程的全部关键技术。
📌 目录
- [API 关键参数详解](#API 关键参数详解)
- [结构化输出:JSON + JSON Schema](#结构化输出:JSON + JSON Schema)
- 提示词模板设计与增强技巧
- [非推理模型 vs 推理型模型](#非推理模型 vs 推理型模型)
- 可复用代码示例
- 总结速查表
一、API 关键参数详解
调用 LLM API(OpenAI、DeepSeek、Claude)时,除了提示词本身,还有一组生成控制参数,它们对输出质量有决定性影响。
1.1 参数速查表
| 参数 | 作用 | 取值范围 | 推荐起点 |
|---|---|---|---|
max_tokens |
限制输出最大长度 | 1~模型上限 | 500~2000 |
temperature |
控制随机性 | 0~2 | 0.7 |
top_k |
候选词裁剪 | 1~100(0表示禁用) | 不常用 |
top_p |
核采样阈值 | 0~1 | 1(配合 temperature) |
repetition_penalty |
降低重复概率 | 1.0 无惩罚,>1.0 惩罚 | 1.0~1.2 |
seed |
固定随机种子 | 整数 | 固定值(如 42) |
1.2 详细解释 + 代码示例
max_tokens:控制长度与成本
限制模型生成的最大 token 数,防止过长输出或控制成本。
python
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "写一篇关于AI的短文"}],
max_tokens=100 # 最多生成约 100 个 token
)
temperature:随机性的灵魂
通过缩放 logits 来平滑或锐化概率分布:
- 低 temperature(0~0.3):模型更"保守",适合事实问答、代码生成。
- 高 temperature(0.8~1.5):模型更"随机",适合创意写作、头脑风暴。
python
# 低 temperature -> 确定性高,适合事实问答
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "法国的首都是哪里?"}],
temperature=0.1
)
# 高 temperature -> 创意性高,适合故事生成
response = client.chat.completions.create(
messages=[{"role": "user", "content": "写一个科幻故事的开头"}],
temperature=0.9
)
top_k 与 top_p
top_k:只从概率最高的 k 个词中采样。k 越小越确定。top_p(核采样):从累积概率达到 p 的最小词集合中采样。两者通常不叠加使用。
python
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "造句"}],
top_p=0.9,
# top_k=50 # 如果同时设置,部分 API 仅支持其中一种
)
repetition_penalty:减少重复
对已经出现过的 token 给予惩罚,减少重复。通常设为 1.1~1.2。
python
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "列举十个水果"}],
repetition_penalty=1.15
)
seed:实现可复现输出
固定随机种子,使相同参数和提示词下输出可复现。
python
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "讲个笑话"}],
seed=42
)
二、结构化输出:JSON + JSON Schema
2.1 JSON Object(普通 JSON)
要求模型输出一个合法的 JSON 对象,通常配合 response_format={"type": "json_object"} 强制。
python
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "只输出 JSON 对象,不要其他文字"},
{"role": "user", "content": "提取姓名和年龄:张三,25岁"}
],
response_format={"type": "json_object"}
)
# 输出: {"name": "张三", "age": 25}
2.2 JSON Schema(更强约束)
使用 JSON Schema 精确指定输出字段、类型、枚举值,避免格式错误。
python
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "推荐三本书"}],
response_format={
"type": "json_schema",
"json_schema": {
"name": "book_recommendation",
"strict": True,
"schema": {
"type": "object",
"properties": {
"books": {
"type": "array",
"items": {"type": "string"}
}
},
"required": ["books"],
"additionalProperties": False
}
}
}
)
经验:优先使用 JSON Schema,它能大幅降低解析错误率,尤其适合生产环境。
三、提示词模板设计与增强技巧
3.1 核心组成部分
| 组件 | 说明 | 示例 |
|---|---|---|
| 指令 | 告诉模型要做什么 | "将以下英文翻译成中文:" |
| 上下文 | 背景信息,帮助模型理解 | "你是一个专业翻译,擅长技术文档" |
| 输入数据 | 需要处理的具体内容 | "Deep learning is a subset of machine learning." |
| 输出格式 | 期望的格式 | "只返回 JSON,不要解释" |
简单模板示例:
python
prompt = f"""
请扮演一个技术文档翻译专家。
将下面的英文翻译成中文,要求术语准确,语句通顺:
{input_text}
只返回翻译结果,不要添加任何注释。
"""
3.2 增强技术
① 少样本学习(Few-shot)
提供几个示例输入-输出对,让模型"悟出"规律。
python
prompt = """
将英文短语翻译为中文:
English: "Hello" -> Chinese: "你好"
English: "Good morning" -> Chinese: "早上好"
English: "How are you?" -> Chinese: "你好吗?"
English: "I love AI" -> Chinese:
"""
② 思维链(Chain-of-Thought, CoT)
引导模型逐步推理,适用于数学、逻辑问题。对于非推理模型尤其重要。
python
prompt = """
问题:一个商店有 10 个苹果,卖出 3 个,又买入 5 个,现在有多少个苹果?
让我们一步一步思考:
1. 最初有 10 个苹果。
2. 卖出 3 个,剩下 10 - 3 = 7 个。
3. 买入 5 个,现在有 7 + 5 = 12 个。
所以答案是 12。
"""
③ 自洽性(Self-Consistency)
让模型生成多个推理路径,投票选最一致的答案。需要多次调用 API。
python
answers = []
for _ in range(5):
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "请逐步推理:..."]}
)
answers.append(response.choices[0].message.content)
# 提取答案,取多数
3.3 结构化格式技巧
- 边界标记 :使用
"""、###、<tag>等分隔不同部分。
python
prompt = """
### 指令 ###
翻译以下文本
### 输入 ###
"Machine learning is fun."
### 输出格式 ###
只输出中文翻译
"""
- 角色分配:让模型扮演专家、助手、老师等。
python
prompt = "你是一位资深软件架构师,请解释微服务的优缺点。"
- 分步指令:将复杂任务拆成多个子任务。
python
prompt = """
请执行以下步骤:
1. 总结下面文章的第一段。
2. 然后提取所有数字。
3. 最后用一句话概括全文。
"""
四、非推理模型 vs 推理型模型
不同模型架构对提示词敏感度不同。理解区别能让你事半功倍。
对比表格
| 特性 | 非推理模型(如 GPT-3.5-turbo、Llama 2) | 推理型模型(如 GPT-o1、DeepSeek-R1、Claude 3 Opus) |
|---|---|---|
| 需要显式 CoT | 强烈推荐 | 可选,有时多余 |
| 提示词长度敏感度 | 高(太长会"丢失"指令) | 低(可接受长上下文) |
| 对角色扮演的响应 | 一般 | 更好 |
| 示例数量 | 需要几个 few-shot | 通常 zero-shot 也能工作 |
| 输出风格 | 较稳定,需格式约束 | 更灵活,有时会额外输出思考过程 |
设计建议
非推理模型 的提示词需要明确、结构化、提供充足示例:
python
prompt = """
你是一个客服助手,名为小智。
你的目标是帮助用户解决产品使用问题。
约束:
- 只回答与产品相关的问题
- 回答要简洁,不超过 3 句话
- 如果不知道答案,说"请查阅产品手册"
用户问题:{question}
回答:
"""
推理型模型 的提示词更注重任务定义和输入数据:
python
prompt = """
任务:解决下面的数学问题并解释你的推理过程。
问题:如果一个水池 5 小时能装满,8 小时能排空,同时打开进水管和出水管,多久能装满?
"""
五、可复用代码示例
python
from openai import OpenAI
from typing import List, Dict, Any
import json
class PromptTemplate:
def __init__(self, template: str, temperature=0.7, max_tokens=500):
self.template = template
self.temperature = temperature
self.max_tokens = max_tokens
self.client = OpenAI()
def format(self, **kwargs) -> str:
return self.template.format(**kwargs)
def call(self, **kwargs) -> str:
prompt = self.format(**kwargs)
response = self.client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=self.temperature,
max_tokens=self.max_tokens
)
return response.choices[0].message.content
# 使用示例
qa_template = PromptTemplate(
template="问题:{question}\n\n请用中文给出简洁准确的回答。",
temperature=0.3,
max_tokens=200
)
answer = qa_template.call(question="什么是提示词工程?")
print(answer)
六、总结速查表
| 场景 | 推荐 temperature | 推荐 top_p | 是否用 CoT | 是否用 few-shot |
|---|---|---|---|---|
| 事实问答(如"首都")、代码生成 | 0~0.3 | 1 | 否 | 可选 |
| 翻译、摘要、格式化输出 | 0.3~0.5 | 1 | 否 | 是(尤其是复杂格式) |
| 创意写作、头脑风暴 | 0.8~1.2 | 0.9 | 否 | 是 |
| 数学推理、逻辑题 | 0~0.3 | 1 | 强烈推荐 | 可选 |
| 多轮对话、角色扮演 | 0.7~0.9 | 1 | 否 | 是 |
| 需要可靠 JSON 输出 | 0.1 | 1 | 否 | 配合 JSON Schema |
核心心法 :
temperature是灵魂,max_tokens是保险,top_p辅助控制多样性;结构化输出用 JSON Schema;复杂推理用 CoT;非推理模型多给示例,推理模型多给明确任务。掌握这些,你就能像调音师一样精准控制大模型。