【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 都离不开它们。

觉得有帮助的话,点个赞👍收藏⭐支持一下吧!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐