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

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


📌 目录

  1. API 关键参数详解
  2. 结构化输出:JSON + JSON Schema
  3. 提示词模板设计与增强技巧
  4. 非推理模型 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 数,防止过长输出或控制成本。

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):模型更“随机”,适合创意写作、头脑风暴。
# 低 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 的最小词集合中采样。两者通常不叠加使用。
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。

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "列举十个水果"}],
    repetition_penalty=1.15
)
seed:实现可复现输出

固定随机种子,使相同参数和提示词下输出可复现。

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"} 强制。

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 精确指定输出字段、类型、枚举值,避免格式错误。

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,不要解释”

简单模板示例

prompt = f"""
请扮演一个技术文档翻译专家。

将下面的英文翻译成中文,要求术语准确,语句通顺:

{input_text}

只返回翻译结果,不要添加任何注释。
"""

3.2 增强技术

① 少样本学习(Few-shot)

提供几个示例输入-输出对,让模型“悟出”规律。

prompt = """
将英文短语翻译为中文:
English: "Hello" -> Chinese: "你好"
English: "Good morning" -> Chinese: "早上好"
English: "How are you?" -> Chinese: "你好吗?"
English: "I love AI" -> Chinese: 
"""
② 思维链(Chain-of-Thought, CoT)

引导模型逐步推理,适用于数学、逻辑问题。对于非推理模型尤其重要

prompt = """
问题:一个商店有 10 个苹果,卖出 3 个,又买入 5 个,现在有多少个苹果?
让我们一步一步思考:
1. 最初有 10 个苹果。
2. 卖出 3 个,剩下 10 - 3 = 7 个。
3. 买入 5 个,现在有 7 + 5 = 12 个。
所以答案是 12。
"""
③ 自洽性(Self-Consistency)

让模型生成多个推理路径,投票选最一致的答案。需要多次调用 API。

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> 等分隔不同部分。
prompt = """
### 指令 ###
翻译以下文本

### 输入 ###
"Machine learning is fun."

### 输出格式 ###
只输出中文翻译
"""
  • 角色分配:让模型扮演专家、助手、老师等。
prompt = "你是一位资深软件架构师,请解释微服务的优缺点。"
  • 分步指令:将复杂任务拆成多个子任务。
prompt = """
请执行以下步骤:
1. 总结下面文章的第一段。
2. 然后提取所有数字。
3. 最后用一句话概括全文。
"""

四、非推理模型 vs 推理型模型

不同模型架构对提示词敏感度不同。理解区别能让你事半功倍。

对比表格

特性 非推理模型(如 GPT-3.5-turbo、Llama 2) 推理型模型(如 GPT-o1、DeepSeek-R1、Claude 3 Opus)
需要显式 CoT 强烈推荐 可选,有时多余
提示词长度敏感度 高(太长会“丢失”指令) 低(可接受长上下文)
对角色扮演的响应 一般 更好
示例数量 需要几个 few-shot 通常 zero-shot 也能工作
输出风格 较稳定,需格式约束 更灵活,有时会额外输出思考过程

设计建议

非推理模型的提示词需要明确、结构化、提供充足示例

prompt = """
你是一个客服助手,名为小智。
你的目标是帮助用户解决产品使用问题。

约束:
- 只回答与产品相关的问题
- 回答要简洁,不超过 3 句话
- 如果不知道答案,说“请查阅产品手册”

用户问题:{question}

回答:
"""

推理型模型的提示词更注重任务定义和输入数据

prompt = """
任务:解决下面的数学问题并解释你的推理过程。

问题:如果一个水池 5 小时能装满,8 小时能排空,同时打开进水管和出水管,多久能装满?
"""

五、可复用代码示例

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

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐