🎯 课程主题
系统讲解LangChain中的消息(Message)体系:四种消息类型、消息的内部结构、以及JSON格式与对象格式两种消息表示方式,为后续提示词模板的学习奠定基础。
📝 核心知识点
1. 消息(Message)的概念与作用
- 概念说明:消息是对话模型交互的最基础单位,输入为不同角色的消息列表,输出为AI消息。
- 关键细节:
- 大模型本身无记忆(无状态),输出只取决于当前输入内容
- 通过消息列表承载历史对话内容,传递给模型,使其具备"记忆"能力
- LangChain v1.0 提出
content_blocks实现跨模型的统一消息标准(后续详述),提升兼容性、可扩展性和可追踪性
2. 消息的内部结构
- 概念说明:每条消息包含三个核心字段。
- 关键细节:
role:消息角色,标明谁在说话content:消息的文字内容metadata:元信息,包含时间戳、对话轮次ID、Token 统计等
3. 四种消息类型
- 概念说明:
类型 Role值 说明 系统消息 (SystemMessage) system设定AI的角色、行为准则和背景信息 用户消息 (HumanMessage) user用户的提问/输入(推荐用 user而非human)AI回复消息 (AIMessage) assistant模型的回复内容,可能包含工具调用 工具消息 (ToolMessage) tool工具调用的返回结果,后续反馈给模型 - 关键细节:
- 工具消息的流程:用户提问 → AI回复含工具调用 → 工具执行返回ToolMessage → 再次传给模型 → 模型根据工具结果生成最终回复
- 使用不同消息类型的好处:明确区分角色便于筛选、通过 system message 精确控制AI行为、构建完整多轮对话上下文、便于调试
4. JSON格式消息
- 概念说明:以字典列表形式表示消息,每个字典包含
role和content字段。 - 关键细节:
messages = [ {"role": "system", "content": "你是一个友好的AI助手"}, {"role": "user", "content": "1+2等于多少?"}, {"role": "assistant", "content": "3"}, {"role": "user", "content": "我刚才问了什么问题?"} ]- role 值:
system、user(非human)、assistant(非ai)
- role 值:
5. 对象格式消息
- 概念说明:使用 LangChain 提供的消息类创建消息对象列表。
- 关键细节:
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage messages = [ SystemMessage(content="你是一个友好的AI助手"), HumanMessage(content="1+2等于多少?"), AIMessage(content="3"), HumanMessage(content="我刚才问了什么问题?") ]- 对于纯文本内容,
content=参数名可以省略 - 对象格式用于多模态场景时
content参数有特殊用法(后续讲解) - 两种格式等效,均可直接传入
model.invoke()
- 对于纯文本内容,
🏗️ 架构与工作流
消息交互流程(含工具调用):
┌─────────┐ ┌─────────────────┐ ┌─────────┐
│ User │───→│ SystemMessage │───→│ │
│ Message │ │ (角色设定) │ │ │
└─────────┘ ├─────────────────┤ │ Model │
│ HumanMessage │───→│ (大模型) │
│ (用户问题) │ │ │
└─────────────────┘ └────┬────┘
│
┌───────────┴───────────┐
│ │
┌────▼────┐ ┌──────▼──────┐
│AIMessage│ │ AIMessage │
│(直接回复)│ │(含tool_calls)│
└─────────┘ └──────┬──────┘
│
┌───────▼───────┐
│ ToolMessage │
│ (工具返回结果) │
└───────┬───────┘
│
▼
┌─────────┐
│ Model │
│ (最终回复)│
└─────────┘
💻 代码实战
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o-mini")
# ===== 举例1:JSON格式消息 =====
messages_json = [
{"role": "system", "content": "你是一个友好的AI助手"},
{"role": "user", "content": "1+2等于多少?"},
{"role": "assistant", "content": "3"},
{"role": "user", "content": "我刚才问了什么问题?"}
]
response = model.invoke(messages_json)
print(response.content)
# ===== 举例2:消息对象格式 =====
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
messages_obj = [
SystemMessage(content="你是一个友好的AI助手"),
HumanMessage(content="1+2等于多少?"),
AIMessage(content="3"),
HumanMessage(content="我刚才问了什么问题?")
]
response = model.invoke(messages_obj)
print(response.content)
# ===== 举例3:系统消息控制AI行为 =====
messages = [
SystemMessage(content="你是一个只会用文言文回答的古代书生"),
HumanMessage(content="今天天气怎么样?")
]
response = model.invoke(messages)
print(response.content) # 模型将以文言文风格回复
⚠️ 常见问题与避坑指南
- JSON格式中 role 必须使用
"user"和"assistant",不要写成"human"或"ai" - 对象格式中
content参数名在纯文本场景下可省略(如HumanMessage("内容")),多模态场景需显式指定 - 工具消息(ToolMessage)目前仅做概念了解,后续 tools 章节会重点讲解
- LangChain v1.0 的
content_blocks是对现有 content 结构的替换方案,目的是跨模型统一标准,后续会详述
💡 个人总结与延伸
消息(Message)体系是 LangChain 构建多轮对话和智能 Agent 的基石。理解四种消息类型及其使用场景至关重要:SystemMessage 控制行为边界,HumanMessage/AIMessage 维护对话历史,ToolMessage 衔接工具调用闭环。JSON 格式与对象格式功能等价,实际开发中推荐使用对象格式(类型安全、IDE 友好),但需理解 JSON 格式以便阅读 API 文档和调试时查看原始数据。消息的多模态扩展(content_blocks)是 v1.0 的重要更新,值得后续关注。