【提示词工程】提示词工程笔记:从核心思想到实战代码
文章目录
- 1. 什么是提示词工程?
- 2. 一条优秀提示词的基本结构
- 3. 这几个要素一定要全部用上吗?
- 4. 底层思维:Zero-shot 与 Few-shot
- 4.1 Zero-shot(零样本)
- 4.2 Few-shot(少样本)
- 4.3 这两种思想在提示词框架中的位置
- 5. 调用大模型知识回顾
- 6. 实战案例:文本语义匹配
🔗 前置知识:大模型调用部署知识
📅 更新日期:2026-06-09
1. 什么是提示词工程?
简单说,提示词(Prompt)就是我们向大模型发出的指令,引导大模型进行内容生成的命令,也就是你在网页端输入的那段话,比如:
- “讲个笑话”
- “用 Python 写一个贪吃蛇游戏”
而提示词工程(Prompt Engineering),就是通过有技巧地设计和优化这些指令,让模型输出尽可能符合我们预期的内容,并且持续迭代改进这个过程。
它不是一次性写一句话那么简单,而是一套系统的方法论:怎么把任务说清楚、怎么给模型立人设、怎么约束格式、怎么提供示例……都是提示词工程的范畴。
2. 一条优秀提示词的基本结构
很多时候我们写提示词有一个习惯:只把需求问题简单的一口气扔进去。
但其实,只要掌握下面这个六要素框架,提示词质量和生成内容质量会上一个台阶。
六要素框架
- 设定角色与能力
告诉模型“你是谁”,它能用什么知识、以什么视角来回答。 - 明确核心请求与任务
你到底想让模型做什么,一句话讲清楚。 - 按步骤拆解复杂任务
把大任务拆成几个小步骤,减少模型“偷懒”或跑偏的可能。 - 指定风格与语气
是要学术严谨,还是要小红书体,还是口语化课堂风?直接说。 - 明确输出格式
是要 JSON、Markdown 表格、分点列举,还是有特殊结构?白纸黑字写清楚。 - 提供输入输出示例
给一个或几个范例,模型会模仿得非常像。这就是后面要说的 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 openaiimportosfromopenaiimportOpenAI 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_effort、extra_body等,不同模型可能有所区别,可根据业务需要调整。
最终的回复内容从response.choices[0].message.content中取出。
这段代码是后续提示词实践的基础,后面的案例会重点关注messages。
6. 实战案例:文本语义匹配
下面我们来看一个完整案例。
任务:判断两句话是否语义匹配,回答“是”、“不是”或“不确定”。我们将使用 Few-shot 思想,在提示词中嵌入多个示例,让模型稳定输出。
fromopenaiimportOpenAIimportos 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”交替的形式塞进 messagesforkey,valueinexamples_data.items():fortinvalue:messages.append({"role":"user","content":f"句子1:[{t[0]}],句子2:[{t[1]}]"})messages.append({"role":"assistant","content":key})# 第三步:对每个待判断的问题,追加到 messages 后面调用模型forqueinquestions:# 注意:这里每次调用都使用初始的 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。
以上为个人学习总结,旨在梳理个人理解。如有疏漏或不当之处,欢迎指正与交流。如果文章对你有帮助,别忘了点个赞、留个言,让更多的小伙伴看到~ 我们下篇再见!
