支持私有化部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


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

发布日期:2025-07-23 07:33:06 浏览次数: 1555
作者: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

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询