☰
LangChain 核心:Message 消息结构(System/Human/AI/ToolMessage)
2026/10/29 2:19:26 网站建设 项目流程

Message:消息结构

本章定位

Message 是对话模型的输入、输出基础结构。 看似写model.invoke("你好")传了字符串,底层在 LangChain 里会自动包装成消息列表。模型真正接收的是一组 messages。

不管是发给模型的用户提问、模型返回的回答、工具调用请求、工具返回结果,全部都以 Message 对象放进 messages 列表。 每条消息包含两个核心信息:是谁说的 + 说了什么。

字典写法(贴近原生 OpenAI 接口)

messages = [ {"role": "system", "content": "你是一个乐于助人的 AI 助手。"}, {"role": "user", "content": "你好,我是教 AI 的老师。"}, {"role": "assistant", "content": "你好,老师,很高兴认识你。"}, {"role": "user", "content": "请查询 SpaceX 最近 7 天的最新消息。"}, ]

LangChain 对象写法(推荐,类型清晰)

from langchain_core.messages import SystemMessage, HumanMessage, AIMessage messages = [ SystemMessage(content="你是一个乐于助人的 AI 助手。"), HumanMessage(content="你好,我是教 AI 的老师。"), AIMessage(content="你好,老师,很高兴认识你。"), HumanMessage(content="请查询 SpaceX 最近 7 天的最新消息。"), ]

Message 的核心价值:结构化保存上下文,模型可以清晰区分系统规则、用户问题、模型回复、工具结果。


Message 在 Agent 中的整体 Demo

实线:消息、数据流转;虚线:Agent 流程控制。

重点:Agent 里的 messages 不只是聊天记录,还保存完整任务执行步骤: 用户任务 → 模型判断是否调用工具 → 发起工具调用 → 工具执行 → 工具结果回填消息列表 → 模型结合结果继续回答

各消息角色定位

  • SystemMessage:系统角色、全局规则
  • HumanMessage:用户输入
  • AIMessage:模型回答,也可以携带工具调用参数
  • ToolMessage:工具执行后的返回结果
  • messages列表:上下文容器,传给模型的完整记忆
  • Agent:调度器,负责循环调用模型、工具、追加消息

agent_messages_demo.py

from langchain.agents import create_agent from langchain_core.messages import SystemMessage, HumanMessage, AIMessage from langchain_deepseek import ChatDeepSeek from langchain_tavily import TavilySearch from dotenv import load_dotenv load_dotenv() web_search = TavilySearch(max_results=2) model = ChatDeepSeek(model="deepseek-chat") agent = create_agent( model=model, tools=[web_search], system_prompt="你是一名多才多艺的智能助手,可以调用工具帮助用户解决问题。", ) res = agent.invoke({ "messages": [ {"role": "system", "content": "你是一个乐于助人的 AI 助手。"}, {"role": "user", "content": "你好,我是教 AI 的 Yuan 老师。"}, {"role": "assistant", "content": "你好,Yuan 老师,很高兴认识你。"}, {"role": "user", "content": "请查询 SpaceX 最近 7 天的最新消息。"}, ] }) for message in res["messages"]: message.pretty_print()

Tavily 官网:Tavily API Platform 运行后会打印完整消息链:系统消息、用户消息、AI消息(带tool_call)、ToolMessage、最终AI回答。


为什么对话模型围绕 messages 展开

大模型需要区分每一句话是谁发出的。

roleLangChain 类含义
systemSystemMessage系统提示、角色设定、约束规则
userHumanMessage用户提问
assistantAIMessage模型输出
toolToolMessage工具返回结果

纯字符串拼接也能模拟角色,但只是文本,不是结构化字段,模型服务端无法原生识别。

  • 字符串写法:角色是写给模型“猜”的文本
  • messages写法:role 是API协议原生支持的结构化字段

简单问答可以凑合用字符串;一旦进入多轮对话、工具调用、Agent、多模态,必须用结构化消息,工具调用需要绑定 call_id,记录哪次调用对应哪个结果,字符串很难稳定维护。

一句话总结:messages 是给程序和模型服务识别的结构化上下文,不是给人阅读的文本。


LangChain 常见 Message 类型

  1. SystemMessage用于设定角色、回答规范、约束。
from langchain_core.messages import SystemMessage msg = SystemMessage(content="你是一个乐于助人的 AI 助手。")
  1. HumanMessage用户输入,对应原生 role:user
from langchain_core.messages import HumanMessage msg = HumanMessage(content="帮我查询订单物流。")
  1. AIMessage模型输出,对应原生 role:assistant;支持携带 tool_calls 工具调用参数
from langchain_core.messages import AIMessage msg = AIMessage(content="请提供你的订单号。")
  1. ToolMessage工具返回结果,必须绑定 tool_call_id,和模型发起的工具调用一一对应
from langchain_core.messages import ToolMessage msg = ToolMessage( content="订单 CN10001 当前正在派送中。", tool_call_id="call_001" )

用 Message 调用模型

两种写法对比

字典写法:贴近原生SDK,迁移方便,适合快速测试

Message 对象写法:类型安全,扩展性强,LangChain、Agent 项目优先使用

# 对象写法示例 from langchain_core.messages import SystemMessage, HumanMessage, AIMessage messages = [ SystemMessage(content="你是一个乐于助人的 AI 助手。"), HumanMessage(content="你好,我是Yuan老师。"), AIMessage(content="你好,很高兴认识你。"), HumanMessage(content="我刚才说我是谁?"), ] response = model.invoke(messages) print(response.content)

维护历史消息

大模型API是无状态的:本次请求传什么,模型就只能看到什么,不会自动记住上一轮对话。 多轮对话原理:业务代码手动维护消息列表,每一轮把新消息追加进去。

基础多轮示例

from langchain_core.messages import HumanMessage, SystemMessage from langchain.chat_models import init_chat_model from dotenv import load_dotenv import os load_dotenv() model = init_chat_model( model="deepseek-v4-pro", model_provider="deepseek", api_key=os.getenv("DEEPSEEK_API_KEY") ) messages = [SystemMessage(content="你是一个乐于助人的 AI 助手。")] # 第一轮 messages.append(HumanMessage(content="你好,我叫 Yuan。")) response = model.invoke(messages) print(response.content) messages.append(response) # 第二轮 messages.append(HumanMessage(content="我叫什么名字?")) response = model.invoke(messages) print(response.content) messages.append(response)

循环交互式聊天版本

from langchain_core.messages import HumanMessage, SystemMessage messages = [SystemMessage(content="你是一个乐于助人的 AI 助手。")] while True: user_input = input("你:") if user_input.lower() in {"exit", "quit"}: break messages.append(HumanMessage(content=user_input)) response = model.invoke(messages) print("助手:", response.content) messages.append(response)

后续学习的 Memory、checkpointer、Agent state,底层本质都是持久化、管理 messages 消息列表。

补充:阿里云百炼SDK多轮对话,底层逻辑同样是不断追加 messages。 参考:通义千问模型的多轮对话-大模型服务平台百炼(Model Studio)-阿里云帮助中心


多模态消息

文本模式:HumanMessage 的 content 是字符串 多模态模式:Message 对象不变,content 变成数组,里面放图片、音频、视频+文本块,不需要单独一套消息体系。

图片问答示例

from langchain_core.messages import HumanMessage msg = HumanMessage(content=[ {"type": "text", "text": "请描述这张图片。"}, { "type": "image_url", "image_url": {"url": "[https://example.com/image.jpg](https://example.com/image.jpg)"} }, ])

音频ASR示例

from langchain.chat_models import init_chat_model from dotenv import load_dotenv import os from langchain_core.messages import SystemMessage, HumanMessage, AIMessage load_dotenv() model = init_chat_model( model="qwen3-asr-flash", model_provider="openai", base_url="[https://dashscope.aliyuncs.com/compatible-mode/v1](https://dashscope.aliyuncs.com/compatible-mode/v1)", api_key=os.getenv("DASHSCOPE_API_KEY") ) messages = [ HumanMessage(content=[ { "type": "input_audio", "input_audio": {"data": "[https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3](https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3)"} } ]) ] res = model.invoke(messages) print(res)

视频提取字幕示例

from langchain.chat_models import init_chat_model from dotenv import load_dotenv import os from langchain_core.messages import SystemMessage, HumanMessage, AIMessage load_dotenv() model = init_chat_model( model="qwen3.5-omni-plus", model_provider="openai", base_url="[https://dashscope.aliyuncs.com/compatible-mode/v1](https://dashscope.aliyuncs.com/compatible-mode/v1)", api_key=os.getenv("DASHSCOPE_API_KEY") ) messages = [ HumanMessage(content=[ { "type": "video_url", "video_url": { "url": "[https://aweme.snssdk.com/aweme/v1/play/?video_id=v0200fg10000cuhogevog65hkurqon00&ratio=720p&line=0](https://aweme.snssdk.com/aweme/v1/play/?video_id=v0200fg10000cuhogevog65hkurqon00&ratio=720p&line=0)" }, }, {"type": "text", "text": "请只提取这段视频中的语音内容,转写成文字。区分说话人。"} ]) ] res = model.invoke(messages) print(res.content)

注意:能否支持图片/音频/视频,取决于模型本身;不同厂商的多模态字段格式略有差异。 一句话:多模态依然是 Message,只是 content 结构升级。


本章小结

Message 是 LangChain 的结构化上下文载体,区分消息角色,支撑多轮对话、工具调用、Agent、多模态。

问答

1:LangChain 的 Message 是什么?为什么模型输入优先使用 messages,而不是直接传字符串? 答:Message 是带角色的结构化消息。字符串只是文本,API无法原生识别角色;messages 的 role 是协议字段,方便多轮、工具调用、Agent 流程。

2:SystemMessage、HumanMessage、AIMessage、ToolMessage 分别作用?

答:SystemMessage 系统角色;HumanMessage 用户输入;AIMessage 模型回答/工具调用;ToolMessage 工具返回结果,绑定 call_id。

3:多轮对话里,大模型会自己记住聊天记录吗?

答:不会,模型无状态。需要我们维护 messages 列表,每一轮追加新消息。

4:多模态消息是不是独立的一套消息类型?

答:不是,仍然是 HumanMessage,只是 content 从字符串变成包含图片、音频、视频的结构化数组。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询