系列文章目录

白话大模型增强技术系列之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
"""
Logo

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

更多推荐