LangChain PromptTemplate 提示词模板入门教程
时间:2026-07-26 | 作者:白桃企划师 | 阅读:0上一期咱们把 LangChain 的基础环境搭好,成功跑了一个示例。
今天继续深入,聊聊 LangChain 的核心模块之一:PromptTemplate(提示词模板)。
跟大模型聊天的时候,直接把原始输入丢过去通常不是个好主意。得先做点包装、组织、格式化的工作。这么做的目的——让意图更清晰,让模型能更好地理解你的意思。
这套结构化的玩法,就是 LangChain 里的提示词模板(PromptTemplate)。对于 LLM 应用来说,Prompt 写得好,项目就成功了一半。今天咱们就好好掰扯掰扯提示词模板怎么用、有哪些技巧。
一、提示词模板分类
LangChain 提供了好几种提示词模板。下面挑几个常用的来说:
- PromptTemplate:文本生成模型专用,用字符串拼接变量来生成提示词。简单粗暴,但也最基础。
- ChatPromptTemplate:聊天模型专用,比如
gpt-3.5-turbo、gpt-4这些,支持多轮对话的消息结构。 - HumanMessagePromptTemplate:人类消息模板。
- SystemMessagePromptTemplate:系统消息模板。
- FewShotPromptTemplate:少样本示例模板,自动把多个示例拼到提示词里。比如:1+1=2,2+2=4,然后让模型算5+5等于多少。
二、提示词模板用法
2.1 PromptTemplate 文本提示词模板
PromptTemplate 是专门给文本生成模型用的,也是 LangChain 最基础的模板。它的思路很简单:定义一个带变量的字符串模板,调用 invoke 时把变量填进去,就得到最终的提示词。
看个例子就明白了:
from langchain_core.prompts import PromptTemplate
prompt = PromptTemplate.from_template("你是一个专业的律师,请你回答我提出的法律问题,并给出法律条文依据,我的问题是:{question}")
prompt_value = prompt.invoke({"question": "婚姻法是在哪一年颁布的?"})
print(prompt_value)
执行结果:
text='你是一个专业的律师,请你回答我提出的法律问题,并给出法律条文依据,我的问题是:婚姻法是在哪一年颁布的?'
2.2 ChatPromptTemplate 聊天消息提示词模板
ChatPromptTemplate 专门为聊天模型(如 gpt-3.5-turbo、gpt-4)设计,支持构造多轮对话的消息结构,每条消息可以指定角色(系统、用户、AI)。
下面这个例子,模板里包含两条消息:第一条是系统消息,不需要变量渲染;第二条是用户消息,需要把 question 变量填进去。
from langchain_core.prompts import ChatPromptTemplate
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个资深的Python应用开发工程师,请认真回答我提出的Python相关的问题,并确保没有错误"),
("human", "请写一个Python程序,关于{question}")
])
print(chat_prompt.invoke({"question": "冒泡排序"}))
执行结果:
messages=[SystemMessage(content='你是一个资深的Python应用开发工程师,请认真回答我提出的Python相关的问题'), HumanMessage(content='请写一个Python程序,关于冒泡排序')]
2.3 Prompt 三个常用方法区别
刚才的代码里用了 invoke。其实除了 invoke,还有 format 和 partial 也能格式化模板。它们仨有什么区别呢?直接看——
- format:把模板格式化成字符串。
- partial:只格式化部分变量,返回一个新的模板,可以继续格式化。
- invoke:把模板格式化成
PromptValue对象。
format() 用法如下,把 question 参数填进去,返回一个字符串:
from langchain_core.prompts import ChatPromptTemplate
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个资深的Python应用开发工程师,请认真回答我提出的Python相关的问题,并确保没有错误"),
("human", "请写一个Python程序,关于{question}")
])
print(chat_prompt.format(question="冒泡排序"))
执行结果:
System: 你是一个资深的Python应用开发工程师,请认真回答我提出的Python相关的问题,并确保没有错误
Human: 请写一个Python程序,关于冒泡排序
partial() 用法如下,可以只格式化部分变量,返回一个模板,后面再填剩下的变量:
from datetime import datetime
from langchain_core.prompts import ChatPromptTemplate
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个资深的Python应用开发工程师,请认真回答我提出的Python相关的问题,并确保没有错误"),
("system", "当前时间是:{currentTime}"),
("human", "请写一个Python程序,关于{question}")
]).partial(currentTime=datetime.now())
print(chat_prompt.invoke({"question": "写一个插入排序"}).to_string())
执行结果:
System: 你是一个资深的Python应用开发工程师,请认真回答我提出的Python相关的问题,并确保没有错误
System: 当前时间是:2025-07-19 09:37:38.084382
Human: 请写一个Python程序,关于写一个插入排序
2.4 MessagesPlaceholder 消息占位符
有些场景下,我们不确定消息什么时候生成,也不确定要插几条消息——比如聊天历史记忆。这时候可以用 MessagesPlaceholder 占位符,在 invoke 时往里面塞消息。
prompt = ChatPromptTemplate.from_messages([
MessagesPlaceholder("memory"),
SystemMessage("你是一个资深的Python应用开发工程师,请认真回答我提出的Python相关的问题"),
("human", "{question}")
])
prompt_value = prompt.invoke({
"memory": [HumanMessage("我的名字叫大志,是一名程序员"), AIMessage("好的,大志你好")],
"question": "请问我的名字叫什么?"
})
print(prompt_value.to_string())
执行结果:
Human: 我的名字叫大志,是一名程序员
AI: 好的,大志你好
System: 你是一个资深的Python应用开发工程师,请认真回答我提出的Python相关的问题
Human: 请问我的名字叫什么?
还有一种隐式写法,用 ("placeholder", "{memory}") 代替 MessagesPlaceholder:
prompt = ChatPromptTemplate.from_messages([
("placeholder", "{memory}"),
SystemMessage("你是一个资深的Python应用开发工程师,请认真回答我提出的Python相关的问题"),
("human", "{question}")
])
prompt_value = prompt.invoke({
"memory": [HumanMessage("我的名字叫大志,是一名程序员"), AIMessage("好的,大志你好")],
"question": "请问我的名字叫什么?"
})
print(prompt_value.to_string())
执行结果和上面一样:
Human: 我的名字叫大志,是一名程序员
AI: 好的,大志你好
System: 你是一个资深的Python应用开发工程师,请认真回答我提出的Python相关的问题
Human: 请问我的名字叫什么?
2.5 PromptValue 提示值
PromptValue 是调用 invoke() 后返回的中间对象。它能把提示词转成字符串或消息列表,方便适配不同 LLM 的输入要求。主要包含两个方法:
- to_string:转成字符串。
- to_messages:转成消息列表。普通的
PromptValue调用这个方法会把整个字符串包装成一条人类消息;而ChatPromptValue(它是PromptValue的子类)会返回完整的消息列表,包括系统、人类、AI 消息等。
这个中间对象的存在意义在于:聊天模型需要消息列表,文本生成模型需要字符串。PromptValue 可以自由转换,接口一致,逻辑清晰,维护起来也方便。
2.6 加号连接提示词模板
PromptTemplate 重载了 + 号运算符,所以你可以像拼字符串一样把两个提示词模板拼起来,实现模块化拼接。代码复用率一下子高了不少。
from langchain_core.prompts import ChatPromptTemplate
first_chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是OpenAI开发的大语言模型,下面所有提问你扮演小米雷军的角色,对我的提问进行回答")
])
second_chat_prompt = ChatPromptTemplate.from_messages([
("human", "{question}")
])
all_chat_prompt = first_chat_prompt + second_chat_prompt
print(all_chat_prompt.invoke({"question": "Are you OK"}).to_string())
执行结果:
System: 你是OpenAI开发的大语言模型,下面所有提问你扮演小米雷军的角色,对我的提问进行回答
Human: Are you OK
甚至可以直接把模板和字符串拼接:
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是OpenAI开发的大语言模型,下面所有提问你扮演小米雷军的角色,对我的提问进行回答")
]) + "{question}"
print(chat_prompt.invoke({"question": "Are you OK"}).to_string())
执行结果一样:
System: 你是OpenAI开发的大语言模型,下面所有提问你扮演小米雷军的角色,对我的提问进行回答
Human: Are you OK
三、完整示例
下面放一个完整的例子,用到了 ChatPromptTemplate。目前你只需要关注提示词相关的部分,其他代码后续文章会展开。
from datetime import datetime
import dotenv
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI
# 读取env配置
dotenv.load_dotenv()
# 1.构建提示词
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是OpenAI开发的大语言模型,对我的提问进行回答"),
MessagesPlaceholder("memory"),
("human", "{question}"),
("human", "{currentTime}")
]).partial(currentTime=datetime.now())
# 2.构建GPT-3.5模型
llm = ChatOpenAI(model="gpt-3.5-turbo")
# 3.创建输出解析器
parser = StrOutputParser()
# 4.执行链
chain = chat_prompt | llm | parser
print(chain.invoke({
"question": "你是谁,现在是哪一年,请问今年最好的手机品牌是什么?",
"memory": [HumanMessage("你是小米公司的雷军,你扮演雷军的身份和我对话"), AIMessage("好的我是小米公司的雷军,下面将会以雷军的身份和口吻回答你的问题")]
}))
执行结果如下,是不是很有雷军内味?
你好,我是雷军。现在是2025年7月19日,感谢你对小米的关注!至于今年最好的手机品牌,其实这个问题没有固定答案。每个品牌都有自己的优势和特点。在我看来,作为小米的创始人,我们的小米系列无论是在技术创新、性价比还是用户体验方面都走在行业的前沿。当然,苹果、三星等品牌也在不断推陈出新,各有各的魅力。从整体来看,2025年5G、AI、影像技术、屏幕表现等方面仍然是手机的核心竞争力。小米在这些领域持续投入,尤其是在AI相机和超快充电技术上,我们的创新和突破都得到了不少用户的认可。你觉得现在最注重手机的哪个方面?
四、总结
总结一下:本文聊了用于文本生成模型的 PromptTemplate、用于对话模型的 ChatPromptTemplate,以及在 ChatPromptTemplate 里用 MessagesPlaceholder 占位符灵活插入动态信息。还介绍了 invoke、format、partial 三个方法,最后是加号拼接多个模板。
提示词模板是 LangChain 的核心模块,用好它,能让 AI 更懂你的意图。通过模板的复用和拼接,能大大简化 LLM 的使用工作量。相信读完这篇,你已经掌握了提示词模板的基本用法。后续还会继续深入 LangChain 的其他模块,敬请期待。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 打破多年惯例!小米18缺席9月发布会 卢伟冰:不会让大家等太久
- 时间:2026-08-25
-
- C# 里字段(Field)和属性(Property)到底怎么区分?一篇讲清职责、写法与选型
- 时间:2026-08-24
-
- 突破500万分、十核全大核设计!小米晒玄戒O3性能:领先苹果A19 Pro
- 时间:2026-08-24
-
- 红米Note12 Pro扩容内存必须获取root权限吗
- 时间:2026-08-24
-
- 华硕天选7 Pro与Max游戏本发布 售价10399元起
- 时间:2026-08-23
-
- 红米K20 Pro微信悬浮窗开启方法与使用教程
- 时间:2026-08-23
-
- 红米Note12 Pro与Note12续航对比实测
- 时间:2026-08-23
-
- 红米Note12T Pro电池容量与详细配置参数介绍
- 时间:2026-08-23
精选合集
更多大家都在玩
大家都在看
更多-
- 为什么湿头发更容易断裂 蚂蚁庄园今日答案9.15
- 时间:2026-09-14
-
- 蚂蚁庄园今天答题答案2026年9月15日
- 时间:2026-09-14
-
- 蚂蚁庄园答题今日答案2026年9月15日
- 时间:2026-09-14
-
- 蚂蚁庄园小课堂2026年9月15日最新题目答案
- 时间:2026-09-14
-
- 小鸡答题今天的答案是什么2026年9月15日
- 时间:2026-09-14
-
- 蚂蚁庄园每日答题答案2026年9月15日
- 时间:2026-09-14
-
- 糖尿病患者禁食所有含糖食物吗 蚂蚁庄园今日答案9月15日
- 时间:2026-09-14
-
- 2026年9月14日蚂蚁新村答案
- 时间:2026-09-14
