【LangChain系列七】提示词模板与少样本提示:把 Prompt 工程玩出花
文章目录
【LangChain系列七】提示词模板与少样本提示:把 Prompt 工程玩出花
写 LangChain 的文章到了第七篇,该聊聊 Prompt 模板了。这块是 LangChain 里最基础也最实用的部分——毕竟大模型的质量,一半靠模型本身,一半靠你怎么问。
1. 最简单的模板:PromptTemplate
LangChain 提供了 PromptTemplate 类,用来创建文本提示模板。最常用的写法是 from_template:
from langchain_core.prompts import PromptTemplate
# 用 from_template 快速创建
template = PromptTemplate.from_template("请用{language}写一首关于{topic}的诗")
# invoke 传参调用
result = template.invoke({"language": "中文", "topic": "月亮"})
print(result)
输出就是一个填好参数的 StringPromptValue。简单直接,没什么花活。
你也可以用构造函数的方式,手动指定 input_variables:
template = PromptTemplate(
template="请用{language}写一首关于{topic}的诗",
input_variables=["language", "topic"]
)
效果一样,只是写法不同。个人更喜欢 from_template,少写点代码。
2. 聊天场景:ChatPromptTemplate
实际开发中,我们更多是在做多轮对话,这时候就需要 ChatPromptTemplate。它支持定义 system、user、ai 等不同角色的消息:
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个专业的{role},请用简洁的语言回答问题"),
("user", "{question}")
])
result = prompt.invoke({"role": "Python讲师", "question": "什么是装饰器?"})
print(result)
from_messages 接收一个元组列表,每个元组的第一个元素是角色,第二个是消息内容。支持的占位符有:
system— 系统指令user— 用户消息ai— 模型回复(用于 few-shot 场景)
把模板和模型串起来用,就是一条完整的链:
from langchain_openai import ChatOpenAI
model = ChatOpenAI()
chain = prompt | model
result = chain.invoke({"role": "Python讲师", "question": "什么是装饰器?"})
print(result.content)
这种 prompt | model 的链式写法是 LangChain 的核心模式,后面会反复用到。
3. 消息占位符:MessagesPlaceholder
有时候你想在模板里预留一个位置,运行时动态插入一组消息。比如实现多轮对话时,需要把历史消息塞进去。这时候用 MessagesPlaceholder:
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有帮助的助手"),
MessagesPlaceholder("history"),
("user", "{input}")
])
MessagesPlaceholder("history") 就是一个占位符,调用时往 history 里传消息列表:
from langchain_core.messages import HumanMessage, AIMessage
history = [
HumanMessage(content="你好"),
AIMessage(content="你好!有什么可以帮你的?")
]
result = prompt.invoke({
"history": history,
"input": "帮我写个Python脚本"
})
这个在做聊天机器人时特别有用,把历史对话记录塞进去,模型就能"记住"上下文了。
4. LangChain Hub:提示词仓库
写得好的 Prompt 想复用?或者想看看别人怎么写的?LangChain Hub 就是干这个的。
它是一个提示词的在线仓库,你可以上传、浏览、拉取模板。使用前需要配置 LANGSMITH_API_KEY。
from langchain import hub
# 从 Hub 拉取模板
prompt = hub.pull("hwchase17/openai-tools-agent")
# 拉取特定版本
prompt = hub.pull("hwchase17/openai-tools-agent:latest")
也可以上传自己的模板:
from langchain import hub
hub.push("your-namespace/my-prompt", prompt)
实际开发中,Hub 更多是用来参考别人怎么写 Prompt 的,直接用的场景不算多。但了解一下没坏处,万一哪天想复用别人的优质模板呢。
5. 少样本提示:FewShotChatMessagePromptTemplate
少样本提示(Few-shot)是提升模型输出质量的利器——给模型几个"输入→输出"的例子,它就能更好地理解你想要什么格式和风格。
手动写 few-shot 的话,你得自己组装一堆消息列表,比较繁琐。LangChain 提供了 FewShotChatMessagePromptTemplate 来简化这件事:
from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
# 1. 定义样例
examples = [
{"input": "苹果", "output": "🍎"},
{"input": "太阳", "output": "☀️"},
{"input": "星星", "output": "⭐"},
]
# 2. 定义每个样例的消息模板
example_prompt = ChatPromptTemplate.from_messages([
("human", "{input}"),
("ai", "{output}")
])
# 3. 组装 few-shot 模板
few_shot_prompt = FewShotChatMessagePromptTemplate(
example_prompt=example_prompt,
examples=examples
)
# 4. 最终提示词
final_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个表情符号转换器,把中文词语转换成对应的表情符号"),
few_shot_prompt,
("user", "{input}")
])
# 调用
result = final_prompt.invoke({"input": "开心"})
print(result)
这样生成的消息列表里,会自动把 examples 按照 example_prompt 的格式展开成一组对话消息,插到你指定的位置。
比起手动拼消息列表,这种方式代码更清晰,维护也方便——改 examples 数组就行。
6. 几个实用技巧
模板里可以混用普通文本和消息模板:
prompt = ChatPromptTemplate.from_messages([
("system", "你是{role}"),
MessagesPlaceholder("history"),
("user", "{input}")
])
# 也可以用模板字符串
prompt = ChatPromptTemplate.from_template(
"你是一个{role}。请回答:{question}"
)
部分填充(partial): 有些参数你想提前固定,运行时只传剩下的:
prompt = ChatPromptTemplate.from_messages([
("system", "你是{role}"),
("user", "{input}")
])
# 预设 role
partial_prompt = prompt.partial(role="Python专家")
# 调用时只传 input
result = partial_prompt.invoke({"input": "解释列表推导式"})
小结
这篇文章覆盖了 LangChain 里提示词模板的核心用法:
- PromptTemplate — 纯文本模板,适合单轮简单场景
- ChatPromptTemplate — 聊天消息模板,支持多角色
- MessagesPlaceholder — 动态插入消息列表,做多轮对话必备
- FewShotChatMessagePromptTemplate — 少样本提示的标准化写法
- LangChain Hub — 提示词的在线仓库
模板写好了,后面串链、做 RAG、搞 Agent 都离不开它们。
觉得有帮助的话,点个赞👍收藏⭐支持一下吧!
更多推荐

所有评论(0)