【LangChain学习笔记】Message

核心定义: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 的关键用法场景

MessageLangChain 交互核心,核心应用场景包括对话上下文构建、智能体工具交互等,具体如下:

构建对话上下文

SystemMessageHumanMessageAIMessage按顺序组成列表作为上下文传递给模型,即可实现多轮对话。

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模块。

总结

MessageLangChain交互的"数据核心",通过标准化角色与格式,实现用户、系统、模型、工具间的顺畅流转。核心需掌握各类Message的用途、属性,以及在对话上下文构建、智能体工具交互中的流转逻辑。

掌握其核心逻辑,可深入理解LangChain组件交互原理,为构建复杂对话系统、智能体应用奠定基础。

相关推荐
阿里云大数据AI技术15 小时前
一套底座支撑多场景:高德地图基于 Paimon + StarRocks 轨迹服务实践
人工智能
云擎算力平台omniyq.com15 小时前
CES 2026观察:从“物理AI”愿景看行业算力基础设施演进
人工智能
想用offer打牌16 小时前
一站式了解Spring AI Alibaba的流式输出
java·人工智能·后端
黑符石16 小时前
【论文研读】Madgwick 姿态滤波算法报告总结
人工智能·算法·机器学习·imu·惯性动捕·madgwick·姿态滤波
JQLvopkk16 小时前
智能AI“学习功能”在程序开发部分的逻辑
人工智能·机器学习·计算机视觉
我的offer在哪里16 小时前
Hugging Face:让大模型触手可及的魔法工厂
人工智能·python·语言模型·开源·ai编程
收获不止数据库16 小时前
黄仁勋2026CES演讲复盘:旧世界,裂开了!
大数据·数据库·人工智能·职场和发展
老胡全房源系统16 小时前
房产中介管理系统哪一款性价比高
大数据·人工智能·房产经纪人培训