核心定义:Message 是什么?
Message(消息)是 LangChain 中封装用户输入、大模型输出、系统指令等交互信息的标准化数据结构,是大模型与外部组件(提示模板、记忆组件、智能体等)间数据传递的核心载体。
通俗理解:Message 就像"交互对话的标准化信封",用户问题、系统规则、模型回答均需封装为该格式,才能在 LangChain 生态组件间顺畅流转。
核心作用:统一交互数据格式,保障不同组件(如记忆组件存储对话、提示模板拼接上下文)能正确识别处理对话信息。
核心 Message 类型及用途
LangChain 定义了多种 Message 类型适配不同交互场景,均继承自 BaseMessage 类,具备 content(消息内容)、role(角色标识)等统一基础属性,各类型详情如下:
HumanMessage:用户消息
• 用途:封装用户问题、指令、需求等输入内容;
• 核心属性:
content: str:核心输入内容(必填);role: str:固定为"user",标识用户角色;additional_kwargs: dict(可选):存储用户ID、时间戳等元数据。
• 示例代码:
python
from langchain_core.messages import HumanMessage
# 初始化用户消息
human_msg = HumanMessage(content="请解释什么是 LangChain Message?")
print(human_msg)
# 输出:HumanMessage(content='请解释什么是 LangChain Message?', role='user')
AIMessage:大模型消息
• 用途:封装大模型的回答、推理过程或工具调用指令;
• 核心属性:
content: str:模型输出内容(必填,工具调用场景可空);role: str:固定为"assistant",标识模型角色;additional_kwargs: dict(可选):工具调用场景含tool_calls字段,存储工具参数与调用ID;tool_calls: List[Dict](可选):工具调用信息列表,与additional_kwargs["tool_calls"]等效。
• 示例代码:
python
from langchain_core.messages import AIMessage
# 初始化大模型消息
ai_msg = AIMessage(content="LangChain Message 是标准化的交互数据结构,用于封装对话信息...")
print(ai_msg)
# 输出:AIMessage(content='LangChain Message 是标准化的交互数据结构,用于封装对话信息...', role='assistant')
SystemMessage:系统消息
• 用途:封装系统级指令(定义模型角色、行为规则等),仅对模型生效,用户不可见;
• 核心作用:引导模型按规则响应(如"专业Python开发助手""回答不超过3句话");
• 核心属性:
content: str:系统指令内容(必填);role: str:固定为"system",标识系统角色;additional_kwargs: dict(可选):存储指令优先级、生效范围等元数据。
• 示例代码:
python
from langchain_core.messages import SystemMessage
# 初始化系统消息
system_msg = SystemMessage(content="你是专业的LangChain技术助手,回答需准确、简洁,基于官方文档内容。")
print(system_msg)
# 输出:SystemMessage(content='你是专业的LangChain技术助手,回答需准确、简洁,基于官方文档内容。', role='system')
ToolMessage:工具消息
• 用途:封装数据库查询、API返回、文件读取等工具调用结果;
• 适用场景:智能体调用工具后,结果需封装为该类型回传模型,供后续推理;
• 核心属性:
content: str:工具执行结果(必填),建议用JSON等结构化格式;role: str:固定为"tool",标识工具角色;tool_call_id: str(必填):关联对应AIMessage的工具调用ID,匹配"请求-结果";additional_kwargs: dict(可选):存储工具名称、执行时间、错误信息等。
• 示例代码:
python
from langchain_core.messages import ToolMessage
# 初始化工具消息(模拟文件读取结果)
tool_msg = ToolMessage(
content='{"filename": "langchain_intro.txt", "content": "LangChain 是大模型应用开发框架..."}',
tool_call_id="call_123" # 关联工具调用ID
)
print(tool_msg)
FunctionMessage:函数调用消息
• 用途:封装函数调用的请求或结果(与ToolMessage类似,侧重通用函数场景);
• 核心属性:含 content(请求/结果,必填)、role="function"(固定角色)、name(函数名,必填)等;
• 注意:部分版本与ToolMessage合并,优先使用ToolMessage处理工具/函数场景。
ChatMessage:通用聊天消息
• 用途:通用型消息,支持自定义角色,适配非标准交互场景;
• 核心属性:
content: str:核心消息内容(必填);role: str(必填):自定义角色标识,如"admin""user_1";additional_kwargs: dict(可选):存储角色权限、所属分组等元数据。
• 示例代码:
python
from langchain_core.messages import ChatMessage
# 初始化自定义角色消息
chat_msg = ChatMessage(content="请同步最新的开发文档", role="admin")
print(chat_msg)
# 输出:ChatMessage(content='请同步最新的开发文档', role='admin')
Message 的关键用法场景
Message 是 LangChain 交互核心,核心应用场景包括对话上下文构建、智能体工具交互等,具体如下:
构建对话上下文
将SystemMessage、HumanMessage、AIMessage按顺序组成列表作为上下文传递给模型,即可实现多轮对话。
python
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAI
from langchain.agents import create_agent
from langchain_core.callbacks import StdOutCallbackHandler
# 构建对话上下文
messages = [
SystemMessage(content="你是简洁的技术助手,回答不超过2句话。"),
HumanMessage(content="什么是 LangChain?"),
]
# 初始化模型
llm = ChatOpenAI(
model_name="qwen-plus",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key="你的API Key"
)
# 创建智能体并调用
agent = create_agent(model=llm, debug=True)
response = agent.invoke(
{"messages": messages},
config={"callbacks": [StdOutCallbackHandler()]}
)
print(response)
python
{
"messages": [
SystemMessage(content="你是简洁的技术助手,回答不超过2句话。"),
HumanMessage(content="什么是 LangChain?"),
AIMessage(content="LangChain 是构建语言模型应用的框架,支持链式调用、记忆管理和外部工具集成,助力高效开发大模型应用。")
]
}
智能体工具交互
智能体调用工具时,工具请求封装为含调用参数的AIMessage,执行结果封装为ToolMessage回传,模型基于结果继续推理。完整示例如下:
python
from mcp.server.fastmcp import FastMCP
# 定义数学运算工具服务
mcp = FastMCP("数学运算Tools")
@mcp.tool()
def sum(num1: int, num2: int) -> int:
return num1 + num2
@mcp.tool()
def sub(num1: int, num2: int) -> int:
return num1 - num2
@mcp.tool()
def mul(num1: int, num2: int) -> int:
return num1 * num2
@mcp.tool()
def div(num1: int, num2: int) -> float:
return num1 / num2
if __name__ == "__main__":
mcp.run("stdio")
python
from mcp import StdioServerParameters
from mcp.client.session import ClientSession
from mcp.client.stdio import stdio_client
from langchain_mcp_adapters.client import load_mcp_tools
import os
from langchain_openai import ChatOpenAI
from langchain.agents import create_agent
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.callbacks import StdOutCallbackHandler
import asyncio
async def create_mcp_client():
# 连接工具服务
server_params = StdioServerParameters(
command="python",
args=[os.path.join(os.path.dirname(__file__), "mcp_stdio_server.py")],
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await load_mcp_tools(session)
# 初始化模型与智能体
model = ChatOpenAI(
model_name="qwen-plus",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key="你的API Key"
)
agent = create_agent(model=model, tools=tools, debug=True)
# 构建提示与请求
prompt = ChatPromptTemplate.from_messages([
("system", "你是数学工具智能体,用sum/sub/mul/div计算,遵循先乘后加,仅输出最终数值。"),
("human", "{expr}")
])
response = await agent.ainvoke(
{"messages": prompt.format_messages(expr="100+200*300")},
config={"callbacks": [StdOutCallbackHandler()]}
)
print(response["messages"])
if __name__ == "__main__":
asyncio.run(create_mcp_client())
python
{
"messages": [
SystemMessage(content="你是数学工具智能体。请严格使用提供的工具(sum/sub/mul/div) 计算表达式,遵循先乘后加的规则,只输出最终数值。"),
HumanMessage(content="100+200*300"),
AIMessage(
content="",
tool_calls=[
{"name": "mul", "args": {"num1": 200, "num2": 300}, "type": "tool_call"},
{"name": "sum", "args": {"num1": 100, "num2": 60000}, "type": "tool_call"}
]
),
ToolMessage(content=[{"type": "text", "text": "60000"}], name="mul", artifact={"structured_content": {"result": 60000}}),
ToolMessage(content=[{"type": "text", "text": "60100"}], name="sum", artifact={"structured_content": {"result": 60100}}),
AIMessage(content="60100")
]
}
关键注意事项
- 角色匹配 :模型对角色敏感,需确保各
Message角色标识正确,否则可能响应异常; - 顺序影响:对话上下文需按时间顺序排列(系统消息在前,后续为用户-模型交互历史),顺序错误影响上下文理解;
- 关联ID必填 :
ToolMessage必须通过tool_call_id关联对应AIMessage,确保"请求-结果"匹配; - 序列化存储 :持久化对话历史可通过
to_dict()转字典存储,读取时用from_dict()反序列化; - 版本兼容 :旧版本
Message类型名称可能不同(如ChatMessageType),建议使用最新langchain_core.messages模块。
总结
Message是LangChain交互的"数据核心",通过标准化角色与格式,实现用户、系统、模型、工具间的顺畅流转。核心需掌握各类Message的用途、属性,以及在对话上下文构建、智能体工具交互中的流转逻辑。
掌握其核心逻辑,可深入理解LangChain组件交互原理,为构建复杂对话系统、智能体应用奠定基础。