提示词工程完全指南:从API参数到结构化输出,像调音师一样控制大模型

【学习记录】提示词工程完全指南:从API参数到结构化输出,像调音师一样控制大模型

提示词工程(Prompt Engineering)是使用大语言模型最核心、也最容易被忽视的技能。它不是"写几句话让模型猜",而是一门结合了参数调优、结构化设计、思维链引导的系统性技术。本文从零开始,带你掌握提示词工程的全部关键技术。


📌 目录

  1. [API 关键参数详解](#API 关键参数详解)
  2. [结构化输出:JSON + JSON Schema](#结构化输出:JSON + JSON Schema)
  3. 提示词模板设计与增强技巧
  4. [非推理模型 vs 推理型模型](#非推理模型 vs 推理型模型)
  5. 可复用代码示例
  6. 总结速查表

一、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_ktop_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;非推理模型多给示例,推理模型多给明确任务。掌握这些,你就能像调音师一样精准控制大模型。

相关推荐
li星野2 天前
LlamaIndex 核心模块详解:从数据连接到智能代理,构建生产级 RAG 系统
大模型·llamaindex·学习记录
小徐xxx3 个月前
Softmax回归(分类问题)学习记录
深度学习·分类·回归·softmax·学习记录
爱吃泡芙的小白白4 个月前
Agent学习——反思模式
学习·agent·学习记录
小徐xxx6 个月前
Mamba架构讲解
深度学习·mamba·学习记录
爱吃泡芙的小白白6 个月前
vscode、anaconda、git、python配置安装(自用)
ide·git·vscode·python·anaconda·学习记录
爱吃泡芙的小白白6 个月前
使用某云超算平台Jupyterlab的使用方法(自用)
运维·服务器·python·学习记录
爱吃泡芙的小白白1 年前
爬虫学习——使用HTTP服务代理、redis使用、通过Scrapy实现分布式爬取
redis·分布式·爬虫·http代理·学习记录
爱吃泡芙的小白白1 年前
爬虫学习——Scrapy
爬虫·python·scrapy·学习记录