🔗 前置知识:大模型调用部署知识
📅 更新日期:2026-06-09


1. 什么是提示词工程?

简单说,提示词(Prompt) 就是我们向大模型发出的指令,引导大模型进行内容生成的命令,也就是你在网页端输入的那段话,比如:

  • “讲个笑话”
  • “用 Python 写一个贪吃蛇游戏”
    提示词工程(Prompt Engineering),就是通过有技巧地设计和优化这些指令,让模型输出尽可能符合我们预期的内容,并且持续迭代改进这个过程

它不是一次性写一句话那么简单,而是一套系统的方法论:怎么把任务说清楚、怎么给模型立人设、怎么约束格式、怎么提供示例……都是提示词工程的范畴。


2. 一条优秀提示词的基本结构

很多时候我们写提示词有一个习惯:只把需求问题简单的一口气扔进去。
但其实,只要掌握下面这个六要素框架,提示词质量和生成内容质量会上一个台阶。

六要素框架

  1. 设定角色与能力
    告诉模型“你是谁”,它能用什么知识、以什么视角来回答。
  2. 明确核心请求与任务
    你到底想让模型做什么,一句话讲清楚。
  3. 按步骤拆解复杂任务
    把大任务拆成几个小步骤,减少模型“偷懒”或跑偏的可能。
  4. 指定风格与语气
    是要学术严谨,还是要小红书体,还是口语化课堂风?直接说。
  5. 明确输出格式
    是要 JSON、Markdown 表格、分点列举,还是有特殊结构?白纸黑字写清楚。
  6. 提供输入输出示例
    给一个或几个范例,模型会模仿得非常像。这就是后面要说的 Few-shot 思想在提示词里的直接应用。

实际例子
假设我们的需求是:向高中生解释法国大革命爆发的主要原因
如果我们把这六要素用上,提示词会变成这样:

你是一名经验丰富的历史老师,擅长用生动有趣的方式讲述复杂的历史事件。现在,请完成以下任务:

1. 核心任务
向一位高中生解释法国大革命爆发的主要原因。

2. 表达要求

  • 语气与风格:使用简洁、口语化、充满课堂热情的语气,避免学术黑话,整体叙事可以借鉴《人类群星闪耀时》中对历史关键时刻的描写手法,富有画面感和戏剧性。
  • 内容禁忌:聚焦于原因分析,不要罗列冗长的日期和事件过程表。

3. 内容与结构要求

  • 开头:先用一段话,生动描述革命前法国社会的总体氛围和紧张感(即背景概述)。
  • 主体:分别从政治、经济、思想三个层面阐述直接原因。每个层面提炼 2 个关键点,并为每个关键点配 1 个具体、有说服力的史实例子。
  • 结尾:提供一个帮助学生记忆的妙招。

4. 输出格式
请严格按照以下结构组织你的回答:

【历史现场氛围】
(在这里写你的背景概述)

【危机根源解析】

  • 政治层面:
    关键点1:…… 例子:……
    关键点2:…… 例子:……
  • 经济层面:
    关键点1:…… 例子:……
    关键点2:…… 例子:……
  • 思想层面:
    关键点1:…… 例子:……
    关键点2:…… 例子:……

【记忆法宝】
(请提供一个巧妙的比喻、口诀或联想图像,将这三大层面串联起来,方便学生瞬间记忆)

这其实就是一个把六要素全部落地了的提示词。模型拿到它,会非常清楚自己该干什么、怎么干、输出长什么样。

可以把这六要素简单记忆为:角色、任务、步骤、风格、格式、示例

在这里插入图片描述


3. 这几个要素一定要全部用上吗?

当然不是。
我认为这不是死板的公式,而是一套指导思路,你可以根据任务的复杂程度灵活增减:

  • 简单任务(比如“翻译以下内容”),可能只需要 核心任务 + 输出格式
  • 复杂任务(比如“写一份竞品分析报告”),就可能需要把六个要素都用上,甚至还要加上更多约束(如字数限制、需要考虑的维度)。

当然同理,除了这六点,你还可以根据具体场景加入其它技巧,比如:

  • 要求模型先思考再作答(思维链)
  • 要求模型自我检查输出内容
  • 使用分隔符清晰地隔开不同信息块

重点不是套模板,而是让模型完全理解你的意图,没有歧义。 不同的写法只要能达成目的,就是好提示词。所以,提示词的编写没有绝对的“唯一正确格式”,更看重是否贴合业务需求和预期效果。


4. 底层思维:Zero-shot 与 Few-shot

我们在学习提示词的时候,一定会碰到这两个词。它们不仅是模型训练中的概念,更是提示词工程中两个非常重要的思想

4.1 Zero-shot(零样本)

Zero-shot(零样本):指在训练阶段不存在与测试阶段完全相同的类别,但是模型可以使用训练过的知识来推广到测试集中的新类别上。这种能力被称为“零样本”学习,因为模型在训练时从未见过测试集中的新类别,这种思想在模型训练和提示词优化中均有体现。
对于提示词来说,简单理解为:不提供任何示例,直接向模型描述任务让它执行

比如:

请判断以下评论是正面还是负面:
“这个手机用了一天就卡死了。”

你只给了任务描述,没有给任何示例,这就是 Zero-shot 提示。

在这里插入图片描述

4.2 Few-shot(少样本)

Few-shot(少样本):是指少样本学习,当模型在学习了一定类别的大量数据后,对于新的类别,只需要少量的样本就能快速学习。这种思想同时也在模型训练和提示词优化中均有体现。
对于提示词来说,简单理解为:在提示词里给出几个示例,让模型照着示例的模式输出
对应地,One-shot 就是只给一个示例,属于 Few-shot 的一种特殊情况。

比如:

请判断评论情感倾向(正面/负面)。
示例1:
评论:“质量很好,非常满意。” → 正面
示例2:
评论:“客服态度差,再也不买了。” → 负面

现在请判断:
“物流快得超乎想象。” →

模型会根据给的示例,大概率输出“正面”。

在这里插入图片描述

4.3 这两种思想在提示词框架中的位置

其实,Few-shot 就是我们前面说的“提供输入输出示例”这一步的底层逻辑
而 Zero-shot 则是我们日常最常用的“直接问”的方式。

一般来说,任务越复杂、输出格式要求越严格,就越推荐使用 Few-shot,它能显著提高输出的稳定性和准确性。


5. 调用大模型知识回顾

在真正进入案例之前,我们需要回顾最基础的调用代码。
这里以 DeepSeek 的 API 为例(OpenAI 兼容格式)。

# 安装必要库: pip install openai
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ.get('DEEPSEEK_API_KEY'),  # 从环境变量读取密钥,更安全
    base_url="https://api.deepseek.com"
)

response = client.chat.completions.create(
    model="deepseek-v4-pro",          # 使用的模型名称,注意要和你的 API Key 匹配
    messages=[
        {"role": "system", "content": "You are a helpful assistant"},
        {"role": "user", "content": "Hello"},
    ],
    stream=False,
    reasoning_effort="high",
    extra_body={"thinking": {"type": "enabled"}}
)

print(response.choices[0].message.content)

关键点解析:

client.chat.completions.create里包含:

  • model:字符串,指定要调用的模型,必须是你 API Key 有权限访问的模型名
  • messages:一个列表,列表中的每个元素是一个字典,代表对话中的一条消息。
    • {"role": "system", "content": "..."}系统消息,用来设定模型的角色和能力。
    • {"role": "user", "content": "..."}用户消息,用来发送你的任务和要求。
    • 在多轮对话中,还会包含 {"role": "assistant", "content": "..."} 作为历史回复。
  • stream:是否流式输出,这里设为 False 表示一次性返回完整结果。
  • 其他参数如 reasoning_effortextra_body 等,不同模型可能有所区别,可根据业务需要调整。
    最终的回复内容从 response.choices[0].message.content 中取出。

这段代码是后续提示词实践的基础,后面的案例会重点关注 messages


6. 实战案例:文本语义匹配

下面我们来看一个完整案例。
任务:判断两句话是否语义匹配,回答“是”、“不是”或“不确定”。我们将使用 Few-shot 思想,在提示词中嵌入多个示例,让模型稳定输出。

from openai import OpenAI
import os

client = OpenAI(
    api_key=os.environ.get('DEEPSEEK_API_KEY'),
    base_url="https://api.deepseek.com"
)

# 准备好的示例数据:给模型展示什么是“匹配”与“不匹配”
examples_data = {
    "是": [
        ("公司ABC发布了季度财报,显示盈利增长。", "财报披露,公司ABC利润上升。"),
        ("公司ITCAST发布了年度财报,显示盈利大幅度增长。", "财报披露,公司ITCAST更赚钱了。")
    ],
    "不是": [
        ("黄金价格下跌,投资者抛售。", "外汇市场交易额创下新高。"),
        ("央行降息,刺激经济增长。", "新能源技术的创新。")
    ]
}

# 待判断的问题
questions = [
    ("利率上升,影响房地产市场。", "高利率对房地产有一定的冲击。"),
    ("油价大幅度下跌,能源公司面临挑战。", "未来智能城市的建设趋势越加明显。"),
    ("股票市场今日大涨,投资者乐观。", "持续上涨的市场让投资者感到满意。")
]

# 第一步:构建 system prompt,简要说明任务,并提示参考示例
messages = [
    {"role": "system", "content": 
        "你帮我完成文本匹配,我给你2个句子,每个句子分别被[]包围,"
        "你判断它们是否匹配,回答是或不是,如果实在判断不出来可以回答不确定,"
        "请参考如下示例:"
    },
]

# 第二步:把示例按“user/assistant”交替的形式塞进 messages
for key, value in examples_data.items():
    for t in value:
        messages.append(
            {"role": "user", "content": f"句子1:[{t[0]}],句子2:[{t[1]}]"}
        )
        messages.append(
            {"role": "assistant", "content": key}
        )

# 第三步:对每个待判断的问题,追加到 messages 后面调用模型
for que in questions:
    # 注意:这里每次调用都使用初始的 messages + 当前问题,不会把之前的回答带入下一次请求
    response = client.chat.completions.create(
        model="deepseek-v4-pro",
        messages=messages + [
            {"role": "user", "content": f"句子1:[{que[0]}],句子2:[{que[1]}]"}
        ],
    )
    print(response.choices[0].message.content)

代码解读与注意点:

  • 我们将 examples_data 中每个示例构造成一轮对话:用户给出两个句子,助手回答“是”或“不是”。这样模型就学会了这个任务的模式,这就是 Few-shot 的应用
  • 所有示例都预先放入 messages,成为固定的上下文。对于每个待测问题,我们复制整份上下文再加上新问题,避免之前的预测结果污染下一个问题的判断
  • 输出格式没有额外约束,模型会直接返回“是”、“不是”或“不确定”,因为示例已经固定了这个模式。如果想进一步约束,也可以在 system 中加上“只回复一个字”之类的指令。

把今天的所有内容梳理成一句话:

用清晰的指令和结构,降低模型的理解成本,同时用示例对齐模型的输出风格。

如果再精简一点,记住这三点就能应对绝大多数场景:

  • 角色 + 任务:让模型知道自己是谁、要干什么。
  • 约束 + 格式:把输出范围框定下来,避免跑偏。
  • 示例驱动:能用 Few-shot 尽量用 Few-shot,稳定性远高于 Zero-shot。

以上为个人学习总结,旨在梳理个人理解。如有疏漏或不当之处,欢迎指正与交流。如果文章对你有帮助,别忘了点个赞、留个言,让更多的小伙伴看到~ 我们下篇再见!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐