【AI智能体】Langchain 提示词模版使用实战操作详解
目录一、前言二、Langchain 提示词模板介绍2.1 什么是提示词模板2.2 为什么推荐提示词模板2.2.1 字符串拼接的方式2.2.2 使用PromptTemplate2.3 提示词机制演进三、ChatPromptTemplate 使用3.1 ChatPromptTemplate 两种实例化方式3.1.1 方式1调用from_messages()3.1.2 使用实例初始化方法3.2 模版调用3种方式3.2.1 使用 invoke()调用3.2.2 使用format()调用3.2.2 使用format_messages()调用3.3 使用大模型调用3.4 ChatPromptTemplate 参数详细说明3.4.1 str列表类型3.4.2 tuple列表类型3.4.3 dict列表类型3.4.4 Message列表类型3.4.5 MessagePromptTemplate列表类型3.6 ChatPromptTemplate 高级特性3.6.1 部分变量预填充3.6.2 消息占位符3.7 定义可复用模板四、写在最后一、前言在使用Langchain 进行项目开发者一个很重要的内容就是需要编写提示词模版因为在与大模型交互过程中需要传递给大模型标准化的消息而这些消息模版需要在迭代中慢慢固化下来成为可复用的内容这就涉及到提示词模版的深入使用本篇将详细介绍一下Langchain 中提示词模版的使用。二、Langchain 提示词模板介绍2.1 什么是提示词模板提示词模板Prompt Template是一种可复用的提示词结构它把“固定文本”和“动态变量”分开让你在运行时填入不同输入从而生成最终发给模型的提示词。句话概括就是它不是一条写死的提示词而是一个带占位符的提示词“模具”。2.2为什么推荐提示词模板在 LangChain 开发中构造提示词既可以直接使用 Python 字符串拼接如 f-string、format() 或 也可以使用 LangChain 提供的 PromptTemplate 或 ChatPromptTemplate 。2.2.1 字符串拼接的方式字符串拼接是最简单的方式如下是使用字符串的拼接方式# 字符串拼接 topic Python difficulty 初学者 # 难以维护容易出错 prompt_str f你是一个{difficulty}级别的编程导师。请用简单易懂的语言解释{topic}。 response model.invoke(prompt_str) print(fAI 回复{response.content}...\n)这种方式的优缺点如下优点✅简单直接上手快适合临时 demo无额外学习成本缺点❌可读性差变量多时混乱不易维护修改容易出错无变量校验容易漏/拼错难以支持复杂场景多轮对话 / RAG / Few-shot2.2.2 使用PromptTemplate这种方式是实际开发中使用最多也是推荐的一种写法比如下面代码中PromptTemplate 的写法from langchain.prompts import PromptTemplate topic Python difficulty 初学者 template PromptTemplate.from_template( 你是一个{difficulty}级别的编程导师。请用简单易懂的语言解释{topic}。 ) # 使用模板生成提示词 prompt template.format(difficultydifficulty, topictopic) response model.invoke(prompt) print(fAI 回复{response.content}...\n)或者使用 ChatPromptTemplatefrom langchain_core.prompts import ChatPromptTemplate prompt_template ChatPromptTemplate([ (system, 你是一个AI开发工程师. 你的名字是 {name}.), (human, {user_input}) ]) #调用format()方法返回字符串 prompt prompt_template.invoke({name:小谷AI, user_input:你能帮我做什 么?}) print(prompt)其优缺点如下优点✅结构清晰变量占位易维护、可复用自动变量校验更安全支持复杂场景对话 / RAG / Agent可与 LangChain 生态无缝集成便于调试与日志追踪缺点❌有一定学习成本初期写法略复杂对极简单场景略“重”2.3提示词机制演进LangChain 1.0的架构变革中核心的演进之一体现在 Prompt 机制上一个结构化的、富含元数据的消息列表已经取代单一字符串成为与模型交互的标准数据格式。1旧时代LLM PromptTemplate输入与输出均为字符串模型接口对应于 LangChain 中的LLM类主要面向早期的 文本补全模型 。工作方式模型接受一个 单一的字符串 作为输人基于此预测并生成后续的文本内容文本补全。Prompt 工具核心工具是 PromptTemplate 。它的职责是接收一组变量并通过模板渲染最终输出一个完整的字符串。from langchain_core.prompts import PromptTemplate prompt_template PromptTemplate.from_template( 请给我一个关于{topic}的{type}解释。 ) #传入模板中的变量名 prompt prompt_template.format(type详细, topic量子力学) print(prompt)这种方式有一定的局限性当我们需要用这种方式模拟多轮聊天时开发者必须在字符串中手动这种方式不仅导致 Prompt 结构混乱、难以维护也极易让模型混淆对话的边界与上下文影响生成质量。Human你好\nAI你好有什么我能帮忙的吗\nHuman...2ChatModelChatPromptTemplate输入与输出均为消息列表模型接口对应 LangChain 1.0 的主流接口 ChatModel工作方式现代聊天模型 API 已原生 支持角色概念 。它们不再接受单一字符串而是要求输入 一个结构化的消息列表 。为构建复杂、可靠的多轮对话智能体系统奠定了坚实的基础。Prompt 工具ChatPromptTemplate 因此成为LangChain 1.0 中最核心的 Prompt工具。它的职责是接收变量并输出一个 List「BaseMessage消息列表该列表可直接传递给聊天模型。两者对比特性PromptTemplateChatPromptTemplate输出格式纯文本字符串消息列表角色支持❌ 无✅ system/user/assistant对话历史❌ 不支持✅ 支持适用场景简单提示聊天、对话、多轮交互总结因此用于生成消息列表的 ChatPromptTemplate也自然取代了生成字符串的 PromptTemplate成为构建现代LangChain 应用的首选工具。三、ChatPromptTemplate 使用在LangChain 1.0中ChatPromptTemplate 是用于生成消息列表的核心组件。ChatPromptTemplate 是创建聊天消息列表的提示模板。它比普通 PromptTemplate 更适合处理多角色、多轮次的对话场景。支持 System / Human / AI 等不同角色的消息模板。其常用的消息类型角色字符串含义用途system系统消息设定 AI 的行为、角色、规则user / human用户消息用户的输入/问题assistant / aiAI 消息AI 的回复用于对话历史3.1ChatPromptTemplate两种实例化方式ChatPromptTemplate 可以通过 初始化方法 或 from_messages 方法来实例化提示词模板。实例化时需要传入 messages参数 。常见类型是tuple构成的列表参数类型role : strcontent : str 3.1.1 方式1调用from_messages()该方法允许传入一个由元组Tuple构成的列表列表中的每一个元组都代表一条具有特定角色的消息。如下给出了一个完整的调用示例# 导入相关依赖 from langchain_core.prompts import ChatPromptTemplate # 定义聊天提示词模版 chat_template ChatPromptTemplate.from_messages( [ (system, 你是一个有帮助的AI机器人你的名字是{name}。), (human, 你好最近怎么样), (ai, 我很好谢谢), (human, {user_input}), ] ) # 格式化聊天提示词模版中的变量 prompt chat_template.invoke({name: 小明, user_input: 你叫什么名字}) # 打印格式化后的聊天提示词模版内容 print(prompt)3.1.2使用实例初始化方法即直接通过ChatPromptTemplate实例化一个对象如下代码# 导入相关依赖 from langchain_core.prompts import ChatPromptTemplate # 定义聊天提示词模版 # chat_template ChatPromptTemplate.from_messages( # [ # (system, 你是一个有帮助的AI机器人你的名字是{name}。), # (human, 你好最近怎么样), # (ai, 我很好谢谢), # (human, {user_input}), # ] # ) # 参数类型这里使用的是tuple构成的list chat_template ChatPromptTemplate([ # 字符串 role 字符串 content (system, 你是一个AI开发工程师. 你的名字是 {name}.), (human, 你能开发哪些AI应用?), (ai, 我能开发很多AI应用, 比如聊天机器人, 图像识别, 自然语言处理等.), (human, {user_input}) ]) # 格式化聊天提示词模版中的变量 prompt chat_template.invoke({name: 小明, user_input: 你叫什么名字}) # 打印格式化后的聊天提示词模版内容 print(prompt)运行一下也能得到预期结果注意from_messages()的底层也是调用的类的 __init()__方法3.2 模版调用3种方式在上文中当模板实例化出来之后最后调用invoke()方法将参数传递给示例就可以将完整的提示词拼接出来其实不仅只有invoke()方法还有format() 、 format_messages() 方法下面分别做一下说明。3.2.1使用 invoke()调用这种方式在上面的案例中已经使用过如下# 导入相关依赖 from langchain_core.prompts import ChatPromptTemplate # 定义聊天提示词模版 chat_template ChatPromptTemplate.from_messages( [ (system, 你是一个有帮助的AI机器人你的名字是{name}。), (human, 你好最近怎么样), (ai, 我很好谢谢), (human, {user_input}), ] ) # 参数类型这里使用的是tuple构成的list # chat_template ChatPromptTemplate([ # # 字符串 role 字符串 content # (system, 你是一个AI开发工程师. 你的名字是 {name}.), # (human, 你能开发哪些AI应用?), # (ai, 我能开发很多AI应用, 比如聊天机器人, 图像识别, 自然语言处理等.), # (human, {user_input}) # ]) # 格式化聊天提示词模版中的变量 prompt chat_template.invoke({name: 小明, user_input: 你叫什么名字}) print(type(prompt)) # 打印格式化后的聊天提示词模版内容 print(prompt) print(len(prompt.messages))需要说明的是这种调用结果返回ChatPromptValue如下结果展示3.2.2使用format()调用这种调用返回的结果是一个字符串# 导入相关依赖 from langchain_core.prompts import ChatPromptTemplate # 定义聊天提示词模版 chat_template ChatPromptTemplate([ # 字符串 role 字符串 content (system, 你是一个AI开发工程师. 你的名字是 {name}.), (human, 你能开发哪些AI应用?), (ai, 我能开发很多AI应用, 比如聊天机器人, 图像识别, 自然语言处理等.), (human, {user_input}) ]) # 格式化聊天提示词模版中的变量 prompt chat_template.format(name小明, user_input你叫什么名字?) print(type(prompt)) # 打印格式化后的聊天提示词模版内容 print(prompt)3.2.2使用format_messages()调用这种调用返回的结果是返回消息列表# 导入相关依赖 from langchain_core.prompts import ChatPromptTemplate # 定义聊天提示词模版 prompt_template ChatPromptTemplate([ (system, 你是一个AI开发工程师. 你的名字是 {name}.), (human, 你能开发哪些AI应用?), (ai, 我能开发很多AI应用, 比如聊天机器人, 图像识别, 自然语言处理等.), (human, {user_input}) ]) #调用format_messages()方法返回消息列表 prompt prompt_template.format_messages(name小谷AI, user_input你能帮我做什么?) print(type(prompt)) print(prompt)3.3 使用大模型调用通过模版的方式将完整的对话消息内容拼接出来之后接下来就需要把消息传递给大模型通过大模型得到响应结果。from dotenv import load_dotenv import os from langchain_openrouter import ChatOpenRouter # 1、加载配置文件 load_dotenv(overrideTrue) OPENROUTER_API_KEY os.getenv (OPENROUTER_API_KEY) OPENROUTER_API_BASE os.getenv (OPENROUTER_API_BASE) # 2、模型初始化 model ChatOpenRouter( modeldeepseek/deepseek-v3.2, api_keyOPENROUTER_API_KEY, base_urlOPENROUTER_API_BASE, ) # 3、定义提示词模板 # 导入相关依赖 from langchain_core.prompts import ChatPromptTemplate # 4、定义聊天提示词模版 chat_template ChatPromptTemplate([ # 字符串 role 字符串 content (system, 你是一个AI开发工程师. 你的名字是 {name}.), (human, 你能开发哪些AI应用?), (ai, 我能开发很多AI应用, 比如聊天机器人, 图像识别, 自然语言处理等.), (human, {user_input}) ]) prompt_value chat_template.format(name小明, user_input你叫什么名字?) # 5、模型调用 response model.invoke(prompt_value) print(response) from rich import print as rprint rprint(response)运行之后效果如下3.4ChatPromptTemplate 参数详细说明在上面的案例分享中说明了ChatPromptTemplate的两种创建方式。我们看到不管使用实例初始化方法还是使用 from_messages()参数类型都是 列表类型 。列表中的元素可以是多种类型前面我们主要测试了元组类型。通过源码可以看到它支持的入参形式有很多种这也给开发者在实际调用中更多的选择一句话总结参数是列表类型列表的元素可以是字符串、字典、字符串构成的元组、消息类型、提示词模板类型、消息提示词模板类型等3.4.1str列表类型列表参数格式是str类型不推荐因为会把消息的默认角色都当做是 human类型的# 1.导入相关依赖 from langchain_core.prompts import ChatPromptTemplate # 2.定义聊天提示词模版 chat_template ChatPromptTemplate.from_messages( [ Hello, {name}! # 等价于 (human, Hello, {name}!) ] ) # 3. 使用invoke执行 messages chat_template.invoke({name: 小明}) # 4.打印格式化后的聊天提示词模版内容 print(messages)3.4.2tuple列表类型列表参数格式是元组类型# 1.导入相关依赖 from langchain_core.prompts import ChatPromptTemplate # 示例: 元组形式的消息 prompt ChatPromptTemplate.from_messages([ (system, 你的名字是{role}.), (human, 很高兴认识你), ]) print(prompt.invoke({role: 小智}))3.4.3dict列表类型列表参数格式是dict类型# 1.导入相关依赖 from langchain_core.prompts import ChatPromptTemplate # 示例: 字典形式的消息 prompt ChatPromptTemplate.from_messages([ {role: system, content: 你的名字是{role}.}, {role: human, content: 很高兴认识你}, ]) print(prompt.invoke({role: 小智}))3.4.4Message列表类型也支持传入一个Message消息列表# 1.导入相关依赖 from langchain_core.prompts import ChatPromptTemplate from langchain_core.messages import SystemMessage,HumanMessage chat_prompt_template ChatPromptTemplate.from_messages([ SystemMessage(content我是一个贴心的智能助手), HumanMessage(content我的问题是:人工智能英文怎么说) ]) messages chat_prompt_template.invoke({}) print(type(messages)) from rich import print as rprint rprint(messages)3.4.5MessagePromptTemplate列表类型LangChain提供不同类型的MessagePromptTemplate。最常用的是SystemMessagePromptTemplate 、 HumanMessagePromptTemplate 和 AIMessagePromptTemplate 分别创建系统消息、人工消息和AI消息。HumanMessagePromptTemplate专用于生成 用户消息HumanMessage 的模板类模板化 支持使用变量占位符可以在运行时填充具体值格式化 能够将模板与输入变量结合生成最终的聊天消息输出类型 生成 HumanMessage 对象 content rolehuman 设计目的 简化用户输入消息的模板化构造避免重复定义角色SystemMessagePromptTemplate、AIMessagePromptTemplate用法类似# 导入聊天消息类模板 from langchain_core.prompts import ChatPromptTemplate,HumanMessagePromptTemplate, SystemMessagePromptTemplate # 创建消息模板 system_message_prompt SystemMessagePromptTemplate.from_template(你是一个{role}) human_message_prompt HumanMessagePromptTemplate.from_template(给我解释{concept}用浅显易懂的语言) # 组合成聊天提示模板 chat_prompt ChatPromptTemplate.from_messages([ system_message_prompt, human_message_prompt ]) # 格式化提示 formatted_messages chat_prompt.invoke({role: 物理学家, concept: 相对论}) # print(formatted_messages) from rich import print as rprint rprint(formatted_messages)3.6ChatPromptTemplate 高级特性ChatPromptTemplate 在实际使用中还有一些高级的特性下面做一下介绍3.6.1部分变量预填充使用partial() 方法来实现预填充某些固定不变的变量创建模板的变体使用场景某些变量在所有调用中都相同需要为不同用户/场景创建定制模板from langchain_core.prompts import ChatPromptTemplate # 构建原始模板 template ChatPromptTemplate.from_messages([ (system, 你是{role}目标用户是{audience}), (user, {task}) ]) # 部分填充 customer_support_template template.partial( role客服专员, audience普通用户 ) # 现在只需要提供 task messages1 customer_support_template.invoke({task: 解释退款政策}) messages2 customer_support_template.invoke({task: 请介绍下银行卡开户流程}) print(messages1) print(messages2)可以看到通过这种方式提前将模版中的核心参数用变量预填充的方式固定下来后面调用的时候就方便多了再比如下面的案例from langchain_core.prompts import ChatPromptTemplate # 场景为不同部门创建专用模板 base_template ChatPromptTemplate.from_messages([ (system, 你是{department}的{role}), (user, {task}) ]) # IT 部门 it_template base_template.partial( departmentIT 部门, role技术支持 ) # 销售部门 sales_template base_template.partial( department销售部门, role销售顾问 ) res sales_template.invoke({task: 为什么每年年底汽车会促销}) print(res)通过这种方式可以进一步定制化消息模版3.6.2 消息占位符当你不确定消息提示模板使用什么角色或者希望在格式化过程中 插入消息列表 时该怎么办 这就需要使用消息占位符负责在特定位置添加消息列表。使用场景多轮对话系统存储历史消息以及Agent的中间步骤处理此功能非常有用。1、使用placeholder的方式在placeholder变量中在具体调用invoke方法的时候传递一个消息列表from langchain_core.prompts import ChatPromptTemplate template ChatPromptTemplate.from_messages( [ (system, 你是一个有用的AI助手), (placeholder, {conversation}), ] ) prompt_value template.invoke( { conversation: [ (human, 你好!), (ai, 今天我能帮你做什么), (human, 你能给我做一个冰激凌吗), (ai, 抱歉我没有这样的能力), ] } ) from rich import print as rprint rprint(prompt_value)2、使用MessagesPlaceholder的方式还可以使用MessagesPlaceholder 这个参数作为占位符from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder prompt_template ChatPromptTemplate.from_messages([ (system, 你是一个AI助手), MessagesPlaceholder(variable_nameconversation) ]) res prompt_template.invoke({ conversation: [ (human, 你好请问明天的天气如何?), (ai, 明天天气晴朗), (human, 后天的天气怎么样?) ] }) from rich import print as rprint rprint(res)3、存储对话历史内容通过变量占位符的方式可以存储一部分历史对话消息如下案例from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder prompt_template ChatPromptTemplate.from_messages( [ (system, 你是一个非常友好的AI助手), MessagesPlaceholder(variable_namehistory), (human, {question}) ] ) response prompt_template.invoke( { history: [ (human, 5 2 ?), (ai, 5 2 7) ], question: 结果再乘以4呢 } ) print(response) # from rich import print as rprint # rprint(response)3.7 定义可复用模板在实际项目中建议创建模板库在后续的业务推进中很方便可以直接拿来使用。定义一个mytemplates.py文件其声明如下from langchain_core.prompts import ChatPromptTemplate class PromptLibrary: 可复用的提示词模板库 TRANSLATOR ChatPromptTemplate.from_messages([ (system, 你是专业翻译精通{source_lang}和{target_lang}), (user, 翻译以下文本\n{text}) ]) CODE_REVIEWER ChatPromptTemplate.from_messages([ (system, 你是{language}代码审查专家重点关注{focus}), (user, 审查代码\n{language}\n{code}\n) ]) SUMMARIZER ChatPromptTemplate.from_messages([ (system, 你是内容摘要专家), (user, 将以下内容总结为{num}个要点\n{content}) ]) TUTOR ChatPromptTemplate.from_messages([ (system, 你是{subject}导师学生水平{level}), (user, {question}) ])然后就可以在其他的文件中进行调用from mytemplates import PromptLibrary messages PromptLibrary.TRANSLATOR.format_messages( source_lang英语, target_lang中文, textHello World ) print(messages)四、写在最后本文通过较大的篇幅详细介绍了Langchain中提示词模板的使用有兴趣的同学还可以基于此继续深入的研究本篇到此结束感谢观看。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →