微信扫码
添加专属顾问
我要投稿
掌握LangChain提示词模板与LCEL语法,提升大模型应用开发效率。 核心内容: 1. 提示词模板(PromptTemplate)的作用与实战应用 2. LLM与ChatModel的核心区别解析 3. LCEL语法在LangChain中的特殊优势
上一节内容中我们主要是讲解了 LangChain 的基础概念和基础的 HelloWorld demo,Langchain学习教程一(Hello World)
那么这一节我们开始来学习下 Langchain 中的提示词模板、了解下OutputParser和它特殊的LCEL语法。
随着大语言模型(LLM)在各类应用中的快速普及,构建高质量的提示词(Prompt)已经成为影响模型输出效果的关键因素。关于提示词工程的一些注意点,可以参考我之前的这篇文章:
今天我们就来学习下 PromptTemplate
在 LangChain 中的作用,并结合 LLM
与 ChatModel
的差异,帮你在项目中用得更对、更巧。
在上一节的 demo 中,我们直接在 invoke 方法中写死了一个你好
。但在实际业务开发中,我们常常需要把用户的输入、上下文信息、系统指令等组合成一句对大模型有意义的提示词。例如我们做一个翻译工具,我的提示词模板大概如下:
请将以下内容翻译成英文:{input}
甚至是
请将以下内容翻译成{language}:{input}
这样的模板可以重复使用,并根据不同输入自动生成完整的 prompt。
LangChain 提供的 PromptTemplate
就是一个“提示词模板引擎”,它帮助我们实现:
LangChain 从 v0.3.x 开始,推荐使用 PromptTemplate.from_template()
方法快速创建模板,使用其实很简单
from langchain.prompts import PromptTemplate
template = "请将以下内容翻译成{language}:{input}"
prompt = PromptTemplate.from_template(template)
formatted_prompt = prompt.format(language="日文", input="我是一个中国人")
print(formatted_prompt)
输出结果:
请将以下内容翻译成日文:我是一个中国人
你可以在模板中定义任意变量,只要在 .format()
或 .invoke()
时提供即可,看起来还是很简单吧。
其实我们后续用的更多的是ChatPromptTemplate
,那么什么又是ChatPromptTemplate
呢,讲这个问题之前,我们先要知道下 LLM 和 ChatModel 的区别。
在 LangChain 中,我们可以调用的其实有两类模型:
适用于 text-davinci-003
、Llama、Mistral 等文本模型。这类模型接收纯文本字符串作为输入,返回文本作为输出。
适配工具:PromptTemplate
官方文档:https://python.langchain.com/docs/concepts/chat_models/
适用于 OpenAI GPT-3.5 / GPT-4、Claude、Gemini 等对话模型。
LangChain 关于ChatModel的命名约定是将“Chat”作为类名的前缀(例如, ChatOllama 、 ChatAnthropic 、 ChatOpenAI 等)。
这类模型接收一个消息数组(带角色的 message),比如:
[
{ "role": "system", "content": "你是翻译助手" },
{ "role": "user", "content": "请翻译:我是一个中国人" }
]
适配工具:ChatPromptTemplate
对于支持多轮对话的模型,LangChain 提供了 ChatPromptTemplate
,允许我们通过消息列表的形式构建提示,使用方法如下
from langchain.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个中文翻译助手"),
("user", "请翻译以下内容为英文:{text}")
])
messages = prompt.format_messages(text="我是一个中国人")
print(messages)
打印内容如下
[
SystemMessage(
content='你是一个中文翻译助手',
additional_kwargs={},
response_metadata={}),
HumanMessage(
content='请翻译以下内容为英文:我是一个中国人',
additional_kwargs={},
response_metadata={})
]
这个 messages
就可以直接传入 ChatOpenAI
这样的聊天模型,完整的 demo 代码如下
from langchain.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="Qwen/Qwen3-32B",
openai_api_key="your_key",
base_url="https://api.siliconflow.cn/v1",
temperature=0
)
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个中文翻译助手"),
("user", "请翻译以下内容为英文:{text}")
])
messages = prompt.format_messages(text="我是一个中国人")
response = llm.invoke(messages)
print(response.content)
打印为
I am a Chinese person.
如果你只需要简单处理文本生成任务,比如摘要、改写、代码补全,PromptTemplate
就够用;但如果你要实现 Agent、RAG 问答、多轮对话,推荐使用 ChatPromptTemplate
。
你可以使用多个变量:
PromptTemplate.from_template(
"请将 {input_lang} 翻译成 {output_lang}:{text}"
)
虽然下面的用法不会报错,但是并不推荐
ChatPromptTemplate.from_messages([
("system", "你是一个写作助手"),
("system", "你的回答要简洁明了"),
("user", "请帮我写一段关于成都的介绍")
])
配合 partial 模板,提前注入一些参数:
partial_prompt = prompt.partial(input_lang="中文")
接下来看一下MessagesPlaceholder
,这儿后续讲到对话历史记录的时候会用到,现在我们先看一下它的一个简单作用。
比如我们有一个对话助手,我们后续每一次对话都需要将用户之前的内容作为上下文一起传递过去,帮助模型理解上下文环境。
你可以把 ChatPromptTemplate 想成“对话模版”,而对话历史(memory)是一个变量,但这个变量不是具体的字符串,而是一组消息(message 对象)列表,所以需要一个特别的占位符,来告诉 LangChain:
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个问答助手"),
MessagesPlaceholder(variable_name="chat_history"),
("user", "{input}")
])
现在我们就有了一个叫 chat_history 的插槽,里面放的内容可以由我们自由决定,有点类似于 vue 中的 slot。比如我们构造一个有记忆
的聊天助手
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.schema import HumanMessage, AIMessage
llm = ChatOpenAI(
model="Qwen/Qwen3-32B",
openai_api_key="your_key",
base_url="https://api.siliconflow.cn/v1",
temperature=0
)
# 初始化 prompt,包含占位符
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有记忆的助手"),
MessagesPlaceholder(variable_name="chat_history"),
("user", "{input}")
])
# 初始化对话历史(空列表)
chat_history = []
print("💬 欢迎使用对话助手,输入 'exit' 可退出")
whileTrue:
user_input = input("\n👤 你说:")
if user_input.strip().lower() == "exit":
break
# 构造完整的 prompt 消息(手动注入历史 + 当前输入)
messages = prompt.format_messages(
chat_history=chat_history,
input=user_input
)
# 调用模型获取回复
response = llm.invoke(messages)
# 输出模型回复
print(f"🤖 助手:{response.content}")
# 把这轮对话加入历史
chat_history.append(HumanMessage(content=user_input))
chat_history.append(AIMessage(content=response.content))
代码很简单,我们手动构建了一个会话历史记录,每一次用户和 AI 对话的内容都会被手动加到这个列表中去,并且作为上下文传递给大模型。这样子大模型就有了记忆
。
运行效果:
💬 欢迎使用对话助手,输入 'exit' 可退出
👤 你说:我是 hockor
🤖 助手:你好,hockor!有什么我可以帮你的吗?无论是问题、需求还是闲聊,我都在这里哦~ 😊
👤 你说:我是谁?
🤖 助手:你是hockor!刚刚你告诉过我你的名字呢。有什么我可以帮你的吗?还是说你想聊聊关于“我是谁”的哲学问题? 😄
那么是否我们每次都需要手动自己去管理呢,那肯定不需要,langchain 中已经有了相关的记忆管理
的模块,后续我们会提到。
在上面的例子中,我们是通过 response.content 自己每次从回答中提取的内容,
但是 LangChain 其实给我们提供了很多的OutputParser
,它的作用就是将输出的内容解析成我们想要的格式,通过这个 Parser,我们可以将输出的内容转成特定的结构,比如 json、列表等等。
这里我们先看一个最简单的 StrOutputParser
from langchain.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
template = "请将以下内容翻译成{language}:{input}"
prompt = PromptTemplate.from_template(template)
formatted_prompt = prompt.format(language="日文", input="我是一个中国人")
# 初始化输出解析器:会把模型的输出原样返回为字符串
parser = StrOutputParser()
llm = ChatOpenAI(
model="Qwen/Qwen3-32B",
openai_api_key="your_key",
base_url="https://api.siliconflow.cn/v1",
temperature=0
)
# 执行:调用模型 + 解析输出
response = llm.invoke(formatted_prompt)
result = parser.invoke(response)
print(result)
好了,接下来就是今天最后一个主题了,关于 LCEL 语法。
它的全称 LangChain Expression Language
,是一种用 管道(|)语法组合 LangChain 模块 的方式,用来定义可执行的链(Runnable)对象。
我们这里先不深入其中的各种概念,先来个直观的效果看看。比如上面的 demo 中,
response = llm.invoke(formatted_prompt)
result = parser.invoke(response)
我们先将formatted_prompt
传给了 llm
进行了调用,又把它们的结果传给了parser
进行调用。
那么用 LCEL 的管道符来做的话,就很简单
chain = prompt | llm | parser
所以改造后的完整代码就是:
from langchain.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
# 1. 定义 Prompt 模板
template = "请将以下内容翻译成{language}:{input}"
prompt = PromptTemplate.from_template(template)
# 2. 初始化模型
llm = ChatOpenAI(
model="Qwen/Qwen3-32B",
openai_api_key="your_key",
base_url="https://api.siliconflow.cn/v1",
temperature=0
)
# 3. 初始化输出解析器
parser = StrOutputParser()
# 4. 用 LCEL 方式组合成一个完整链(Prompt → LLM → Parser)
chain = prompt | llm | parser
# 5. 调用链(只需传入模板变量)
result = chain.invoke({
"language": "日文",
"input": "我是一个中国人"
})
# 6. 打印结果
print(result)
而且还可以在管道中加入各种自定义的中间件逻辑等等,看起来逻辑更加清晰,书写也更加优雅了。
更多的 LCEL 内容可以参见官方文档地址:https://python.langchain.com/docs/concepts/lcel/
我们在后续的学习中也会再讲解。
在本节中,我们从 LangChain 中的 PromptTemplate
和 ChatPromptTemplate
出发,深入理解了提示词模板在实际开发中的关键作用。我们不仅比较了文本模型与聊天模型的差异,还通过 MessagesPlaceholder
和 OutputParser
等工具组件,演示了如何让提示词逻辑更强大、更灵活。
此外,借助 LangChain 的 LCEL
语法,我们可以用更加声明式、组合式的方式来构建完整的调用链,使代码更加优雅、可维护。
PromptTemplate | .from_template() .format() | ||
ChatPromptTemplate | .from_messages() | ||
MessagesPlaceholder | MessagesPlaceholder(...) | ||
OutputParser | StrOutputParser JsonOutputParser | ||
| 管道符将 Prompt → 模型 → 解析器组合成一条可复用链条 | |||
PromptTemplate + LLM | |||
ChatPromptTemplate + ChatModel |
好了,以上就是本节全部内容,我们下一节再见~
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-07-23
Langchain学习教程一(Hello World)
2025-07-23
Langchain 教程三(FewShotChatMessagePromptTemplate)
2025-07-23
Langchain 教程四(OutputParser)
2025-07-23
Langchain教程五(LCEL 上篇)
2025-07-23
Langchain教程六(LCEL下篇)
2025-07-22
通俗易懂的LangGraph图定义解析
2025-07-21
LlamaIndex + LangChain 如何协同打造 AI 超级助手
2025-07-21
让AI像人一样“动脑筋”:教你用LangChain打造“超强智能体”!
2025-05-06
2025-06-05
2025-05-08
2025-05-28
2025-05-19
2025-05-28
2025-06-26
2025-04-25
2025-05-19
2025-04-26
2025-07-14
2025-07-13
2025-07-05
2025-06-26
2025-06-13
2025-05-21
2025-05-19
2025-05-08