漫谈提示词工程

本文章还是稍微有点深度的,思路呢也相对会比较流畅,没那个耐心的尽早劝退好吧,有心思看的,可以品鉴品鉴~~

为什么会有提示词工程?或者说:它会出现在什么环节上呢?

思考这个流程:

获取数据->模型定义->模型训练->模型验证->模型调用->结果输出

1、人们希望大模型能给出我们想要的答案
2、对哪里做出调整我们可以获得更好的答案呢?

在这个流程中,我们其实可以对每一个环节做出一定量的优化和调整,这也就是提示词工程的来源!
想要让大模型完成较为复杂的任务,按照你想要的格式或方向输出,那你就需要在“模型调用”阶段做一定程度的优化,让你说的话,能被计算机抓住重点,get到你的想法和要求!

什么是提示词?

提示词(prompt)是一种人物构造的输入序列,用于引导GPT、deepseek等模型根据先前的输入的内容生成相关的输出。简单来说,就是你向模型提供的“提示词”

什么是提示词工程?

是指在不更新模型权重的情况下,如何与大模型交互以引导其行为以获得所需结果的方法。

提示词工程的设计原则:

  • 明确目标,给出清晰的指令(说人话,别说官话)
  • 提供上下文(人话说全,身份、场景、要求、目标···)
  • 复杂任务拆分成简单子任务(分解有特殊含义的任务,让它自己给自己生成一个执行步骤)
  • 给模型思考的时间(“先分析,再回答”,“让模型自己检查答案”)
  • 借助外部工具(计算器、代码解释器、搜索工具等等)

***提示词工程相关技术(作者手动插眼,你认真看的话,一会儿会回来搂一眼):
Zero-shot、Few-shot、Chain-of-Thought (CoT)、ReAct、Reflexion 和 Prompt Chaining

从现在开始,暂停不讲提示词工程了,要讲提示词工程的周边了
讲这几个技术之前需要先讲一个前置知识:我们在使用说提示词工程的时候,肯定是要给大模型发送一些我们处理好的文段的,在这个过程中,是不是一定会去调用大模型~怎么调?

先来解决一下怎么调的问题,然后再来处理提示词相关的问题,不用慌,知道就行,用的时候找官网copy就行
大模型API的风格派系,一共有两大阵营:
1、OpenAI兼容派(绝大多数厂商兼容该格式,只需要改 base_urlapi_key

import openai
import os

# 初始化客户端(推荐通过环境变量管理密钥,避免硬编码)
client = openai.OpenAI(
    api_key=os.getenv("OPENAI_API_KEY") or "*********************************",  # API密钥
    base_url="https://api.siliconflow.cn/v1",  # 接口基础地址(SiliconFlow平台)
)

response = client.chat.completions.create(
	# 定义要调用的模型(你选择的Qwen2.5-7B-Instruct)
	MODEL = "Qwen/Qwen2.5-7B-Instruct"
	
	# 初始化消息列表(包含系统提示)
	messages = [
	    {"role": "system", "content": "你是一个记忆型助手,记得历史对话内容。"}
	],
	stream = False
)

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

2、自称一派 Google(Gemini) 和Anthropic(Claude)有自己独特的API结构,参数命名和逻辑完全不同。如果你要换用它们,需要重写请求代码或者使用专门的SDK

from google import genai
client = genai.Client(api_key=" YOUR_API_KEY'"
response =client.models.generate_content(model="gemini-2.5-flash", 
                                        contents="Explain how AI works in a few words")
print(response.text)

API也是有厂商的,大公司都自己训练模型,售卖API,算力或推理平台通常不训练模型,主要提供极速的API托管服务,至于有哪些厂商,这里不做列举

在正式开始提示词工程之前,你需要安装openai的相关依赖:

pip install openai

然后去deep seeek和openrouter申请自己的api key,申请完后,会有多种API接口的调用方式:curl方式,Python的requests方式等等

到目前为止,我们也仅仅只解决了怎么调大模型接口的问题吧

走到这一步,你应该可以拿到输入一段文本后的结果了,但是,是不是又会发现一点小问题:
如果你让质量不太好的大模型输出json格式的东西,大模型为啥总出错?

你之前看到的那些例子(比如列表末尾多逗号、用中式顿号、带多余文字 “祝您有美好的一天”、裹着代码块符号 json),根源很简单:

大模型不是 “严谨的程序员”,它不会真的 “构建一个能直接用的 JSON 数据”,只是 “模仿 JSON 的样子写一段文本”。就像有人照着菜谱画菜,画得像但可能缺调料、摆错位置 —— 这些 “不像正经 JSON” 的错误,会导致我们没法直接用(比如 Python 的 json.loads () 会报错)。

简单说:大模型输出的是 “看起来像 JSON 的文字”,不是 “能直接用的 JSON 数据”,所以总有各种小错误

那么好,这时候就有了Pydantic这么个东西,它来定规矩、做检查

Pydantic 本质是个 “规则工具”,它的核心作用就两件事:

  1. 定 “正确的标准”:你告诉它 “我要的 JSON 必须有哪些内容、是什么类型”—— 比如 “必须有 name(字符串)、height(整数)、films(列表)这三个字段”,它就会把这个变成一个 “标准蓝图”。
  2. 查 “对不对”:拿到大模型的输出后,它会用这个 “蓝图” 检查:有没有少字段?类型对不对?(比如大模型给 height 是 “186cm”(字符串),Pydantic 会说 “错了!应该是整数 186”),还会明确告诉你 “哪里错了”。

举个通俗的例子:Pydantic 就像你雇的 “质检员”,你先跟它说 “合格的产品必须是:红色、圆形、直径 5cm”(定标准),它拿到产品后会检查,不合格就说 “这个是方形(形状错)、直径 3cm(尺寸错)”(查错误)。

行,有标准了吧,那么谁来做这个标准化呢?LangChain(OutputFixingParser):用 AI 修 AI 的错

LangChain 里的 OutputFixingParser 是个 “修复工具”,它的核心逻辑是 “用大模型自己的智能,修正它自己犯的错”—— 但它不能瞎修,必须靠 Pydantic 给的 “标准”。

它的工作流程超简单,一步一步来:

  1. 先拿大模型的输出(比如带多余文字、类型错误的 JSON),用 Pydantic 的 “标准蓝图” 去检查;
  2. 如果检查通过(JSON 完全符合 Pydantic 的规则),直接把 JSON 交给你用;
  3. 如果检查失败(比如有多余文字、类型错),Pydantic 会给出 “错误报告”(比如 “height 字段应该是整数,实际是字符串”);
  4. OutputFixingParser 会把这三样东西一起丢给大模型:
    • 你原来要的需求(比如 “查演员信息”);
    • 大模型之前的错误输出(比如带 “祝您有美好的一天” 的 JSON);
    • Pydantic 的 “错误报告 + 正确标准”(比如 “必须包含 name/height/films,height 是整数,不能有多余文字”);
  5. 大模型拿到这些信息,就知道 “我之前错在哪了,正确的该是什么样”,然后重新输出一个完全符合规则的 JSON—— 这次就不会有多余文字、类型错误了。

简单说:OutputFixingParser 是 “修复工人”,Pydantic 是 “质检员 + 标准手册”,工人靠手册判断哪里错了,再让大模型(原来犯错的 “师傅”)按标准改对。

总结:它俩为啥必须一起出现?

  • 没有 Pydantic:OutputFixingParser 不知道 “正确的 JSON 该是什么样”,就算想修,也不知道修到哪算对(比如不知道要不要 height 字段、height 该是整数还是字符串);
  • 没有 LangChain 的 OutputFixingParser:Pydantic 只能告诉你 “大模型输出错了”,但没法主动让大模型修正 —— 你得自己手动拿着错误报告去让大模型重写,效率低。

它俩的配合就是:Pydantic 定规则、查错误,OutputFixingParser 牵头让大模型按规则改错,最终让你拿到 “能直接用、没错误的 JSON 数据”。

最后给个极简版逻辑链:

大模型输出错误 JSON → Pydantic 定义 “正确标准” 并指出错误 → OutputFixingParser 带着 “错误输出 + 标准 + 错误提示” 找大模型 → 大模型按标准重写正确 JSON → 你拿到能用的数据。

到目前为止,你已经能拿到标准化的答案了吧,那么好,我们该开始讲插眼儿部分的内容了:

正戏开始:

一、Zero-shot(零样本学习)

1. 是什么?

不用给大模型任何示例,直接告诉它 “要做什么任务”,它就能输出结果。

比如直接说 “把‘我很开心’翻译成英文”,不用先给 “‘我饿了’→‘I’m hungry’” 这种示例。

2. 解决什么问题?
  • 没有现成示例数据时,快速让模型完成简单、通用的任务(翻译、分类、总结等);
  • 不想写复杂 Prompt,追求 “一句话搞定” 的高效场景。
3. 有什么用?

降低使用门槛,适合常见的基础任务(比如文本分类、简单问答、格式转换)。

4. 使用方式?

直接在 Prompt 里明确 “任务指令 + 输入内容”,不用加任何示例。

5. 代码示例(Python,用 openai API 模拟,核心看 Prompt)

python

import openai

# 核心:Prompt里只有“任务+输入”,没有任何示例
prompt = """请把下面的中文句子翻译成英文:
句子:今天的天气真不错,适合出门散步。"""

# 调用大模型(实际使用需配置API密钥)
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": prompt}]
)
print(response.choices[0].message.content)
# 输出:The weather is really nice today, perfect for going out for a walk.

二、Few-shot(少样本学习)

1. 是什么?

给大模型 1~5 个 “示例”(演示 “输入→正确输出” 的对应关系),让它模仿示例的规律完成任务。

比如想让模型给文本打标签,先给 2 个示例:“‘这部电影真好看’→正面”“‘剧情太烂了’→负面”,再让它给新文本打标签。

2. 解决什么问题?

Zero-shot 搞不定的复杂 / 小众任务(比如自定义标签分类、特定格式生成)—— 模型需要通过少量示例理解 “你的具体要求”。

3. 有什么用?

不用大量数据,就能让模型适配 “非通用” 任务(比如公司内部的报销单格式提取、特定领域的文本分类)。

4. 使用方式?

Prompt 结构:示例1(输入→输出)+ 示例2(输入→输出)+ ... + 新任务输入

5. 代码示例

python

import openai

# 核心:Prompt里先给2个示例,再让模型做新任务
prompt = """请根据用户评价给电影打标签(正面/负面/中性),示例如下:
示例1:输入=“画面精美,演技在线,值得二刷” → 输出=正面
示例2:输入=“剧情拖沓,逻辑混乱,不推荐” → 输出=负面
现在请处理:输入=“特效还可以,但剧情有点老套” → 输出=?"""

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": prompt}]
)
print(response.choices[0].message.content)
# 输出:中性

三、Chain-of-Thought (CoT,思维链)

1. 是什么?

让大模型 “一步步说出思考过程”,再给出最终答案 —— 而不是直接跳着给结果。

比如让模型算 “3 个人每人买 2 瓶水,每瓶水 5 元,总共花多少钱”,它会先想 “3 人 ×2 瓶 = 6 瓶,6 瓶 ×5 元 = 30 元”,再输出 30 元。

2. 解决什么问题?

复杂推理任务(数学计算、逻辑题、多步骤分析)—— 模型直接给答案容易出错,“分步思考” 能减少逻辑跳跃,提高准确率。

3. 有什么用?

把 “黑箱式输出” 变成 “透明化推理”,既提高复杂任务的正确率,还能看懂模型的思考逻辑(方便排查错误)。

4. 使用方式?

在 Prompt 里加引导词:“请一步步思考,再给出答案”;或给 “带思考过程的示例”(Few-shot CoT)。

5. 代码示例

python

import openai

# 核心:Prompt里要求“一步步思考”
prompt = """请计算:一个书架有3层,每层能放15本书,现在要放40本书,书架够放吗?
要求:先一步步分析,再给出结论。"""

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": prompt}]
)
print(response.choices[0].message.content)
# 输出:
# 第一步:计算书架总容量:3层 × 15本/层 = 45本
# 第二步:对比需要放的书:40本 < 45本
# 结论:书架够放。

四、ReAct(思考 - 行动循环)

1. 是什么?

让模型在 “思考” 和 “行动” 之间循环:先想 “我现在要做什么”→ 执行行动(比如调用工具查资料、算数据)→ 看行动结果→ 再思考 “下一步该做什么”→ 直到完成任务。

核心是 “不只是想,还要‘动手’用工具”—— 模型自己决定什么时候用工具、用什么工具。

2. 解决什么问题?

模型 “光想没用” 的任务:需要实时数据(比如查今天的天气)、复杂计算(比如算税率)、外部信息(比如查某公司股价)—— 这些任务模型靠自身知识解决不了,必须调用工具。

3. 有什么用?

让模型从 “只能回答已知问题” 变成 “能主动用工具解决未知 / 实时 / 复杂问题”(比如让模型帮你订机票:先查航班(调用机票 API)→ 查价格→ 确认时间→ 生成订单)。

4. 使用方式?

Prompt 里引导模型:“先分析任务需要做什么→ 选择工具执行→ 根据结果继续思考”,通常需要配合工具调用框架(比如 LangChain 的工具链)。

5. 代码示例(模拟简单工具调用,核心看 “思考 - 行动” 逻辑)

python

import openai

# 模拟一个“查当前时间”的工具
def get_current_time():
    import datetime
    return datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

# 核心:Prompt引导模型“先思考是否需要工具,再行动”
prompt = """任务:请告诉我现在的时间,然后说一句问候语。
规则:
1. 如果你不知道当前时间,必须调用工具get_current_time()获取;
2. 拿到时间后,再生成问候语。
请先说明你的思考,再执行行动,最后给出结果。"""

# 第一步:模型思考并决定调用工具
response1 = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": prompt}]
)
print("模型思考+行动指令:", response1.choices[0].message.content)
# 输出:我需要知道当前时间,所以调用工具get_current_time()

# 第二步:执行工具,获取结果
tool_result = get_current_time()

# 第三步:模型根据工具结果生成最终答案
prompt2 = f"""工具返回结果:{tool_result}
请根据这个结果,完成任务(说一句问候语)。"""
response2 = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": prompt2}]
)
print("最终结果:", response2.choices[0].message.content)
# 输出:现在是2025-11-28 15:30,祝你度过愉快的一天!

五、Reflexion(反思修正)

1. 是什么?

让模型 “做完任务后,自己检查有没有错”→ 发现错误后 “反思哪里错了、为什么错”→ 重新优化答案。

相当于让模型 “自己当老师,批改自己的作业”,循环迭代直到答案正确。

2. 解决什么问题?

模型第一次输出有错误(比如逻辑漏洞、遗漏信息),但需要 “高精度结果” 的任务(比如写报告、解复杂题、代码调试)。

3. 有什么用?

不用人工干预,让模型自动修正错误,提高输出的准确率和完整性。

4. 使用方式?

Prompt 结构:完成任务→ 检查错误(引导模型自查)→ 反思问题→ 重新输出

5. 代码示例

python

import openai

# 第一步:让模型先完成任务(故意让它出错)
task_prompt = """请计算:5+3×2=? 直接给出答案。"""
response1 = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": task_prompt}]
)
first_answer = response1.choices[0].message.content
print("第一次答案:", first_answer)  # 可能输出错误答案:16(错误原因:先算5+3=8,再×2)

# 第二步:引导模型反思修正
reflexion_prompt = f"""你刚才的答案是{first_answer},请检查是否正确:
1. 数学运算规则:先乘除后加减;
2. 重新计算5+3×2的步骤;
3. 给出正确答案。"""
response2 = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": reflexion_prompt}]
)
print("反思后答案:", response2.choices[0].message.content)
# 输出:正确步骤:先算3×2=6,再算5+6=11,答案是11。

六、Prompt Chaining(提示链)

1. 是什么?

把一个复杂任务拆成多个小任务,用 “前一个任务的输出” 作为 “后一个任务的输入”,像 “链条” 一样一步步完成。

比如写一篇文章:先生成标题→ 再写大纲→ 再填内容→ 最后修改润色 —— 每个步骤用一个 Prompt,上一步的结果传给下一步。

2. 解决什么问题?

单个 Prompt 搞不定的复杂任务(比如写报告、做数据分析、创作长文)—— 复杂任务步骤多、逻辑密,拆成小任务能减少模型的认知负担,让每个步骤更精准。

3. 有什么用?

让复杂任务 “化繁为简”,每个步骤聚焦一个小目标,最终输出更完整、更有条理的结果。

4. 使用方式?

拆分任务→ 设计每个小任务的 Prompt→ 把前一个 Prompt 的输出作为后一个的输入,依次执行。

5. 代码示例

python

import openai

# 复杂任务:写一篇关于“猫咪饲养”的短文(拆成3个小任务)
task1 = "请给一篇关于“猫咪饲养”的短文起3个标题,要求简洁易懂。"
response1 = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": task1}]
)
titles = response1.choices[0].message.content
print("步骤1:生成标题\n", titles)  # 输出3个标题,比如《新手养猫指南:从入门到精通》

# 步骤2:用选中的标题写大纲(前一步输出作为输入)
task2 = f"""请以标题《新手养猫指南:从入门到精通》为核心,写3个短文大纲要点,包括:饮食、居住、健康。"""
response2 = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": task2}]
)
outline = response2.choices[0].message.content
print("\n步骤2:生成大纲\n", outline)  # 输出:1. 饮食:选择猫粮、喂食频率;2. 居住:猫砂盆摆放、环境布置;3. 健康:定期体检、疫苗接种

# 步骤3:根据大纲填内容(前一步输出作为输入)
task3 = f"""请根据以下大纲,写一篇100字左右的短文:
{outline}"""
response3 = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": task3}]
)
final_article = response3.choices[0].message.content
print("\n步骤3:完成短文\n", final_article)
# 输出:《新手养猫指南:从入门到精通》...(完整短文)

总结:6 个概念的核心区别(一句话分清)

概念核心逻辑适用场景
Zero-shot无示例,直接指令简单通用任务(翻译、总结)
Few-shot给少量示例,模仿规律复杂小众任务(自定义分类)
CoT分步思考,再给答案复杂推理(数学、逻辑题)
ReAct思考→行动(用工具)→反思需实时 / 外部数据(查天气)
Reflexion完成→自查→修正高精度任务(错题、报告)
Prompt Chaining拆复杂任务为多个小 Prompt长文创作、复杂报告

本质上,它们都是 “通过优化 Prompt 或流程,让大模型更精准、更高效地完成任务”—— 只是针对的场景和解决思路不同。

还有就是提示词攻防技术了。
简单来说:你想要看大模型给你找点小电影看,大模型会告诉你:去球吧你~这个就是攻防技术。
涉及到的一些攻击名词:原始注入、叙事诱导、伪装系统指令、上下文重置等等这些见名知意
怎么防?巨简单!过滤掉关键词就行···

好啦,能看到这儿你是这个👍,如果觉的有用,麻烦点个给我点个✨谢谢🙏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peter_Monster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值