免费POC, 零成本试错
AI知识库

AI知识库

学习大模型的前沿技术与行业落地应用


收藏

Langchain学习教程二(提示词模板和 LCEL 语法)

发布日期:2025-07-23 07:33:06 浏览次数: 3014
作者:AI编程随录

微信搜一搜,关注“AI编程随录”

推荐语

掌握LangChain提示词模板与LCEL语法,提升大模型应用开发效率。

核心内容:
1. 提示词模板(PromptTemplate)的作用与实战应用
2. LLM与ChatModel的核心区别解析
3. LCEL语法在LangChain中的特殊优势

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家


上一节内容中我们主要是讲解了 LangChain 的基础概念和基础的 HelloWorld demo,Langchain学习教程一(Hello World)

那么这一节我们开始来学习下 Langchain 中的提示词模板、了解下OutputParser和它特殊的LCEL语法。

PromptTemplate

随着大语言模型(LLM)在各类应用中的快速普及,构建高质量的提示词(Prompt)已经成为影响模型输出效果的关键因素。关于提示词工程的一些注意点,可以参考我之前的这篇文章:

今天我们就来学习下 PromptTemplate 在 LangChain 中的作用,并结合 LLM 与 ChatModel 的差异,帮你在项目中用得更对、更巧。

为什么要用提示词模板

在上一节的 demo 中,我们直接在 invoke 方法中写死了一个你好。但在实际业务开发中,我们常常需要把用户的输入、上下文信息、系统指令等组合成一句对大模型有意义的提示词。例如我们做一个翻译工具,我的提示词模板大概如下:

请将以下内容翻译成英文:{input}

甚至是

请将以下内容翻译成{language}:{input}

这样的模板可以重复使用,并根据不同输入自动生成完整的 prompt。

LangChain 提供的 PromptTemplate 就是一个“提示词模板引擎”,它帮助我们实现:

  • ✅ 提示词结构化:用模板语法组织 prompt
  • ✅ 可复用:一次定义,多处调用
  • ✅ 易维护:修改模板时无需改动逻辑代码

先来个基础 demo

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() 时提供即可,看起来还是很简单吧。

LLM vs ChatModel

其实我们后续用的更多的是ChatPromptTemplate,那么什么又是ChatPromptTemplate呢,讲这个问题之前,我们先要知道下 LLM 和 ChatModel 的区别。

在 LangChain 中,我们可以调用的其实有两类模型:

文本模型(LLM)

适用于 text-davinci-003、Llama、Mistral 等文本模型。这类模型接收纯文本字符串作为输入,返回文本作为输出。

适配工具:PromptTemplate

对话模型(ChatModel)

官方文档: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

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 vs ChatPromptTemplate

维度
PromptTemplate
ChatPromptTemplate
适配模型
文本模型(如 LLaMA)
聊天模型(如 GPT-3.5)
输入结构
字符串模板
消息列表(message list)
是否支持角色
❌ 不支持
✅ 支持 system/user/assistant
场景适用
简单补全文本
多轮对话 / 多角色控制

如果你只需要简单处理文本生成任务,比如摘要、改写、代码补全,PromptTemplate 就够用;但如果你要实现 Agent、RAG 问答、多轮对话,推荐使用 ChatPromptTemplate。

技巧与建议

多参数注入

你可以使用多个变量:

PromptTemplate.from_template(
  "请将 {input_lang} 翻译成 {output_lang}:{text}"
)

只使用一个system 提示词

虽然下面的用法不会报错,但是并不推荐

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 中已经有了相关的记忆管理的模块,后续我们会提到。

OutputParser

在上面的例子中,我们是通过 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语法

好了,接下来就是今天最后一个主题了,关于 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
构建聊天模型的多角色提示词,支持多轮对话
对话机器人、Agent、RAG 等
.from_messages()
MessagesPlaceholder
占位历史对话消息,支持插入上下文记忆
多轮对话场景
MessagesPlaceholder(...)
OutputParser
解析模型输出,如转成字符串、JSON、结构化数据
控制输出格式、对接下游任务
StrOutputParser
、JsonOutputParser
LCEL 语法
用 |  管道符将 Prompt → 模型 → 解析器组合成一条可复用链条
构建复杂链、模块组合、调试优化

文本模型(LLM)
处理字符串输入输出的模型,如 LLaMA、Mistral 等
传统文本处理任务
PromptTemplate + LLM
聊天模型(ChatModel)
处理多轮消息输入输出的模型,如 GPT、Claude 等
对话机器人、多轮上下文任务
ChatPromptTemplate + ChatModel

好了,以上就是本节全部内容,我们下一节再见~

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅