位置:首页 > 进阶教程 > LangChain PromptTemplate 提示词模板入门教程

LangChain PromptTemplate 提示词模板入门教程

时间:2026-07-26  |  作者:白桃企划师  |  阅读:0

上一期咱们把 LangChain 的基础环境搭好,成功跑了一个示例。

今天继续深入,聊聊 LangChain 的核心模块之一:PromptTemplate(提示词模板)。

LangChain框架入门03:PromptTemplate 提示词模板

跟大模型聊天的时候,直接把原始输入丢过去通常不是个好主意。得先做点包装、组织、格式化的工作。这么做的目的——让意图更清晰,让模型能更好地理解你的意思。

这套结构化的玩法,就是 LangChain 里的提示词模板(PromptTemplate)。对于 LLM 应用来说,Prompt 写得好,项目就成功了一半。今天咱们就好好掰扯掰扯提示词模板怎么用、有哪些技巧。

一、提示词模板分类

LangChain 提供了好几种提示词模板。下面挑几个常用的来说:

  • PromptTemplate:文本生成模型专用,用字符串拼接变量来生成提示词。简单粗暴,但也最基础。
  • ChatPromptTemplate:聊天模型专用,比如 gpt-3.5-turbogpt-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-turbogpt-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,还有 formatpartial 也能格式化模板。它们仨有什么区别呢?直接看——

  • 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 占位符灵活插入动态信息。还介绍了 invokeformatpartial 三个方法,最后是加号拼接多个模板。

提示词模板是 LangChain 的核心模块,用好它,能让 AI 更懂你的意图。通过模板的复用和拼接,能大大简化 LLM 的使用工作量。相信读完这篇,你已经掌握了提示词模板的基本用法。后续还会继续深入 LangChain 的其他模块,敬请期待。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多