LangChain Messages 概念指南

LangChain 消息概念指南

在这里插入图片描述

概述

消息是聊天模型的输入和输出。LangChain有一些内置的消息类型,以及一个基础的BaseMessage类,您可以从中子类化以创建自己的自定义消息类型。

消息内部包含什么?

角色(Role)

每个消息都与一个角色相关联。LangChain有不同的消息类型,每个都与不同的角色相关联:

  • HumanMessage: 来自人类/用户的消息
  • AIMessage: 来自AI/助手的消息
  • SystemMessage: 系统消息,用于指导AI的行为
  • ToolMessage: 工具调用结果的消息
  • RemoveMessage: 用于从对话中删除消息的特殊消息类型

内容(Content)

每个消息都有一个content字段。这通常是一个字符串,但对于某些消息类型和模型,它可以是一个字典列表(例如,当向多模态模型传递图像时)。

其他消息数据

消息可以有任意的其他数据。在LangChain中,我们有一些标准化的字段(如tool_callsusage_metadata),但您也可以向消息添加任意字段,这些字段将传递给底层的聊天模型。

对话结构

聊天模型将消息列表作为输入,并返回一个消息作为输出。虽然每个消息都与一个角色相关联,但不同的模型对角色有不同的要求。一些模型相当灵活,而另一些则对允许的消息序列有严格的要求。

当使用聊天模型时,了解该特定模型的消息要求是很有用的。

LangChain 消息类型

SystemMessage(系统消息)

SystemMessage用于向模型提供指令、指导或上下文,这些内容不是对话的直接部分,而是影响模型在整个对话中的行为。

from langchain_core.messages import SystemMessage

message = SystemMessage(content="You are a helpful assistant.")
系统消息支持

不同的聊天模型提供商可能通过以下方式之一支持系统消息:

  • 通过"系统"消息角色:在这种情况下,系统消息作为消息序列的一部分包含,角色明确设置为"系统"。
  • 通过单独的API参数用于系统指令:系统指令不是作为消息包含,而是通过专用的API参数传递。
  • 不支持系统消息:某些模型根本不支持系统消息。

大多数主要的聊天模型提供商通过聊天消息或单独的API参数支持系统指令。LangChain将根据提供商的能力自动适应。

HumanMessage(人类消息)

HumanMessage对应于**“用户”**角色。人类消息表示与模型交互的用户的输入。

文本内容

大多数聊天模型期望用户输入是文本形式。

from langchain_core.messages import HumanMessage

model.invoke([HumanMessage(content="你好,你好吗?")])

提示:当使用字符串作为输入调用聊天模型时,LangChain会自动将字符串转换为HumanMessage对象。这主要用于快速测试。

model.invoke("你好,你好吗?")
多模态内容

一些聊天模型接受多模态输入,如图像、音频、视频或PDF等文件。

请参阅多模态指南以获取更多信息。

AIMessage(AI消息)

AIMessage用于表示角色为 “助手” 的消息。这是来自模型的响应,可以包括文本或调用工具的请求。它也可能包括其他媒体类型,如图像、音频或视频——尽管目前这仍然不常见。

from langchain_core.messages import HumanMessage
ai_message = model.invoke([HumanMessage("给我讲个笑话")])
ai_message # <-- AIMessage

AIMessage具有以下属性。标准化的属性是LangChain试图在不同聊天模型提供商之间标准化的属性。原始字段特定于模型提供商,可能会有所不同。

属性标准化/原始描述
content原始通常是字符串,但可以是内容块列表。详见内容部分
tool_calls标准化与消息相关的工具调用。详见工具调用
invalid_tool_calls标准化与消息相关的解析错误的工具调用。详见工具调用
usage_metadata标准化消息的使用元数据,如令牌计数。详见使用元数据API参考
id标准化消息的可选唯一标识符,理想情况下由创建消息的提供商/模型提供
response_metadata原始响应元数据,如响应头、日志概率、令牌计数
内容(content)

AIMessagecontent属性表示聊天模型生成的响应。

内容可以是:

  • 文本 —— 几乎所有聊天模型的标准
  • 字典列表 —— 每个字典表示一个内容块,并与一个type相关联
    • Anthropic用于在进行工具调用时显示代理思考过程
    • OpenAI用于音频输出。请参阅多模态内容以获取更多信息

重要content属性在不同的聊天模型提供商之间不是标准化的,主要是因为仍然很少有例子可以概括。

AIMessageChunk(AI消息块)

通常会流式传输聊天模型的响应,以便用户可以实时看到响应,而不是等待整个响应生成完毕后再显示。

它从聊天模型的streamastreamastream_events方法返回。

例如:

for chunk in model.stream([HumanMessage("天空是什么颜色?")]):
    print(chunk)

AIMessageChunk遵循与AIMessage几乎相同的结构,但使用不同的ToolCallChunk以能够以标准化的方式流式传输工具调用。

聚合

AIMessageChunk支持+操作符将它们合并为单个AIMessage。当您想要向用户显示最终响应时,这很有用。

ai_message = chunk1 + chunk2 + chunk3 + ...

ToolMessage(工具消息)

这表示角色为"工具"的消息,包含调用工具的结果。除了rolecontent之外,此消息还有:

  • tool_call_id字段,传达被调用以产生此结果的工具调用的ID
  • artifact字段,可用于传递工具执行的任意工件,这些工件对跟踪有用但不应发送给模型

请参阅工具调用以获取更多信息。

RemoveMessage(删除消息)

这是一种特殊的消息类型,不对应任何角色。它用于在LangGraph中管理聊天历史。

请参阅以下内容以获取有关如何使用RemoveMessage的更多信息:

  • 内存概念指南
  • 如何删除消息

(遗留) FunctionMessage(函数消息)

这是一种遗留消息类型,对应于OpenAI的遗留函数调用API。应该使用ToolMessage来对应更新的工具调用API。

OpenAI 格式

输入

聊天模型也接受OpenAI格式作为聊天模型的输入

chat_model.invoke([
    {
        "role": "user",
        "content": "你好,你好吗?",
    },
    {
        "role": "assistant", 
        "content": "我很好,谢谢你的询问。",
    },
    {
        "role": "user",
        "content": "你能给我讲个笑话吗?",
    }
])

输出

目前,模型的输出将以LangChain消息的形式呈现,因此如果您也需要OpenAI格式的输出,您需要将输出转换为OpenAI格式。

可以使用convert_to_openai_messages实用函数将LangChain消息转换为OpenAI格式。


总结

这个文档详细介绍了LangChain中消息系统的核心概念:

关键要点

  1. 消息结构:每个消息都有角色、内容和其他元数据
  2. 消息类型:包括系统消息、人类消息、AI消息、工具消息等
  3. 多模态支持:支持文本、图像、音频等多种内容类型
  4. 流式处理:支持实时流式响应
  5. 格式兼容性:支持OpenAI格式的输入输出

实际应用

  • 对话应用:使用不同消息类型构建复杂的对话流程
  • 工具集成:通过ToolMessage实现模型与外部工具的交互
  • 多模态交互:处理文本、图像、音频等多种输入类型
  • 流式响应:提供实时的用户体验

这个消息系统为LangChain提供了灵活而标准化的方式来处理各种聊天模型的输入输出,是构建对话应用的基础架构。


参考链接LangChain Messages 官方文档

文档版本:基于 LangChain v0.3

最后更新:2025年1月

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值