在 LangChain 中,提示词模板(Prompt Template) 是构建大模型应用的核心基石。
如果把大模型比作一个"极其聪明但没有记忆的员工",那么提示词模板就是一份标准化的"工作指南"。它将用户的动态输入与预设的指令、上下文、格式要求结合起来,确保大模型能输出高质量、符合预期的结果。
一、 为什么需要提示词模板?
- 逻辑与数据分离:你不需要在代码里硬编码复杂的提示语。你可以定义一个模板,只在运行时注入变量(如用户的问题、背景资料)。
- 复用性:同一个任务(如翻译、总结)的指令可以定义一次,多次使用。
- 角色注入:轻松为 AI 设定特定的身份(如"资深架构师"或"幽默诗人")。
- 标准化输出:配合前文提到的解析器,通过模板告知模型必须以 JSON 或特定格式返回。
二、 核心模板类型
LangChain 主要提供了两种模板,对应不同的模型接口:
1. PromptTemplate (普通模板)
用于传统的文本补全模型(LLMs),它只是一个简单的字符串模板。
python
from langchain.prompts import PromptTemplate
# 1. 定义模板字符串,使用 {variable} 作为占位符
template = "你是一位专业的{field}教练。请为我制定一个{duration}的训练计划。"
# 2. 实例化模板
prompt = PromptTemplate(
input_variables=["field", "duration"],
template=template
)
# 3. 填充变量生成最终提示词
final_prompt = prompt.format(field="马拉松", duration="三个月")
print(final_prompt)
# 输出: 你是一位专业的马拉松教练。请为我制定一个三个月的训练计划。
2. ChatPromptTemplate (对话模板) ------ 最常用
用于聊天模型(ChatModels)。它由一组具有不同角色的"消息"组成(System, Human, AI)。
python
from langchain.prompts import ChatPromptTemplate
# 定义多角色对话模板
chat_template = ChatPromptTemplate.from_messages([
("system", "你是一名{language}翻译官,负责将用户输入的中文翻译成{language}。"),
("human", "请翻译这段话:{text}"),
])
# 填充变量
messages = chat_template.format_messages(
language="法语",
text="今天天气真不错"
)
# 生成的结果是一组 Message 对象,可直接发送给 ChatOpenAI 或 Ollama
三、 进阶用法:少样本模板 (Few-Shot Prompting)
"少样本"是指给模型几个例子,让它模仿。这在处理复杂逻辑或特定风格时非常有效。
python
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
# 1. 准备示例
examples = [
{"input": "开心", "output": "像盛开的花朵一样灿烂"},
{"input": "难过", "output": "像阴雨连绵的深秋一样萧索"},
]
# 2. 定义示例的格式
example_prompt = PromptTemplate(
input_variables=["input", "output"],
template="词语: {input}\n比喻: {output}"
)
# 3. 构建少样本模板
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
suffix="词语: {user_input}\n比喻:", # 后缀,即用户的输入
input_variables=["user_input"]
)
print(few_shot_prompt.format(user_input="孤独"))
# 模型会模仿之前的风格生成关于"孤独"的比喻
四、 组合提示词 (Pipeline Prompt)
有时候提示词非常复杂,你可能希望把几个小模板组合成一个大模板。
- 场景:先设定身份,再引入背景知识,最后提出问题。
- 实现 :使用
PipelinePromptTemplate(由于篇幅,此处仅作概念介绍,它允许将基础模板插入到父模板的占位符中)。
五、 最佳实践技巧
-
部分填充 (Partial Formatting) : 如果你在程序开始时就知道某些变量(比如当前日期),而另一些变量(比如用户输入)要等会儿才知道,可以使用
partial。pythonpartial_prompt = prompt.partial(date="2024-05-20") # 稍后再填充剩下的变量 final_prompt = partial_prompt.format(user_query="你好") -
外部加载 : 为了保持代码整洁,可以将复杂的 Prompt 存储在
yaml或json文件中,通过 LangChain 加载。 -
LCEL 管道调用: 将模板直接放在链的最前端:
pythonchain = chat_template | model | output_parser chain.invoke({"language": "英语", "text": "吃了吗?"})
总结
提示词模板不仅仅是字符串拼接,它是 Prompt 工程的工程化实现。通过 LangChain 的模板系统,你可以:
- 结构化 地表达任务逻辑。
- 动态化 地注入实时数据。
- 模式化 地引导 AI 模仿特定行为。
掌握了 Prompt Template,你就掌握了控制大模型行为的"方向盘"。