事无巨细,提示词模板这块松哥也和大家做一个详细介绍。
本文基于 langchain。
什么样的提示词算优秀?
松哥的经验是四点:
立角色就是指定回答者的身份(如专家、教师、程序员),提升专业性。
这个好理解,讲明白你的问题产生背景,你的具体问题。
问题要足够具体,最好能够结构化输出,这样模型也会结构化回答。
举个简单的例子:
告诉 AI 你的需求,以及你希望完成的目标。
补充要求,告诉 AI 回答的注意事项,以及限制条件,也可以给出回答示例。
举个简单例子:
老实说,这些点其实都很简单,甚至有些幼稚。但是!!!网上铺天盖地的提示词课程,已经说明了这个问题虽然简单,还是有很多人不懂。一个简单的例子,前后端同事接口联调的时候,无论哪方出问题了,另一方能否一次性把问题讲明白?如果能,我相信他和 AI 对话也会做的很好;如果不能,那么他和 AI 对话估计也会差点意思。
通过占位符 {} 动态插入变量,生成标准提示词。
适用场景:单一变量替换的简单提示。
from langchain.prompts import PromptTemplate
# 定义模板
template = "请用{style}风格写一篇关于{topic}的200字短文。"
prompt = PromptTemplate(
input_variables=["style", "topic"], # 声明变量
template=template
)
# 填充变量
result = prompt.format(style="幽默", topic="人工智能")
print(result)
输出:

同时处理多个变量,支持复杂逻辑组合。
适用场景:需要多条件控制的提示生成。
template = """你是一名{role},请完成以下任务:
1. 分析用户需求:{demand}
2. 生成{output_type},要求语言为{language}
附加条件:{condition}"""
prompt = PromptTemplate(
input_variables=["role", "demand", "output_type", "language", "condition"],
template=template
)
result = prompt.format(
role="数据科学家",
demand="预测下季度销售额",
output_type="分析报告",
language="中文",
condition="使用时间序列模型"
)
print(result)
输出:

从外部文件读取模板,实现代码与内容分离。
适用场景:需要频繁修改模板的场景。
步骤1:创建 story_prompt.txt 文件:
根据以下元素生成故事:
- 地点:{location}
- 角色:{characters}
- 冲突:{conflict}
要求:{requirements}
步骤2:代码加载模板:
with open(file="story_prompt.txt", mode="r",encoding="UTF-8") as f:
template = f.read()
prompt = PromptTemplate(
input_variables=["location", "characters", "conflict", "requirements"],
template=template
)
result = prompt.format(
location="火星殖民地",
characters="AI机器人与人类工程师",
conflict="氧气供应系统故障",
requirements="包含技术细节和人性化描写"
)
print(result)
输出:

预先填充部分变量,延迟填充剩余变量。
适用场景:需要分阶段构建提示的流程。
from langchain.prompts import PromptTemplate
template = "在{platform}平台,为{product}撰写广告文案,突出卖点:{selling_points}"
prompt = PromptTemplate.from_template(template)
# 预填充平台和产品
partial_prompt = prompt.partial(platform="抖音", product="智能手表")
final_prompt = partial_prompt.format(selling_points="健康监测、超长续航")
print(final_prompt)
输出:

结合示例数据生成教学式提示。
适用场景:需要示例引导模型输出的场景。
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
# 示例数据集
examples = [
{"query": "太阳质量", "answer": "1.989×10³⁰ kg"},
{"query": "地球半径", "answer": "6371 km"}
]
# 单个示例模板
example_template = """
问题:{query}
答案:{answer}
"""
example_prompt = PromptTemplate(
input_variables=["query", "answer"],
template=example_template
)
# 组合Few-shot模板
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix="请根据示例回答科学问题",
suffix="问题:{input}\n答案:",
input_variables=["input"]
)
result = few_shot_prompt.format(input="月球引力")
print(result)
输出:

通过拼接多个模板生成复杂提示。
适用场景:需要模块化构建的大型提示系统。
base_template = """你是一位{expert_type}专家,需要完成以下任务:"""
detail_template = """
任务详情:
{task_description}
技术约束:
{constraints}
"""
full_template = base_template + detail_template
prompt = PromptTemplate(
input_variables=["expert_type", "task_description", "constraints"],
template=full_template
)
result = prompt.format(
expert_type="网络安全",
task_description="设计企业级防火墙策略",
constraints="1. 支持IPv6 2. 吞吐量≥10Gbps"
)
print(result)
输出:

snake_case 命名变量(如 user_name)try/except 包裹 format() 调用functools.lru_cache)很明显,这个是针对聊天场景的提示词模板。
使用不同角色的消息模板(系统、用户、助手)构建对话结构。
适用场景:创建包含多角色消息的标准聊天提示。
from langchain.prompts import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
AIMessagePromptTemplate
)
# 定义各角色消息模板
system_template = SystemMessagePromptTemplate.from_template(
"你是一位{role},用{language}回答问题"
)
human_template = HumanMessagePromptTemplate.from_template("问题:{question}")
ai_template = AIMessagePromptTemplate.from_template("答案草稿:{draft}")
# 组合成聊天模板
chat_prompt = ChatPromptTemplate.from_messages([
system_template,
human_template,
ai_template
])
# 填充变量
messages = chat_prompt.format_messages(
role="历史学家",
language="白话文",
question="秦始皇统一六国的时间",
draft="初步推测为公元前3世纪"
)
print(messages)
输出:

使用 MessagesPlaceholder 插入对话历史上下文。
适用场景:需要维护多轮对话的场景。
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.schema import HumanMessage, AIMessage
# 定义包含历史记录的模板
chat_prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template("你是数学辅导AI"),
MessagesPlaceholder(variable_name="history"),
HumanMessagePromptTemplate.from_template("用户问题:{input}")
])
# 模拟历史对话
history = [
HumanMessage(content="3的平方是多少?"),
AIMessage(content="答案是9"),
HumanMessage(content="再加5呢?"),
AIMessage(content="答案是14")
]
# 填充当前问题
messages = chat_prompt.format_messages(
history=history,
input="现在乘以2是多少?"
)
print(messages)
输出:

通过示例对话指导模型输出格式。
适用场景:需要示例引导回答风格的场景。
from langchain.prompts import (
ChatPromptTemplate,
HumanMessagePromptTemplate,
AIMessagePromptTemplate
)
# 创建示例模板
example_template = ChatPromptTemplate.from_messages([
HumanMessagePromptTemplate.from_template("{user_example}"),
AIMessagePromptTemplate.from_template("{ai_example}")
])
# 组合完整模板
few_shot_prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template("你是一个茶艺专家"),
example_template,
HumanMessagePromptTemplate.from_template("用户提问:{input}")
])
# 填充数据
messages = few_shot_prompt.format_messages(
user_example="如何泡绿茶?",
ai_example="1. 取3g茶叶\n2. 80℃水冲泡\n3. 等待2分钟",
input="如何冲泡普洱茶?"
)
print(messages)
输出:

提前固定部分参数,动态填充剩余参数。
适用场景:需要复用基础配置的场景。
from langchain.prompts import ChatPromptTemplate
# 基础模板
base_prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template("你是{company}的客服"),
HumanMessagePromptTemplate.from_template("用户反馈:{feedback}")
])
# 预填充公司名称
partial_prompt = base_prompt.partial(company="华为公司")
# 填充剩余变量
messages = partial_prompt.format_messages(
feedback="订单号1234未收到货物"
)
print(messages)
输出:

from langchain.prompts import ChatPromptTemplate,SystemMessagePromptTemplate,HumanMessagePromptTemplate
role_selector = {
"tech": "技术专家",
"child": "幼儿园老师"
}
prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template(
"你是一个{role},用{level}语言回答"
),
HumanMessagePromptTemplate.from_template("{question}")
])
messages = prompt.format_messages(
role=role_selector["child"],
level="童趣易懂",
question="为什么天空是蓝色的?"
)
print(messages)

就这些玩法~
总结下,ChatPromptTemplate 的核心优势在于:
在实际应用场景中,我们还可以在如上两种模板基础之上,自定义提示词模板。自定义模板,就可以实现参数校验等等不同的逻辑。
假设我现在有这样一个需求,我希望传入一个函数名,系统能够据此读取出函数的内容,并给出解释。
那么我的代码如下:
from langchain.prompts import StringPromptTemplate
from langchain_openai import ChatOpenAI
import inspect
llm = ChatOpenAI(
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
openai_api_key="sk-xxx",
model_name="qwen-max-2025-01-25",
temperature=0
)
def hello():
print("hello javaboy")
return "hello ai"
PROMPT_TEMP = """你是一个经验丰富的python程序员,现在给你如下函数名称,你会按照如下格式,输出这段代码的名称、源码以及中文解释。
函数名称:{function_name}
源代码:{source_code}
代码解释:
"""
class CustomPrompt(StringPromptTemplate):
def format(self,**kwargs)-> str:
source_code=inspect.getsource(kwargs["function_name"])
prompt=PROMPT_TEMP.format(
function_name=kwargs["function_name"].__name__,
source_code=source_code
)
return prompt
cp = CustomPrompt(input_variables=["function_name"])
pm = cp.format(function_name=hello)
message = llm.invoke(pm)
print(message.content)
最终执行结果如下:

另外,Python 里边还提供了两种模板,这个小伙伴们可以自行了解下,有 Java 基础这个应该很好懂:
通过将提示词分解为 策略层 → 逻辑层 → 执行层 的三层架构,实现复杂任务的模块化控制。其设计原理类似于我们 Java 的 MVC 分层模式:
层级 | 作用 | 控制颗粒度 | 修改频率 |
|---|---|---|---|
策略层 | 定义任务目标与边界 | 宏观 | 低 |
逻辑层 | 控制推理流程与规则 | 中观 | 中 |
执行层 | 实现具体操作步骤 | 微观 | 高 |
定义任务目标和整体约束,相当于「需求文档」。
strategy_prompt = """
角色:资深市场分析师
核心任务:生成{industry}行业季度分析报告
目标受众:企业高管
核心要求:
1. 包含TOP3趋势预测
2. 必须引用至少{data_sources}个权威数据源
3. 风险分析部分占比≥20%
禁用内容:{forbidden_topics}
输出格式:Markdown"""
控制分析流程和推理规则,相当于「算法流程图」。
logic_prompt = """
执行流程:
1. 【数据收集】
- 从以下渠道获取信息:
{data_channels}
- 验证数据时效性(≥2023年)
2. 【趋势分析】
IF 发现新兴技术相关数据 THEN
使用Gartner技术成熟度曲线分析
ELSE
采用PEST模型
3. 【风险评估】
根据{risk_framework}框架分级
必须包含:
- 政策风险
- 供应链风险量化表"""
# 可配置参数
config = {
"data_channels": ["行业白皮书", "上市公司财报", "国家统计局"],
"risk_framework": "COSO ERM"
}
具体操作步骤和格式规范,相当于「代码实现」。
execution_prompt = """
生成步骤:
[1] 标题:
- 行业名称+季度+「发展趋势与挑战分析」
- 示例:2023Q4人工智能行业发展趋势与挑战分析
[2] 正文结构:
## 一、核心趋势
- 趋势1(数据支撑:{quote_style})
- 趋势2(对比去年同期变化)
## 二、风险评估
| 风险类型 | 概率 | 影响 | 缓解措施 |
|----------|------|------|----------|
## 三、建议方案
- 短期(1年内):{action_verbs}
- 长期:技术路线图建议
格式规范:
- 数据引用格式:[来源](链接)
- 风险概率使用★符号(1-5个)
- 禁止使用第一人称"""
# 微调参数
style_config = {
"quote_style": "脚注编号引用",
"action_verbs": ["优化", "并购", "生态合作"]
}
def generate_report(industry):
# 策略层初始化
strategy = strategy_prompt.format(
industry=industry,
data_sources=5,
forbidden_topics=["未公开并购信息"]
)
# 逻辑层配置
logic = logic_prompt.format(**config)
# 执行层定制
execution = execution_prompt.format(**style_config)
# 组装完整提示
full_prompt = f"""
{strategy}
------------------------
{logic}
------------------------
{execution}
"""
# 调用大模型
return llm.invoke(full_prompt)
# 执行生成
report = generate_report("新能源电池")
假设使用传统单层提示:
# 单层提示的典型问题:
monolithic_prompt = """
你是一个市场分析师,需要生成新能源电池行业报告,包含趋势预测和风险分析,
用Markdown格式,数据要来自权威来源,记得分析政策风险,不要用第一人称,
还要...(所有细节混在一起)
"""
这种提示词存在几个问题:
通过三层架构设计,可使复杂提示词的维护成本降低约 60%(根据 Anthropic 2023 年工程实践数据),同时生成质量稳定性提升 2-3 倍。这种设计尤其适合需要长期迭代的 AI 应用场景。
1. 安装依赖:
pip install pyyaml langchain
2. 示例 YAML 文件 (prompts/config.yaml):
# 基础提示模板
basic_prompt:
input_variables: ["adjective", "content"]
template: |
用{adjective}的风格描述以下内容:
{content}
# 多角色对话模板
chat_prompt:
messages:
- role: system
content: 你是一位{expert_type}专家
- role: human
content: 请解释{concept}
功能:加载简单文本模板
from langchain.prompts import PromptTemplate
import yaml
def load_yaml_prompt(file_path, prompt_name):
with open(file=file_path, mode='r',encoding='UTF-8') as f:
config = yaml.safe_load(f)
prompt_config = config[prompt_name]
return PromptTemplate(
input_variables=prompt_config['input_variables'],
template=prompt_config['template']
)
# 使用示例
prompt = load_yaml_prompt('prompts/prompt-01.yaml', 'basic_prompt')
result = prompt.format(adjective="幽默", content="量子物理")
print(result)
输出:

功能:加载多角色对话配置
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate
import yaml
def load_chat_prompt(file_path, prompt_name):
with open(file=file_path, mode='r',encoding='UTF-8') as f:
config = yaml.safe_load(f)
chat_config = config[prompt_name]['messages']
messages = []
for msg in chat_config:
if msg['role'] == 'system':
messages.append(SystemMessagePromptTemplate.from_template(msg['content']))
elif msg['role'] == 'human':
messages.append(HumanMessagePromptTemplate.from_template(msg['content']))
return ChatPromptTemplate.from_messages(messages)
# 使用示例
chat_prompt = load_chat_prompt('prompts/prompt-01.yaml', 'chat_prompt')
messages = chat_prompt.format_messages(
expert_type="人工智能",
concept="机器学习"
)
for msg in messages:
print(f"{msg.type}: {msg.content}")
输出:

功能:实现模板的层次化继承
YAML 配置 (advanced_prompt.yaml):
base_prompt:
template: "基础内容:{base_content}"
extended_prompt:
inherits: base_prompt
adds:
- template: "\n扩展内容:{extended_content}"
实现代码:
def load_inherited_prompt(file_path, prompt_name):
with open(file=file_path, mode='r',encoding='UTF-8') as f:
config = yaml.safe_load(f)
current_config = config[prompt_name]
full_template = ""
# 处理继承
if 'inherits' in current_config:
parent = load_inherited_prompt(file_path, current_config['inherits'])
full_template += parent.template
# 添加当前模板
full_template += current_config.get('template', '')
# 处理追加内容
for addition in current_config.get('adds', []):
full_template += addition['template']
return PromptTemplate.from_template(full_template)
# 使用示例
prompt = load_inherited_prompt('prompts/advanced_prompt.yaml', 'extended_prompt')
result = prompt.format(base_content="基础部分", extended_content="扩展部分")
print(result)
输出:

当然,利用 Python 对 JSON、TXT 等不同格式文件的读取能力,我们一样也可以将提示词管理在这些格式的文件中。
在大语言模型(LLM)应用开发中,当提示词(Prompt)中包含大量示例时,可能会超出模型的上下文窗口限制(如 GPT-4 的 128K token 限制)。直接截断示例会导致信息缺失,而固定数量的示例则无法灵活适应不同长度的输入。
LengthBasedExampleSelector 的作用是 动态调整示例数量:
生成中文词语的反义词,根据输入长度动态选择示例数量。
import os
os.environ["OPENAI_API_KEY"] = "your_api_key" # 替换为实际API密钥
from langchain.prompts import PromptTemplate, FewShotPromptTemplate
from langchain.prompts.example_selector import LengthBasedExampleSelector
# 1. 定义示例集(中文反义词)
examples = [
{"input": "高兴", "output": "悲伤"},
{"input": "高大", "output": "矮小"},
{"input": "明亮", "output": "昏暗"},
{"input": "温暖", "output": "寒冷"},
{"input": "快速", "output": "缓慢"}
]
# 2. 创建示例格式化模板
example_template = """
原词:{input}
反义:{output}
"""
example_prompt = PromptTemplate(
input_variables=["input", "output"],
template=example_template
)
# 3. 初始化LengthBasedExampleSelector
example_selector = LengthBasedExampleSelector(
examples=examples,
example_prompt=example_prompt,
max_length=30, # 格式化后提示词的最大长度(含输入)
get_text_length=lambda x: len(x) # 默认按字符数计算长度
)
# 4. 构建动态提示模板
dynamic_prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
prefix="根据输入生成对应的中文反义词:",
suffix="原词:{query}\n反义:",
input_variables=["query"],
example_separator="\n"
)
# 测试不同输入长度下的示例选择
short_query = "开心"
long_query = "这是一个非常非常长的输入句子,用来演示当输入内容过长时示例数量如何减少"
print("短输入时的提示词:\n", dynamic_prompt.format(query=short_query))
print("\n长输入时的提示词:\n", dynamic_prompt.format(query=long_query))

参数 | 作用 | 默认值 |
|---|---|---|
max_length | 格式化后提示词的最大字符数(含输入内容) | 必填 |
get_text_length | 自定义长度计算逻辑(如按 token 数计算) | len(text) |
example_prompt | 控制单个示例的格式化方式 | 必填 |
在自然语言处理任务中,传统相似度检索可能返回高度重复的相似结果。例如在构建反义词提示词模板时,若直接选择前 k 个最相似示例,可能得到多个同类型词汇(如多个情绪类词汇),而无法覆盖其他语义类别。
MMR 算法通过平衡相关性与多样性解决此问题,其核心公式为:
MMR = argmax [λ * sim1(Q,D) - (1-λ) * max sim2(D,R)]
其中 sim1 衡量与问题的相关性,sim2 衡量与已选结果的冗余度,λ 参数控制多样性权重(默认 0.5)。
from langchain.prompts import PromptTemplate, FewShotPromptTemplate
from langchain_community.embeddings import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.prompts.example_selector import MaxMarginalRelevanceExampleSelector
from langchain_community.embeddings import QianfanEmbeddingsEndpoint
os.environ["QIANFAN_AK"] = "xxx"
os.environ["QIANFAN_SK"] = "xxx"
# 步骤1:定义示例数据集
examples = [
{"input": "happy", "output": "sad"}, # 情绪类
{"input": "tall", "output": "short"}, # 尺寸类
{"input": "sunny", "output": "gloomy"}, # 天气类
{"input": "hard", "output": "soft"}, # 质地类
{"input": "fast", "output": "slow"} # 速度类
]
# 步骤2:创建MMR选择器
example_selector = MaxMarginalRelevanceExampleSelector.from_examples(
examples=examples,
embeddings=QianfanEmbeddingsEndpoint(), # 使用OpenAI文本嵌入模型
vectorstore_cls=FAISS, # 向量存储库类型
k=3, # 最终选择3个示例
fetch_k=10 # 预筛选10个候选
)
# 步骤3:构建提示词模板
example_prompt = PromptTemplate(
input_variables=["input", "output"],
template="输入词: {input}\n反义词: {output}"
)
mmr_prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
prefix="请根据以下示例生成反义词:",
suffix="输入词: {query}\n反义词:",
input_variables=["query"]
)
# 测试不同查询的示例选择
print(mmr_prompt.format(query="light"))
# 可能输出包含hard/soft(质地)、fast/slow(速度)等跨类别示例

参数 | 说明 |
|---|---|
k | 最终返回的示例数量(建议 3-5) |
fetch_k | 预筛选候选集大小(需 ≥k) |
lambda_mult | 多样性权重(0-1,默认 0.5。值越大相关性越重要,值越小多样性越优先) |
当查询词为 "energetic" 时:
[happy/sad, sunny/gloomy, windy/calm] # 均为情绪/天气类
[energetic/lethargic, tall/short, hard/soft] # 跨情绪、尺寸、质地类别
text-embedding-3-large 等高维模型提升区分度在 RAG(检索增强生成)场景中,提示词工程需要根据用户输入动态选择最相关的知识库示例。最大余弦相似度通过计算向量空间中文本的语义相似性,可有效筛选与当前问题最匹配的参考示例,从而提升生成结果的质量。
余弦相似度的核心原理是将文本映射为高维向量(如 1536 维),通过向量夹角的余弦值衡量语义相似性。当值为 1 时表示语义完全一致,0 表示无关,-1 则完全相反。
本案例需要首先安装 chromadb 依赖:
pip install langchain-openai chromadb
构建反义词生成系统,根据输入词语动态选择最相关的示例构建提示词模板。
from langchain_core.prompts import (
FewShotPromptTemplate,
PromptTemplate
)
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import QianfanEmbeddingsEndpoint
from langchain_core.example_selectors.semantic_similarity import SemanticSimilarityExampleSelector
# 1. 初始化Embedding模型(需替换为实际API密钥)
os.environ["QIANFAN_AK"] = "xxx"
os.environ["QIANFAN_SK"] = "xxx"
embeddings = QianfanEmbeddingsEndpoint()
# 2. 定义示例数据集
examples = [
{"input": "happy", "output": "sad"},
{"input": "tall", "output": "short"},
{"input": "energetic", "output": "lethargic"},
{"input": "sunny", "output": "gloomy"},
{"input": "windy", "output": "calm"},
]
# 3. 创建示例选择器(保留最相似的2个示例)
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples=examples,
embeddings=embeddings,
vectorstore_cls=Chroma, # 使用Chroma向量数据库
k=2 # 选择相似度TOP2的示例
)
# 4. 构建动态提示词模板
example_prompt = PromptTemplate(
input_variables=["input", "output"],
template="输入词: {input}\n反义词: {output}"
)
dynamic_prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
prefix="根据以下示例生成反义词:",
suffix="输入词: {query}\n反义词:",
input_variables=["query"]
)
# 5. 测试不同输入
print("--- 输入'tall'时的提示词 ---")
print(dynamic_prompt.format(query="tall"))
# 输出包含与"tall"相似度最高的2个示例(如"tall→short"和"happy→sad")
print("\n--- 输入'sunny'时的提示词 ---")
print(dynamic_prompt.format(query="sunny"))
# 输出包含"sunny→gloomy"及相似度次高的示例(如"windy→calm")

k=2 参数确保每次选择相似度最高的前 2 个示例构建上下文。好啦,提示词就和大伙聊这些。本文中的所有代码案例均可以直接运行。