W
AI-Wiki
CONCEPT

LangChain消息对象体系

基本定义

LangChain消息对象体系是LangChain框架中用于表示与大语言模型交互时各类消息的标准化数据结构,全部为Python对象形式,是ChatModel组件的核心交互载体。该体系统一了不同大模型厂商的对话接口格式,无需针对不同模型单独做消息格式适配,同时原生支持多轮对话上下文管理与动态参数填充,可显著降低LLM对话类应用的开发成本。

核心组件分类

基础消息类型

基础消息对应对话中不同角色的固定消息结构,共包含4类:

  1. SystemMessage:用于传递系统指令或背景信息,通常放在对话列表开头,用于设定模型的身份、回复规则等全局约束,示例:SystemMessage(content="你是一个乐于助人的助手,回答需要简洁准确")
  2. HumanMessage:用于传递用户输入的消息,通常包含用户的问题、指令或需求,示例:HumanMessage(content="如何使用Python处理JSON数据?")
  3. AIMessage:用于传递大模型生成的回复内容,记录模型的输出结果,示例:AIMessage(content="要处理JSON数据,你可以使用Python标准库的json模块调用load、dump等方法实现读写")
  4. ChatMessage:支持自定义角色的通用消息类型,适用于需要新增非标准角色的特殊场景,示例:ChatMessage(role="critic", content="这个方案的并发性能存在不足,需要优化IO调度逻辑")

可参数化消息模板

消息模板是支持动态填充变量的可复用消息结构,可根据运行时参数生成对应类型的基础消息,共包含3类:

  1. HumanMessagePromptTemplate:用于生成可参数化的用户消息模板,示例:HumanMessagePromptTemplate.from_template("我想了解关于{topic}的基础使用方法"),运行时传入topic参数即可生成对应HumanMessage
  2. SystemMessagePromptTemplate:用于生成可参数化的系统消息模板,示例:SystemMessagePromptTemplate.from_template("你是{domain}领域的专家,回答仅涉及该领域相关内容")
  3. AIMessagePromptTemplate:用于生成可参数化的AI消息模板,使用频率较低,仅在需要预设AI回复框架的特殊场景下使用,常规场景下AI回复均为模型动态生成。

动态占位符组件

MessagePlaceholder是体系内的特殊组件,作用为预留位置动态插入消息列表,专门适配多轮对话上下文动态拼接场景,可自动保留插入消息的角色属性,无需开发者手动拼接单条消息。

通用核心属性

所有消息对象统一包含4个核心属性:

  1. content:存储消息的实际文本内容,为消息的必填属性
  2. role/type:标识消息的角色类型,固定取值为system、user、assistant或自定义角色名
  3. additional_kwargs:附加关键字参数,可存储开发者自定义的扩展元数据
  4. response_metadata:仅AIMessage携带的响应元数据,包含模型版本、Token消耗、请求ID等调用相关信息。

典型使用流程

  1. 根据需求构造基础消息对象,或填充消息模板生成对应类型的消息
  2. 将所有消息按对话发生的时间顺序组合为列表形式的对话历史
  3. 将对话历史列表作为参数传入ChatModel的invoke接口,完成大模型调用

示例代码如下:

from langchain_core.messages import SystemMessage, HumanMessage, AIMessage

# 创建消息对象
system_msg = SystemMessage(content="你是一个Python编程专家")
human_msg = HumanMessage(content="如何在Python中读取CSV文件?")
ai_msg = AIMessage(content="你可以使用pandas库来读取CSV文件...")

# 将消息对象组合成对话历史
conversation = [system_msg, human_msg, ai_msg]

# 将对话历史传递给语言模型
response = llm.invoke(conversation)

边界与注意事项

  1. 普通对话场景无需使用ChatMessage,仅当需要自定义非标准角色(如审核员、评论员等)时使用
  2. MessagePlaceholder仅用于接收消息列表类型的变量,不能用于填充单个文本变量,否则会出现格式错误
  3. 不同大模型对SystemMessage的支持程度不同,部分开源模型可能无法识别系统指令,需根据所用模型调整消息结构。

相关条目