微信扫码
添加专属顾问
掌握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 | StrOutputParserJsonOutputParser | ||
| 管道符将 Prompt → 模型 → 解析器组合成一条可复用链条 | |||
PromptTemplate + LLM | |||
ChatPromptTemplate + ChatModel |
好了,以上就是本节全部内容,我们下一节再见~
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-09-20
AI-native|AI-native 中小型项目落地指南
2026-08-28
一切皆插件之后,Agent 工程的新范式
2026-08-19
做了十年 java 开发,我是怎么转到 AI 智能体的
2026-07-19
正本清源:企业 AI 不是建在 Harness 上,而是用 Harness 承载业务流程
2026-07-17
OpenWiki Brains 与 wiki memory 模式:智能体记忆从反应式推到主动式
2026-07-05
AI Agent 慢在哪?Node.js 探针把模型、工具和服务链路一次串起来
2026-07-05
拆解LangChain刚开源的OpenWiki:如何落地个人Wiki知识库
2026-07-01
LangGraph Runtime 是什么?一文讲清Runtime与Context的作用与用法!
2026-03-26
2025-11-03
2025-10-29
2025-07-14
2025-07-13
2025-07-05
2025-06-26
2025-06-13
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。