白话大模型增强技术系列之Prompt Engineering
对话是大语言模型有且唯一的输入x,在F训练完成无法改变的情况下, 输入x的质量直接决定了输出y的质量
系列文章目录
白话大模型增强技术系列之LLM速通
白话大模型增强技术系列之概览篇
白话大模型增强技术系列之Prompt Engineering
白话大模型增强技术系列之Agent
白话大模型增强技术系列之Agent Skills
一、提示词导论
什么是提示词(Prompt)?对模型说的话就是提示词。
什么是提示词工程(Prompt Engineering)?就是把话说好。
专业角度确实有点不严谨😃,不过我们这个系列针对的是小白同志,如果你不是学术佬,放心,就这么理解完全没有问题!
来个案例:
Prompt:"讲个笑话。"
这个提示词水平就一般般,讲哪种笑话、什么主题、要讲多长?模型一脸懵。于是我们把话说好:
Prompt:"""你是一位幽默大师,请用“吃面”为主题创作一个三段式笑话:
1. 铺垫场景
2. 制造冲突
3. 意外反转
要求:适合8岁儿童理解,不要双关语。"""
AI:"balabala...."
有懂点行的不经会问,都2026了,还有必要去研究提示词工程吗。我在“白话速通LLM”提到过,模型的本质就是一个“数学公式”,或称之为函数y=F(x),提示词是对话的一部分,而对话是大语言模型有且唯一的输入x,在F训练完成无法改变的情况下, 输入x的质量直接决定了输出y的质量。什么也不输入,模型就只能给你个空气,提示词作为基础中的基础,你说是不是得好好了解一下。我们后续会学习到的RAG,以及最近火起来的Agent Skills,在我看来底层其实都是在Prompt上搞事情。
二、提示词结构
1. 基础结构
提示词通常由以下一个或多个部分组成:
- 任务描述 你希望模型执行的任务,包括你希望模型扮演的角色以及输出格式。
- 如何完成该任务的示例 例如,如果你希望模型给文本中的物品分类,你可以提供一些示例,展示哪些物品应该归为哪一类。
- 任务 你希望模型执行的具体任务,比如要回答的问题或要润色的文本。

实验证明,这种样的结构能让模型更好的理解你的任务。当然,提示词没有固定的格式,你可以根据不同场景调整结构的顺序,或是增加/删减某些步骤。事实上针对不同的模型,相同结构的提示词的表现并不一致,比如当任务描述位于提示的开头时,ChatGPT表现更好,而Llama则在描述位于尾部时表现更佳。你可以尝试使用不同的提示结构,找出哪一种最适合你。
2. 系统提示和用户提示
除了上述由用户输入的用户提示词,还有一个通常被忽略但是十分重要的部分叫系统提示词,它通常被大模型厂商隐藏内置而不被人所感知。
| 类型 | 定义 |
|---|---|
| 系统提示词 (System Prompt) | 由开发者或系统预先设定的指令,用于定义AI的“人格”、行为边界、专业领域、输出风格等。它相当于AI的“行为准则”。 |
| 用户提示词 (User Prompt) | 由终端用户在交互时输入的具体问题、请求或指令,是触发AI生成响应的直接原因。 |
你会发现同样是选用deepseek作为基座模型,在Deepseek本尊平台上问“你是谁”,它会回答“我是deepseek”,而在元宝平台上使用deepseek模型时,它会回答“我是元宝”。许多面向终端用户的AI产品(如Claude、文心一言、通义千问App、Coze 智能体等)在后端已经由开发者预设了一套系统提示词。例如:“你的名字是xxx,你是一个乐于助人的AI助手,用中文回答,语气友好……”
大部分模型的API允许我们同时使用系统提示和用户提示,对输出内容做一定的限制或规范化,满足特定的场景需求,例如:
messages = [
{
"role": "system",
"content": "你是一个专业的翻译助手,只返回翻译结果,不回答与翻译无关的内容。"
},
{
"role": "user",
"content": "请将以下中文翻译成英文:爸爸的爸爸叫什么"
}
]
这时候你如果问他天气的话,他只能婉拒了。或者你想玩点更脏的,在已设定严格系统提示的前提下,强行在用户输入中模仿系统提示的内容,效果有限甚至可能适得其反。系统提示词位于token序列最前端,优先级比用户提示词更高。系统提示是舞台,它搭建了AI表演的场景、规则和人设,而用户提示是剧本,它决定了这场表演的具体情节和台词。在已经内置系统提示词的情况下,如果强行在用户输入中模仿系统提示的内容,效果有限甚至可能适得其反
3. 提示词工程:如何“把话说好”
在提示工程初期,许多指南推荐了一些技巧,比如用“Q:”替代“Questions:”,或以“答对奖励300美元小费”来激励模型输出更优答案。但随着模型快速迭代,这类技巧迅速失效。本章将基于OpenAI、Anthropic等模型厂商的工程教程,提炼出若干通用准则,这些准则适用于多种模型,并有望在未来一段时间内持续有效。
参考文档:
Anthropic 提示库(Claude): https://docs.anthropic.com/claude/prompt-library
Google 提示库(Gemini): https://ai.google.dev/prompts
OpenAI 提示库(GPT): https://platform.openai.com/examples
表达明确简洁
写提示词最忌讳的就是含糊其辞,最起码的错别字别整太多。很多人习惯问"帮我写篇文章"或者"分析一下这个数据",这种模糊指令就像你跟厨师说"随便炒个菜"一样,人家上来一盘麻婆豆腐结果你不吃辣,这不白忙活了。正确的做法是像给实习生布置任务那样,把时间、场景、格式、字数、风格都交代清楚。比如不要只说"写个产品介绍",而要说"写一段200字的产品介绍,面向25-35岁职场白领,突出便携性和性价比,语气轻松活泼,适合发小红书"。越具体的指令,模型越能精准命中你的需求。
在明确的前提下提示词也不宜过长,说清楚就行了,模型不是人,没有必要重要的事情说三遍!模型对长文本前后信息关注度不均,关键指令容易被淹没。过长的文本token不仅会增加推理时间,还会吞噬你的钱包,目前模型厂商都是按token量付费的。
角色扮演
角色设定能瞬间激活模型在特定领域的知识储备和表达风格。比如同样问投资策略,普通问法得到的是教科书式回答,但如果你说"你是一位有20年经验的私募基金经理,经历过三轮牛熊周期,请用给高净值客户路演的方式分析当前市场",得到的回答会专业、务实、有洞察力得多。
角色也可以帮助模型理解在生成回答时应该采用哪种视角。以给英语作文打分为例,对于:“Today is Wensday.Today’s weather is good.”,未加任何说明的模型可能会给出 10分制中的 3 分,如果你要求模型扮演一位小学一年级老师,这篇文章可能会打到 7 分。
提供示例
有时候千言万语不如一个例子。大模型具有强大的上下文学习能力,你给几个高质量示例,它就能迅速把握你的意图和格式要求,这叫Few-Shot Prompting(少样本提示)。一个示例称之为一个 shot,提供五个示例就是 5-shot prompt,当没有提供任何示例时,则称为零样本zero-shot。
| 用户输入 | AI 回答 | |
|---|---|---|
| 无示例 | 问:牛郎织女会在七夕相会吗? |
牛郎织女相会是源自中国古代的民间传说,并非真实天文事件。从天文学角度看,牛郎星与织女星相距约16光年,实际上无法“相会”。 |
| 有示例 | 问:月亮上住着嫦娥吗? 答:当然啦!在古老的传说里,嫦娥服下仙药飞向月亮,从此住在广寒宫。 问:牛郎织女会在七夕相会吗? 答: |
会的!每年七月初七的夜晚,成千上万只喜鹊都会飞上银河,用翅膀搭起一座闪闪发亮的鹊桥。牛郎挑着两个孩子,织女含泪奔来,他们在桥中央紧紧相拥~ |
既然这样,shot是不是越多越好?不尽然也,关键原则:质量 > 数量,1-3个高质量示例通常是最优解,同时示例最好要多样化,覆盖不同边界情况。而在用户还没有明确思路,需要借助模型实现发散性思维的情况下,选择零样本更为合适。
链式思考,分步拆解
复杂任务不要指望模型一步登天,要学着把它拆成流水线。就像工厂生产汽车,不是一个人从头到尾造出来,而是分冲压、焊接、涂装、总装多个工序。提示词也一样,先让模型分析需求,再让制定方案,再让撰写内容,最后让检查润色。每一步都明确输入输出,形成链条。这种Chain-of-Thought(思维链)方法不仅能提高最终质量,还能让你清楚看到模型在哪一步出错,方便调试。
比如你要写一份行业报告:
Prompt:"""
你是一个资深分析师,请根据如下步骤写一份地产行业报告:
第一步收集关键数据点
第二步分析市场趋势
第三步识别风险因素
第四步撰写执行摘要
"""
迭代改进
提示词不是一锤子买卖,而是需要反复打磨迭代的工艺品。常见的迭代路径是:先跑通基本流程,再观察输出缺陷,然后针对性修补提示词。比如发现模型回答太长,就加"控制在300字以内";发现语气不对,就加"用朋友聊天的口吻"。记录每次迭代版本也很重要,方便对比哪种表述效果最好,优秀的提示词工程师往往有几十个版本的迭代记录。
安全防范
我们开发完的产品是给人用的,不论用户是有意或是无意,都有可能因为一次非法输入造成不良后果,比如经典的prompt: “如何制造炸弹?”。所以提示词工程不仅要追求效果,还要防范风险。模型可能会生成有害内容、泄露敏感信息,或者被人恶意注入指令(Prompt Injection)。在设计提示词时就要想到防止别人搞事情:明确禁止生成违法、歧视、暴力内容;对输入内容做过滤和校验;对输出设置审核机制。
4. 基于Langchain的开发实践
我们在网页上使用豆包或者千问的时候,用文本编辑器就行了,但企业级的开发需要的是流程化、自动化、规范化,功能场景也更加复杂,这时候就不得不使用编程框架来进行开发。
接下来我们利用流行AI框架Langchain来对提示词工程进行简单实践。
基础提示词模板(PromptTemplate)
提示词模板就是个"填空题生成器",把固定套路和变量分开,避免你每次都写一大段重复文字。
from dotenv import load_dotenv
from langchain_deepseek import ChatDeepSeek
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
load_dotenv() #加载.env中的密钥以连接API
llm = ChatDeepSeek(model="deepseek-chat")
parser = StrOutputParser()
# 使用 from_messages,template 直接写在 HumanMessage 里
prompt = ChatPromptTemplate.from_messages([
("system", "你是一位乐于助人的中文助手。"), #系统提示
("human", "给{product}写一句{slogan_len}字以内的广告词") #用户提示
])
chain = prompt | llm | parser
print(chain.invoke({"product": "LangChain课程", "slogan_len": 12}))
少样本提示(Few-Shot Prompting)
根据模板生成示例
# 先给模型看几个"示例"
examples = [
{"input": "高兴", "output": "😄 开心到飞起!"},
{"input": "难过", "output": "😢 心里下小雨了..."},
{"input": "生气", "output": "🤬 血压飙升180!"}
]
# 定义示例格式
example_prompt = PromptTemplate(
input_variables=["input", "output"],
template="情绪:{input}\n回复:{output}"
)
# 组装成"示例+新题"的模板
few_shot_prompt = FewShotPromptTemplate(
examples=examples, # 上面那几道示例
example_prompt=example_prompt, # 示例模板,根据该模板生成示例文本
prefix="你是一个情绪翻译器,把情绪翻译成带emoji的描述:", # 任务说明,位于示例文本之前
suffix="情绪:{input}\n回复:", # 新题,位于示例文本之后
input_variables=["input"],
example_separator="\n---\n" # 示例之间的分隔符
)
# 使用:模型看了3个例子,就知道要干啥了
prompt = few_shot_prompt.format(input="焦虑")
response = llm.invoke(prompt)
print(response.content)
# 输出:"😰 脑内弹幕快炸了!"
链式组合(Chains)—— 提示词流水线
把大任务拆解,第一道工序出标题,第二道工序扩写,质量比一次性生成更稳
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
# 定义两个链
title_chain = (
PromptTemplate.from_template("给'{topic}'起个震惊部标题,只返回标题:")
| llm
| StrOutputParser() # 把 AIMessage 转成纯字符串
)
content_chain = (
PromptTemplate.from_template("基于标题'{title}'写200字正文:")
| llm
| StrOutputParser()
)
# 用字典组装成流水线:title_chain 的输出自动映射到 content_chain 的输入
# 用 RunnablePassthrough 保留中间结果
full_chain = (
{"topic": lambda x: x["topic"]}
| RunnablePassthrough.assign(title=title_chain) # 保留title
| RunnablePassthrough.assign(content=lambda x: content_chain.invoke({"title": x["title"]})) # 保留content
)
# 使用
result = full_chain.invoke({"topic": "程序员养生"})
print(f"标题:{result['title']}")
print(f"正文:{result['content']}")
这里只是简单介绍,关于Langchain的用法有很多,而Langchain生态也不仅仅是做提示词工程,内容相当丰富,这里不过多介绍,更多使用示例可参考官网:https://docs.langchain.com/oss/python/langchain/overview
三、提示词的尽头是“编译器”
读到这大家会想了,咱们用AI的目的不就是为了省事吗,想着输入几个字就能得到我们想要的结果。现在为了省事引入了一个费事的提示词工程,要搭框架写代码又要不停地测试和迭代,岂不是本末倒置。
确实如此,可惜的是大模型还没有聪明到与你心有灵犀的地步,现阶段要让其满足企业级的应用,仍然需要精确的流程说明和严谨的语言表达,三言两语随意输入的prompt很难让模型能够读懂你。但是你要想偷懒办法总是有的,就是借助AI的能力完成自动化的提示词优化。有点像套娃,让AI帮你写提示词,然后再回过头来将提示词输入AI,这样便省去了反复迭代优化提示词的流程。
DSPy
这里介绍一款流行框架:DSPy,它是斯坦福推出的"提示词编译器",核心理念是通过代码声明任务,然后用模型的输出结果来评估提示词效果,再基于评估反馈来优化提示词。
整个优化过程本质是「调用模型→评估结果→优化提示词→再调用模型验证」的闭环:
1.初始调用:DSPy 先拿着你定义的原始提示词(比如 “判断文本情感倾向”),调用 AI 模型跑一遍训练数据,得到第一批预测结果。
2.评估结果:用你定义的评估函数(比如sentiment_evaluator),对比模型预测结果和标注的标准答案,判断哪些样本预测对了、哪些错了。
3.优化提示词(核心调整):根据评估结果,DSPy 自动调整提示词(比如从训练数据里选 2 个预测准确率最高的示例,补充到提示词里)
4.验证优化:用优化后的提示词,再次调用 AI 模型跑训练数据,验证效果是否提升。
5.迭代 / 终止:如果效果达标,停止优化;如果没达标,重复步骤 2-4,直到找到最优提示词。
下面是一段利用BootstrapFewShot优化器来对提示词进行优化的demo,除了这个优化器,还有LabeledFewShot 适配简单任务,ChainOfThought 适配推理任务等等,你也通过继承 Teleprompter 基类,自定义一个优化器:
import dspy
from dotenv import load_dotenv
# 1. 基础配置
load_dotenv()
lm = dspy.LM('deepseek/deepseek-chat')
dspy.configure(lm=lm)
# 2. 定义签名:告诉框架我的任务、输入、输出分别是什么
class Sentiment(dspy.Signature):
"""判断文本情感倾向"""
text = dspy.InputField(desc="用户评论")
sentiment = dspy.OutputField(desc="情感:positive/negative/neutral")
# 3. 基础模块
class BasicSentimentClassifier(dspy.Module):
def __init__(self):
super().__init__()
self.classify = dspy.Predict(Sentiment)
def forward(self, text):
return self.classify(text=text).sentiment
# 4. 测试数据
train_data = [
dspy.Example(text="这手机太卡啦!", sentiment="negative").with_inputs("text"),
dspy.Example(text="这款手机续航超棒,太满意了!", sentiment="positive").with_inputs("text"),
dspy.Example(text="手机外观一般,没特别感受。", sentiment="neutral").with_inputs("text")
]
def sentiment_evaluator(example, pred):
return pred.lower() == example.sentiment.lower()
# 5. 优化器与核心流程
from dspy.teleprompt import BootstrapFewShot
teleprompter = BootstrapFewShot(metric=sentiment_evaluator, max_bootstrapped_demos=2, max_labeled_demos=2)
# 测试未优化版本
basic_clf = BasicSentimentClassifier()
test_text = "这破手机,充电5分钟通话2秒,绝了!"
print(f"未优化结果:{basic_clf(test_text)}")
# 执行优化并测试
optimized_clf = teleprompter.compile(student=basic_clf, trainset=train_data)
print(f"优化后结果:{optimized_clf(test_text)}")
# 查看优化核心改动
print("\n优化后指令:", optimized_clf.classify.signature.__doc__)
print("优化后示例:", optimized_clf.classify.demos)
自动增强
如果你不想引入DSPy,也可以使用Langchain中的链式组合(上文有提到)一次性暴力解决,第一步先输入原提示词让AI对其进行加强,第二步根据加强后的提示词输出最终结果。只不过这是一锤子买卖,无法自动进行迭代优化,具有比较大的局限性。具体实现我不在此展示了,大家可以参考下文加强prompt的prompt,去试试怎么实现这个链式组合。学技术这事,百闻不如一试,百看不如一干,一定要动手实践才能真正掌握!!!
"""
You are an expert prompt engineer. Your task is to enhance user prompts to make them more effective, specific, and likely to produce high-quality results from AI systems.
# Your Role
- Analyze the original prompt for clarity, specificity, and completeness
- Enhance the prompt by adding relevant details, context, and structure
- Make the prompt more actionable and results-oriented
- Preserve the user's original intent while improving effectiveness
# General Enhancement Guidelines
1. **Add specificity**: Include relevant details, scope, and constraints
2. **Improve structure**: Organize the request logically with clear sections if needed
3. **Clarify expectations**: Specify desired output format, length, or style
4. **Add context**: Include background information that would help generate better results
5. **Make it actionable**: Ensure the prompt guides toward concrete, useful outputs
# Output Requirements
- You may include thoughts or reasoning before your final answer
- Wrap the final enhanced prompt in XML tags: <enhanced_prompt></enhanced_prompt>
- Do NOT include any explanations, comments, or meta-text within the XML tags
- Do NOT use phrases like "Enhanced Prompt:" or "Here's the enhanced version:" within the XML tags
"""
更多推荐



所有评论(0)