LangChain 消息概念指南
文章目录
概述
消息是聊天模型的输入和输出。LangChain有一些内置的消息类型,以及一个基础的BaseMessage
类,您可以从中子类化以创建自己的自定义消息类型。
消息内部包含什么?
角色(Role)
每个消息都与一个角色相关联。LangChain有不同的消息类型,每个都与不同的角色相关联:
HumanMessage
: 来自人类/用户的消息AIMessage
: 来自AI/助手的消息SystemMessage
: 系统消息,用于指导AI的行为ToolMessage
: 工具调用结果的消息RemoveMessage
: 用于从对话中删除消息的特殊消息类型
内容(Content)
每个消息都有一个content
字段。这通常是一个字符串,但对于某些消息类型和模型,它可以是一个字典列表(例如,当向多模态模型传递图像时)。
其他消息数据
消息可以有任意的其他数据。在LangChain中,我们有一些标准化的字段(如tool_calls
和usage_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)
AIMessage
的content属性表示聊天模型生成的响应。
内容可以是:
- 文本 —— 几乎所有聊天模型的标准
- 字典列表 —— 每个字典表示一个内容块,并与一个
type
相关联- Anthropic用于在进行工具调用时显示代理思考过程
- OpenAI用于音频输出。请参阅多模态内容以获取更多信息
重要:content属性在不同的聊天模型提供商之间不是标准化的,主要是因为仍然很少有例子可以概括。
AIMessageChunk(AI消息块)
通常会流式传输聊天模型的响应,以便用户可以实时看到响应,而不是等待整个响应生成完毕后再显示。
它从聊天模型的stream
、astream
和astream_events
方法返回。
例如:
for chunk in model.stream([HumanMessage("天空是什么颜色?")]):
print(chunk)
AIMessageChunk
遵循与AIMessage
几乎相同的结构,但使用不同的ToolCallChunk
以能够以标准化的方式流式传输工具调用。
聚合
AIMessageChunk
支持+
操作符将它们合并为单个AIMessage
。当您想要向用户显示最终响应时,这很有用。
ai_message = chunk1 + chunk2 + chunk3 + ...
ToolMessage(工具消息)
这表示角色为"工具"的消息,包含调用工具的结果。除了role
和content
之外,此消息还有:
tool_call_id
字段,传达被调用以产生此结果的工具调用的IDartifact
字段,可用于传递工具执行的任意工件,这些工件对跟踪有用但不应发送给模型
请参阅工具调用以获取更多信息。
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中消息系统的核心概念:
关键要点
- 消息结构:每个消息都有角色、内容和其他元数据
- 消息类型:包括系统消息、人类消息、AI消息、工具消息等
- 多模态支持:支持文本、图像、音频等多种内容类型
- 流式处理:支持实时流式响应
- 格式兼容性:支持OpenAI格式的输入输出
实际应用
- 对话应用:使用不同消息类型构建复杂的对话流程
- 工具集成:通过ToolMessage实现模型与外部工具的交互
- 多模态交互:处理文本、图像、音频等多种输入类型
- 流式响应:提供实时的用户体验
这个消息系统为LangChain提供了灵活而标准化的方式来处理各种聊天模型的输入输出,是构建对话应用的基础架构。
文档版本:基于 LangChain v0.3
最后更新:2025年1月