ChatPromptTemplate和AI Message的用法

ChatPromptTemplate的用法

用法1:


from langchain.chains import LLMChain
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain.chains import LLMMathChain

prompt= ChatPromptTemplate.from_template("tell me the weather of {topic}")
str = prompt.format(topic="shenzhen")
print(str)

打印出:

Human: tell me the weather of shenzhen

最终和llm一起使用:

import ChatGLM
from langchain.chains import LLMChain
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

from langchain_community.tools.tavily_search 
<think>嗯,用户这次问的是LangChain库中MessageMessageTemplate的区别。这个问题非常具体,正好刚才展示的四个引用里有两个都涉及了LangChain的提示模板使用,特别是引用[1][2]给出了具体代码示例,需要仔细分析。用户似乎已经接触过LangChain的基本概念,现在想深入理解消息组件的设计逻辑。从引用的聊天模板代码能看出,SystemMessage/HumanMessage这些属于具体消息类型,而ChatPromptTemplate.from_messages()则是在操作模板。有趣的是引用[1]特意展示了两种等价的写法:既可以直接传入元组,也可以传MessagePromptTemplate实例,这个对比其实已经暗示了核心区别。让我先整理核心差异点:Message是具体数据对象,像信件实体;MessageTemplate则是信件模板,带着占位符。就像寄信时不能把写着"亲爱的{name}"的模板纸直接塞进信封,需要先format替换掉占位符。引用[2]的chain.invoke()调用过程完美展示了这个动态替换的链条——human_prompt里定义了{user_input}槽位,调用时才注入实际内容。用户可能混淆点在于它们都出现在from_messages()里。需要强调这是设计精妙之处:LangChain允许混用二者,因为from_messages()内部会自动转换,就像引用[1]第一个示例那样把普通字符串升级为带插值的模板。不过严格来说,直接传Message实例可能降低灵活性,毕竟真实场景里系统消息往往固定而用户消息多变。关于使用场景,突然想到引用[4]提到的"Prompt框架"概念。模板的意义不仅在于复用,更关键的是构成提示工程流水线的基础组件——将角色设定、对话历史、当前输入组装成结构化的Prompt对象。这时候若用具体Message会导致历史消息无法动态更新,而模板的.format()机制天然支持这种迭代。最后那个代码对比的表格应该能直观帮用户区分。需注意SystemMessagePromptTemplate这类带Template后缀的类其实继承自Message,但覆写了format方法实现插值。要不要提这个实现细节呢?用户问的是使用场景而非源码,暂时点到为止吧。</think> 在 LangChain 库中,`Message` `MessageTemplate` 扮演不同角色,核心区别在于 **前者是具体的消息内容对象,后者是生成消息的模板**。以下是详细对比及使用场景: --- ### **1. Message (消息对象)** * **本质**:表示 **一个具体的、已填充内容的消息**。是聊天模型中实际输入/输出的单元。 * **核心类**: * `HumanMessage`: 用户输入的消息 * `AIMessage`: AI 模型输出的消息 * `SystemMessage`: 系统指令或上下文消息 * `FunctionMessage` / `ToolMessage`:函数或工具调用的输入/输出消息 * **特点**: * 包含**确定的内容**(`content` 属性),没有变量占位符。 * 可直接传递给模型进行处理或作为模型的输出结果。 * 代表对话中的**一个具体发言**。 * **使用场景**: * 直接构造固定内容的聊天消息。 * 处理或存储模型生成的结果或用户输入的原始内容。 * 作为对话历史 (`ChatMessageHistory`) 的记录单元。 **示例(引用[2]片段修改)**: ```python from langchain_core.messages import HumanMessage, SystemMessage # 创建具体消息对象 system_msg = SystemMessage(content="你是乐于助人的AI助手") # 固定系统消息 human_msg = HumanMessage(content="你好!今天天气如何?") # 固定用户消息 # 这些消息可直接用于聊天模型输入 ``` --- ### **2. MessageTemplate (消息模板)** * **本质**:表示 **一个带有变量占位符的消息模板**。用于**动态生成**最终的 `Message` 对象。 * **核心类**: * `HumanMessagePromptTemplate` * `SystemMessagePromptTemplate` * `AIMessagePromptTemplate` * `ChatPromptTemplate`:由多个消息模板组成的完整提示模板 * **特点**: * 包含**模板字符串**,内含需填充的变量(如 `{variable}`)。 * 需要调用 `.format()` 或 `.format_messages()` 方法,传入变量值才能生成具体的 `Message` 对象。 * 是**构建提示的结构化工具**,提高复用性灵活性。 * **使用场景**: * 创建可复用的提示模板(如系统提示、用户输入格式)。 * 根据外部输入动态构造聊天消息。 * 在 Chains 或 Agents 中定义输入处理逻辑。 * [LangChain Prompts 的核心组件](^3^)。 **示例(引用[1][2]结合)**: ```python from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate # 创建消息模板 system_template = SystemMessagePromptTemplate.from_template("你是一个将用户文字改写得更积极的助手。") human_template = HumanMessagePromptTemplate.from_template("{user_input}") # 组合成聊天提示模板 chat_prompt = ChatPromptTemplate.from_messages([ system_template, human_template ]) # 动态生成消息(传入变量值) input_dict = {"user_input": "我不喜欢吃美味的东西"} messages = chat_prompt.format_messages(**input_dict) # messages 现在是 [SystemMessage(...), HumanMessage(...)],内容已填充 ``` --- ### **核心区别总结** | **特性** | **Message** | **MessageTemplate** | |----------------------|--------------------------------------|-----------------------------------------| | **本质** | 具体的内容对象 | 带占位符的模板 | | **内容** | 已填充的固定内容 | 含变量(如 `{var}`)的模板字符串 | | **是否需要填充** | 否 | 是(需调用 `.format()`) | | **主要用途** | 模型输入/输出、对话历史记录 | 动态构建消息、创建可复用的提示结构 | | **类示例** | `HumanMessage`, `SystemMessage` | `HumanMessagePromptTemplate`, `SystemMessagePromptTemplate`, `ChatPromptTemplate` | --- ### **使用场景总结** * **优先使用 `MessageTemplate` 时**: * 需要根据用户输入或外部数据构造消息(如聊天机器人的请求组装)。 * 定义可复用的提示模板(例如系统角色设定)。 * 在 Chain 中构建复杂的提示逻辑。 * **直接使用 `Message` 时**: * 处理固定的消息内容(如预定义的系统指令)。 * 存储或传递模型返回的结果。 * 管理对话历史记录(`ChatMessageHistory` 存储的是 `Message` 对象)。 在 LangChain 实践中,**`MessageTemplate`(尤其是 `ChatPromptTemplate`)是构建 Prompt 流水线的核心工具**,[用于灵活组装对话上下文](^3^);而 `Message` 是生成后可直接操作的实体。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值