LangChain核心组件之Messages

在 LangChain 中,消息(Messages) 是模型上下文的基本单元。它们代表了模型的输入与输出,既包含实际内容,也携带元数据,用于在与大语言模型(LLM)交互时完整表达对话状态。

消息对象包含以下三个核心部分:

  • 角色(Role) —— 标识消息类型(例如 system、user)
  • 内容(Content) —— 表示消息的实际载荷(如文本、图像、音频、文档等)
  • 元数据(Metadata) —— 可选字段,例如响应信息、消息 ID、Token 使用量等

LangChain 提供了一套标准化的消息类型,可在所有模型提供商之间通用,确保无论调用哪个模型,行为都保持一致。

基础用法

使用消息最简单的方式是创建消息对象,并在 调用(invoke) 模型时传入。

from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage, AIMessage, SystemMessage

model = init_chat_model("gpt-5-nano")

system_msg = SystemMessage("你是一个乐于助人的助手。")
human_msg = HumanMessage("你好,最近怎么样?")

# 用于聊天模型
messages = [system_msg, human_msg]
response = model.invoke(messages)  # 返回 AIMessage
纯文本提示(Text Prompts)

纯文本提示就是字符串,适用于不需要保留对话历史的简单生成任务。

response = model.invoke("写一首关于春天的俳句")

适合使用纯文本提示的场景:

  • 请求是单次且独立的
  • 不需要维护对话历史
  • 希望代码尽可能简洁
消息提示(Message Prompts)

你也可以通过传入一个消息对象列表来与模型交互。

from langchain.messages import SystemMessage, HumanMessage, AIMessage

messages = [
    SystemMessage("你是一位诗歌专家"),
    HumanMessage("写一首关于春天的俳句"),
    AIMessage("樱花盛开……")
]
response = model.invoke(messages)

适合使用消息提示的场景:

  • 管理多轮对话
  • 处理多模态内容(图像、音频、文件等)
  • 需要系统指令(system instructions)
字典格式(Dictionary Format)

你还可以直接使用 OpenAI 聊天补全(chat completions)的字典格式来定义消息。

messages = [
    {"role": "system", "content": "你是一位诗歌专家"},
    {"role": "user", "content": "写一首关于春天的俳句"},
    {"role": "assistant", "content": "樱花盛开……"}
]
response = model.invoke(messages)

消息类型(Message Types)

  • 系统消息(System Message) —— 告诉模型应如何行为,并为交互提供上下文
  • 人类消息(Human Message) —— 表示用户输入和与模型的交互
  • AI 消息(AI Message) —— 模型生成的响应,包括文本、工具调用和元数据
  • 工具消息(Tool Message) —— 表示 工具调用(tool calls) 的执行结果
系统消息(System Message)

SystemMessage 用于提供初始指令,引导模型的行为。你可以用它设定语气、定义角色、制定回答规范。

  • 基础指令
# 基础指令
system_msg = SystemMessage("你是一个乐于助人的编程助手。")
messages = [system_msg, HumanMessage("如何创建一个 REST API?")]
response = model.invoke(messages)
  • 详细人设
# 详细人设
from langchain.messages import SystemMessage, HumanMessage

system_msg = SystemMessage("""
你是一位资深 Python 开发者,精通 Web 框架。
请始终提供代码示例并解释你的思路。
回答要简洁但全面。
""")

messages = [system_msg, HumanMessage("如何创建一个 REST API?")]
response = model.invoke(messages)
人类消息(Human Message)

HumanMessage 表示用户的输入,可包含文本、图像、音频、文件等任意形式的多模态 内容(content)。

  1. 文本内容
  • 使用消息对象
response = model.invoke([
  HumanMessage("什么是机器学习?")
])
  • 使用字符串
# 字符串是 HumanMessage 的快捷写法
response = model.invoke("什么是机器学习?")
  1. 消息元数据
human_msg = HumanMessage(
    content="你好!",
    name="alice",   # 可选:标识不同用户
    id="msg_123",   # 可选:用于追踪的唯一 ID
)

name 字段的行为因提供商而异——有些用于用户识别,有些则忽略。具体行为请参考对应模型提供商的 集成文档

AI 消息(AI Message)

AIMessage 表示模型调用的输出结果,可能包含多模态数据、工具调用和提供商特定的元数据。

response = model.invoke("解释一下人工智能")
print(type(response))  # <class 'langchain.messages.AIMessage'>

模型调用后返回的 AIMessage 对象包含了响应中的全部关联元数据。

由于不同提供商对消息类型的处理方式不同,有时你需要手动创建一个 AIMessage,并将其插入到对话历史中,模拟模型的回复。

from langchain.messages import AIMessage, SystemMessage, HumanMessage

# 手动创建 AI 消息(例如用于对话历史)
ai_msg = AIMessage("我很乐意帮你解答这个问题!")

# 添加到对话历史
messages = [
    SystemMessage("你是一个乐于助人的助手"),
    HumanMessage("你能帮我吗?"),
    ai_msg,  # 模拟模型回复
    HumanMessage("太好了!2+2 等于多少?")
]

response = model.invoke(messages)

AIMessage属性:

  • text string
    消息的文本内容。
  • content string | dict[]
    消息的原始内容。
  • content_blocks ContentBlock[]
    消息的标准化 内容块(content blocks)
  • tool_calls dict[] | None
    模型发起的工具调用。若未调用工具,则为空。
  • id string
    消息的唯一标识符(由 LangChain 自动生成或由提供商返回)。
  • usage_metadata dict | None
    消息的使用元数据,包含 Token 统计信息(如有)。
  • response_metadata ResponseMetadata | None
    消息的响应元数据。
工具调用(Tool Calls)

当模型执行 工具调用(tool calling) 时,相关信息会包含在 AIMessage 中:

from langchain.chat_models import init_chat_model

model = init_chat_model("gpt-5-nano")

def get_weather(location: str) -> str:
    """获取某地的天气。"""
    ...

model_with_tools = model.bind_tools([get_weather])
response = model_with_tools.invoke("巴黎的天气怎么样?")

for tool_call in response.tool_calls:
    print(f"工具: {tool_call['name']}")
    print(f"参数: {tool_call['args']}")
    print(f"ID: {tool_call['id']}")

其他结构化数据(如推理过程、引用来源等)也可能出现在消息的 内容(content) 中。

Token 使用量

AIMessage 可在其 usage_metadata 字段中记录 Token 使用情况:

from langchain.chat_models import init_chat_model

model = init_chat_model("gpt-5-nano")

response = model.invoke("你好!")
response.usage_metadata

输出示例:

{
  'input_tokens': 8,
  'output_tokens': 304,
  'total_tokens': 312,
  'input_token_details': {'audio': 0, 'cache_read': 0},
  'output_token_details': {'audio': 0, 'reasoning': 256}
}

详见 UsageMetadata

流式传输与分块(Streaming and Chunks)

在流式传输过程中,你会收到 AIMessageChunk 对象,可将其合并为完整消息:

chunks = []
full_message = None
for chunk in model.stream("你好"):
    chunks.append(chunk)
    print(chunk.text)
    full_message = chunk if full_message is None else full_message + chunk

了解更多:

工具消息(Tool Message)

对于支持 工具调用(tool calling) 的模型,AI 消息可包含工具调用请求。工具消息(ToolMessage) 则用于将单个工具执行的结果传回给模型。

工具(Tools) 可直接生成 ToolMessage 对象。下面是一个简化示例(完整用法请参阅 工具指南):

from langchain.messages import AIMessage, ToolMessage

# 模型发起工具调用(此处为手动构造示例)
ai_message = AIMessage(
    content=[],
    tool_calls=[{
        "name": "get_weather",
        "args": {"location": "旧金山"},
        "id": "call_123"
    }]
)

# 执行工具并创建结果消息
weather_result = "晴天,72°F"
tool_message = ToolMessage(
    content=weather_result,
    tool_call_id="call_123"  # 必须与调用 ID 匹配
)

# 继续对话
messages = [
    HumanMessage("旧金山的天气怎么样?"),
    ai_message,     # 模型的工具调用
    tool_message,   # 工具执行结果
]
response = model.invoke(messages)  # 模型处理结果

参数:

  • content stringr equired
    工具调用结果的字符串化输出。
  • tool_call_id string required
    此消息所对应的工具调用 ID,必须与 AIMessage 中的 ID 一致。
  • name string required
    被调用的工具名称。
  • artifact dict
    额外数据,不会发送给模型,但可被程序访问。

artifact 字段用于存储不发送给模型但可供程序使用的补充数据,例如原始结果、调试信息或下游处理所需的数据,避免污染模型上下文。 例如,一个 检索(retrieval) 工具可能从文档中提取一段文字供模型参考。此时,content 包含模型可见的文本,而 artifact 可包含文档 ID 或页码等元数据,供应用程序使用(如渲染页面):

from langchain.messages import ToolMessage

# 发送给模型的内容
message_content = "这是最好的时代,也是最坏的时代。"

# 下游可用的元数据
artifact = {"document_id": "doc_123", "page": 0}

tool_message = ToolMessage(
    content=message_content,
    tool_call_id="call_123",
    name="search_books",
    artifact=artifact,
)

完整示例请参阅 RAG 教程,了解如何用 LangChain 构建带检索功能的 智能体(agents)

消息内容(Message Content)

你可以将消息的 内容(content) 视为发送给模型的数据载荷。消息对象有一个 content 属性,其类型较为宽松,支持字符串或未类型化的对象列表(如字典),从而允许直接在 LangChain 聊天模型中使用提供商原生的结构,例如 多模态(multimodal) 内容。

此外,LangChain 还提供了专用的内容类型,用于表示文本、推理、引用、多模态数据、服务端工具调用等。详见下方的 标准内容块(standard content blocks)。

LangChain 聊天模型通过 content 属性接收消息内容,该属性可包含以下任一形式:

  1. 一个字符串
  2. 一个提供商原生格式的内容块列表
  3. 一个 LangChain 标准内容块 列表

以下是一个使用 多模态 输入的示例:

from langchain.messages import HumanMessage

# 字符串内容
human_message = HumanMessage("你好,最近怎么样?")

# 提供商原生格式(如 OpenAI)
human_message = HumanMessage(content=[
    {"type": "text", "text": "你好,最近怎么样?"},
    {"type": "image_url", "image_url": {"url": "https://example.com/image.jpg"}}
])

# 标准内容块列表
human_message = HumanMessage(content_blocks=[
    {"type": "text", "text": "你好,最近怎么样?"},
    {"type": "image", "url": "https://example.com/image.jpg"},
])

初始化消息时指定 content_blocks 仍会填充 content 属性,但提供了类型安全的接口。

标准内容块(Standard Content Blocks)

LangChain 提供了一套跨提供商的标准内容表示方式。

消息对象实现了 content_blocks 属性,可将 content 懒加载解析为标准、类型安全的表示。例如,来自 ChatAnthropic 或 ChatOpenAI 的消息可能分别包含 thinking 或 reasoning 块,但均可被统一解析为 ReasoningContentBlock:

  • Anthropic
from langchain.messages import AIMessage

message = AIMessage(
    content=[
        {"type": "thinking", "thinking": "...", "signature": "WaUjzkyp..."},
        {"type": "text", "text": "..."},
    ],
    response_metadata={"model_provider": "anthropic"}
)
message.content_blocks
  • OpenAI
from langchain.messages import AIMessage

message = AIMessage(
    content=[
        {"type": "thinking", "thinking": "...", "signature": "WaUjzkyp..."},
        {"type": "text", "text": "..."},
    ],
    response_metadata={"model_provider": "anthropic"}
)
message.content_blocks
[{'type': 'reasoning',
  'reasoning': '...',
  'extras': {'signature': 'WaUjzkyp...'}},
 {'type': 'text', 'text': '...'}]

更多用法请参阅 集成指南。

序列化标准内容
如果 LangChain 外部的应用需要访问标准内容块表示,你可以选择将内容块存储在消息的 content 中。

方法一:设置环境变量 LC_OUTPUT_VERSION=v1

方法二:初始化聊天模型时指定 output_version=“v1”:

from langchain.chat_models import init_chat_model

model = init_chat_model("gpt-5-nano", output_version="v1")
多模态(Multimodal)

多模态(Multimodality) 指处理多种数据形式的能力,如文本、音频、图像、视频等。LangChain 为这些数据提供了标准类型,可在不同提供商间通用。

聊天模型 可接收多模态数据作为输入,并生成多模态输出。以下是几种多模态输入的简短示例:

额外字段可直接放在内容块顶层,或嵌套在 "extras": {"key": value} 中。
例如,OpenAIAWS Bedrock Converse 要求 PDF 文件提供文件名。具体要求请查阅所选模型的 提供商页面。

  • 图像输入
# From URL
message = {
    "role": "user",
    "content": [
        {"type": "text", "text": "Describe the content of this image."},
        {"type": "image", "url": "https://example.com/path/to/image.jpg"},
    ]
}

# From base64 data
message = {
    "role": "user",
    "content": [
        {"type": "text", "text": "Describe the content of this image."},
        {
            "type": "image",
            "base64": "AAAAIGZ0eXBtcDQyAAAAAGlzb21tcDQyAAACAGlzb2...",
            "mime_type": "image/jpeg",
        },
    ]
}

# From provider-managed File ID
message = {
    "role": "user",
    "content": [
        {"type": "text", "text": "Describe the content of this image."},
        {"type": "image", "file_id": "file-abc123"},
    ]
}
  • PDF 文档输入
# From URL
message = {
    "role": "user",
    "content": [
        {"type": "text", "text": "描述这份文档的内容。"},
        {"type": "file", "url": "https://example.com/path/to/document.pdf"},
    ]
}

# From base64 data
message = {
    "role": "user",
    "content": [
        {"type": "text", "text": "描述这份文档的内容。"},
        {
            "type": "file",
            "base64": "AAAAIGZ0eXBtcDQyAAAAAGlzb21tcDQyAAACAGlzb2...",
            "mime_type": "application/pdf",
        },
    ]
}

# From provider-managed File ID
message = {
    "role": "user",
    "content": [
        {"type": "text", "text": "描述这份文档的内容。"},
        {"type": "file", "file_id": "file-abc123"},
    ]
}
  • 音频输入
# From base64 data
message = {
    "role": "user",
    "content": [
        {"type": "text", "text": "描述这段音频的内容。"},
        {
            "type": "video",
            "base64": "AAAAIGZ0eXBtcDQyAAAAAGlzb21tcDQyAAACAGlzb2...",
            "mime_type": "video/mp4",
        },
    ]
}

# From provider-managed File ID
message = {
    "role": "user",
    "content": [
        {"type": "text", "text": "描述这段视频的内容。"},
        {"type": "video", "file_id": "file-abc123"},
    ]
}

并非所有模型都支持全部文件类型。请查阅模型提供商的 集成文档 以确认支持的格式和大小限制。

内容块参考(Content Block Reference)

内容块在创建消息或访问 content_blocks 属性时,表示为一个类型化字典列表。每个元素必须符合以下某种块类型:

(此处省略详细块类型说明,保留结构清晰性;实际开发中可查阅官方 API 文档)

完整类型定义请参阅 API 参考文档。 内容块(Content Blocks)是在 LangChain v1 中作为消息的新属性引入的,旨在跨提供商标准化内容格式,同时保持与现有代码的向后兼容性。
内容块 不是 对 content 属性的替代,而是一个新属性,用于以标准化格式访问消息内容。

与聊天模型配合使用

聊天模型 接收一系列消息对象作为输入,并返回一个 AIMessage 作为输出。交互通常是无状态的,因此简单的对话循环只需不断将增长的消息列表传给模型即可。

已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 常见问题解答 网页打开速度慢或者打不开网页? 受到多种因素的影响,对于非会员用户我们无法提供最优质的服务。 如果您希望得到最棒的体验,请至大会员页面("右上角菜单 → 大会员")根据说明操作。 请注意:受制于国际网络的诸多不确定性,我们无法对任何服务的可靠性做出任何保证。 如果出现了网络连接相关的问题,我们建议您先等待一段时间,之后再重试。 如果您在重试后发现问题仍然存在,请联系我们,并说明网络问题持续的时间。 图片下载后无法找到? 打开"右上角菜单 → 更多 → 修改下载路径",在弹出的对话框中可以看到当前图片的保存路径。 此外,由于网络因素,在保存图片之后,等待屏幕下方出现"已保存到..."后,才能在本地找到图片。 如何更改图片保存的目录? 请参见"右上角菜单 → 更多 → 修改下载路径"。 翻页不方便? 在点进某个图片后,通过在图片上向左或向右滑动,即可翻页查看下一个作品。 如何保存原图/导出动图? 长按图片/动图,在弹出的菜单中选择保存/导出即可。 输入账号密码后出现"进行人机身份验证"? 此为pixiv登陆时的验证码,请按照要求点击方框或图片。 在pxvr中注册pixiv账号后,收到验证邮件,无法访问邮件中的验证链接? 请复制邮件中的链接,打开pxvr中的"右上角菜单 → 输入地址"进行访问。 能否自动将页面内容翻译为汉语? 很抱歉,pxvr暂不提供语言翻译服务。 图片下载类型是否可以选择? 能否批量下载/批量管理下载? 已支持批量下载多图作品中的所有原图:找到一个多图作品,进入详情页面后,点击图片进入多图浏览模式,长按任意一张图片即可看到批量下载选项。 关于上述其他功能,我们...
考虑局部遮阴的光伏PSO-MPPT控制模型(Simulink仿真实现)内容概要:本文介绍了基于Simulink仿真实现的考虑局部遮阴的光伏PSO-MPPT控制模型,旨在通过粒子群优化(PSO)算法解决光伏发电系统在局部阴影条件下最大功率点跟踪(MPPT)的效率问题。文档不仅提供了该模型的技术实现方法,还列举了大量相关的MATLAB/Simulink仿真资源,涵盖电力系统、智能优化算法、机器学习、路径规划、信号处理等多个科研方向,适用于复现高水平期刊论文和开展创新性研究。文中强调科研需逻辑缜密、善于借力,并提倡结合实际仿真与理论分析以提升研究深度。 适合人群:具备一定电力电子、自动控制或新能源背景,熟悉MATLAB/Simulink环境,从事光伏系统优化、智能算法应用或相关领域研究的研发人员及硕博研究生。 使用场景及目标:①研究局部遮阴下光伏系统MPPT控制策略的性能提升;②利用PSO等智能优化算法解决非线性、多峰值优化问题;③复现SCI/EI级别论文中的MPPT控制模型;④开展光伏系统建模与仿真教学或项目开发。 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码与模型文件,按照目录顺序逐步学习,重点理解PSO算法在MPPT中的应用机制,并通过修改参数、对比实验等方式深入掌握仿真细节,提升工程实践与科研创新能力。
<think>好的,我现在需要回答用户关于langchain_core.messages.ToolMessage的用法的问题。首先,我得回忆一下这个类的作用和使用场景。根据之前的了解,langchain_core是LangChain的一个核心库,而ToolMessage可能是用于处理工具调用时的消息结构。 用户可能想知道如何正确创建和使用ToolMessage实例。我需要先确认它的参数,比如内容、工具名称、状态等。可能还有如何与其他组件如LLM或Agent结合使用。 接下来,应该提供一个具体的示例代码,展示如何实例化ToolMessage,并说明各个参数的意义。例如,content是工具调用的结果,name是调用的工具名称,status可能表示成功或失败。 然后,我需要考虑常见的用法和注意事项,比如在处理工具调用时,如何将结果封装成ToolMessage以便后续处理。可能还要提到与其他消息类型的区别,如HumanMessage或AIMessage。 最后,生成相关问题时,要确保覆盖初始化参数、与其他类的区别以及错误处理等方面。需要检查示例代码是否正确,参数是否正确使用,以及相关问题是否全面。</think>`langchain_core.messages.ToolMessage` 用于封装工具调用的结果,通常在Agent调用工具后生成。其核心作用是记录工具调用的输入、输出及状态,便于后续处理或上下文维护。 示例代码: ```python from langchain_core.messages import ToolMessage # 创建一个ToolMessage实例 tool_message = ToolMessage( content="{'result': 42}", # 工具返回的内容(通常为字符串化的JSON) name="calculate_tool", # 调用的工具名称 status="success", # 调用状态(可选:success/error) tool_call_id="abc123" # 工具调用的唯一ID(用于关联请求与响应) ) print(tool_message) ``` 关键参数说明: 1. `content`:工具执行结果的原始数据(需自行序列化) 2. `name`:对应工具注册时的名称 3. `status`:标记调用成功/失败,影响后续流程决策 4. `tool_call_id`:需与对应的ToolCallMessage的id匹配 使用场景: - Agent执行完工具调用后生成该消息存入历史记录 - 在链式调用中传递工具执行结果 - 前端展示工具调用过程时的数据源
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyRivers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值