消息
概述
消息是聊天模型中的通信单元。它们用于表示聊天模型的输入和输出,以及可能与对话关联的任何额外上下文或元数据。
每条消息都有一个**角色**(例如,“用户”、“助手”)和**内容**(例如,文本、多模态数据),以及根据聊天模型提供商而异的额外元数据。
LangChain 提供了一种统一的消息格式,可用于所有聊天模型,允许用户使用不同的聊天模型,而无需担心每个模型提供商使用的消息格式的具体细节。
消息包含什么?
消息通常包含以下信息
- **角色**:消息的角色(例如,“用户”、“助手”)。
- **内容**:消息的内容(例如,文本、多模态数据)。
- 额外元数据:id、名称、token 使用量和其他模型特定元数据。
角色
角色用于区分对话中不同类型的消息,并帮助聊天模型理解如何响应给定的消息序列。
角色 | 描述 |
---|---|
系统 | 用于告诉聊天模型如何表现并提供额外上下文。并非所有聊天模型提供商都支持。 |
用户 | 表示与模型交互的用户的输入,通常以文本或其他交互式输入的形式。 |
助手 | 表示来自模型的响应,可以包括文本或调用工具的请求。 |
工具 | 一种消息,用于在检索外部数据或处理后将工具调用的结果传递回模型。与支持工具调用的聊天模型一起使用。 |
**函数**(旧版) | 这是一个旧版角色,对应于 OpenAI 的旧版函数调用 API。应使用**工具**角色代替。 |
内容
消息内容可以是文本或表示多模态数据(例如,图像、音频、视频)的字典列表。内容的具体格式可能因不同的聊天模型提供商而异。
目前,大多数聊天模型支持文本作为主要内容类型,一些模型也支持多模态数据。然而,大多数聊天模型提供商对多模态数据的支持仍然有限。
更多信息请参阅
- SystemMessage -- 用于应传递以引导对话的内容
- HumanMessage -- 用于用户输入中的内容。
- AIMessage -- 用于模型响应中的内容。
- 多模态 -- 有关多模态内容的更多信息。
其他消息数据
根据聊天模型提供商,消息可能包含其他数据,例如
- **ID**:消息的可选唯一标识符。
- **名称**:一个可选的 `name` 属性,允许区分具有相同角色的不同实体/发言者。并非所有模型都支持此功能!
- **元数据**:关于消息的额外信息,例如时间戳、token 使用量等。
- **工具调用**:模型发出的调用一个或多个工具的请求。有关更多信息,请参阅工具调用。
对话结构
输入到聊天模型中的消息序列应遵循特定结构,以确保聊天模型可以生成有效响应。
例如,典型的对话结构可能如下所示
- **用户消息**:“你好,你怎么样?”
- **助手消息**:“我很好,谢谢你的询问。”
- **用户消息**:“你能给我讲个笑话吗?”
- **助手消息**:“当然!稻草人为什么获奖?因为它在自己的领域表现出色!”
请阅读聊天历史指南,了解有关管理聊天历史和确保对话结构正确的更多信息。
LangChain 消息
LangChain 提供了一种统一的消息格式,可用于所有聊天模型,允许用户使用不同的聊天模型,而无需担心每个模型提供商使用的消息格式的具体细节。
LangChain 消息是继承自 BaseMessage 的 Python 对象。
五种主要消息类型是
- SystemMessage:对应**系统**角色
- HumanMessage:对应**用户**角色
- AIMessage:对应**助手**角色
- AIMessageChunk:对应**助手**角色,用于流式响应
- ToolMessage:对应**工具**角色
其他重要消息包括
- RemoveMessage -- 不对应任何角色。这是一种抽象,主要用于 LangGraph 中管理聊天历史。
- **旧版** FunctionMessage:对应 OpenAI **旧版**函数调用 API 中的**函数**角色。
您可以在 API 参考中找到有关**消息**的更多信息。
SystemMessage
一个 `SystemMessage` 用于引导 AI 模型的行为并提供额外上下文,例如指示模型采用特定角色或设定对话的语气(例如,“这是一场关于烹饪的对话”)。
不同的聊天提供商可能通过以下方式之一支持系统消息
- **通过“系统”消息角色**:在这种情况下,系统消息作为消息序列的一部分包含在内,其角色明确设置为“系统”。
- **通过单独的 API 参数用于系统指令**:系统指令不是作为消息包含在内,而是通过专用的 API 参数传递。
- **不支持系统消息**:有些模型根本不支持系统消息。
大多数主要的聊天模型提供商通过聊天消息或单独的 API 参数支持系统指令。LangChain 将根据提供商的功能自动适应。如果提供商支持用于系统指令的单独 API 参数,LangChain 将提取系统消息的内容并通过该参数传递。
如果提供商不支持系统消息,在大多数情况下,LangChain 会尝试将系统消息的内容合并到 HumanMessage 中,或者如果无法做到,则抛出异常。然而,此行为尚未在所有实现中一致执行,如果使用聊天模型的一个不太流行的实现(例如,来自 `langchain-community` 包的实现),建议查看该模型的具体文档。
HumanMessage
一个 `HumanMessage` 对应**“用户”**角色。人类消息表示与模型交互的用户的输入。
文本内容
大多数聊天模型期望用户输入以文本形式存在。
from langchain_core.messages import HumanMessage
model.invoke([HumanMessage(content="Hello, how are you?")])
当以字符串作为输入调用聊天模型时,LangChain 会自动将字符串转换为 `HumanMessage` 对象。这主要用于快速测试。
model.invoke("Hello, how are you?")
多模态内容
一些聊天模型接受多模态输入,例如图像、音频、视频或 PDF 等文件。
有关更多信息,请参阅多模态指南。
AIMessage
`AIMessage` 用于表示角色为**“助手”**的消息。这是模型的响应,可以包括文本或调用工具的请求。它还可以包括图像、音频或视频等其他媒体类型——尽管目前这仍然不常见。
from langchain_core.messages import HumanMessage
ai_message = model.invoke([HumanMessage("Tell me a joke")])
ai_message # <-- AIMessage
一个 `AIMessage` 具有以下属性。**标准化**的属性是 LangChain 尝试在不同聊天模型提供商之间进行标准化的属性。**原始**字段特定于模型提供商,并且可能有所不同。
属性 | 标准化/原始 | 描述 |
---|---|---|
content | 原始 | 通常是字符串,但可以是内容块列表。有关详细信息,请参阅内容。 |
tool_calls | 标准化 | 与消息关联的工具调用。有关详细信息,请参阅工具调用。 |
invalid_tool_calls | 标准化 | 与消息关联的带解析错误的工具调用。有关详细信息,请参阅工具调用。 |
usage_metadata | 标准化 | 消息的使用元数据,例如token 计数。请参阅Usage Metadata API 参考。 |
id | 标准化 | 消息的可选唯一标识符,理想情况下由创建消息的提供商/模型提供。 |
response_metadata | 原始 | 响应元数据,例如响应头、logprobs、token 计数。 |
内容
`AIMessage` 的**内容**属性表示聊天模型生成的响应。
内容可以是
- **文本** -- 几乎所有聊天模型的规范。
- 一个**字典列表** -- 每个字典代表一个内容块,并与一个 `type` 关联。
**内容**属性在不同聊天模型提供商之间**未**标准化,主要原因是从中概括的示例仍然很少。
AIMessageChunk
通常会将聊天模型的响应在生成时流式传输,这样用户可以实时看到响应,而不是等待整个响应生成后再显示。
它由聊天模型的 `stream`、`astream` 和 `astream_events` 方法返回。
例如,
for chunk in model.stream([HumanMessage("what color is the sky?")]):
print(chunk)
`AIMessageChunk` 遵循与 `AIMessage` 几乎相同的结构,但使用不同的 ToolCallChunk 来以标准化方式流式传输工具调用。
聚合
`AIMessageChunks` 支持 `+` 运算符以将它们合并为一个 `AIMessage`。当您想要向用户显示最终响应时,这很有用。
ai_message = chunk1 + chunk2 + chunk3 + ...
ToolMessage
这表示一个角色为“工具”的消息,其中包含调用工具的结果。除了 `role` 和 `content` 之外,此消息还具有
- 一个 `tool_call_id` 字段,它传达调用该工具以生成此结果的调用 ID。
- 一个 `artifact` 字段,可用于传递工具执行的任意工件,这些工件有助于跟踪但不应发送到模型。
有关更多信息,请参阅工具调用。
RemoveMessage
这是一种不对应任何角色的特殊消息类型。它用于在LangGraph中管理聊天历史。
有关如何使用 `RemoveMessage` 的更多信息,请参阅以下内容
(旧版)FunctionMessage
这是一个旧版消息类型,对应 OpenAI 的旧版函数调用 API。应使用 `ToolMessage` 以对应更新的工具调用 API。
OpenAI 格式
输入
聊天模型也接受 OpenAI 格式作为聊天模型的**输入**
chat_model.invoke([
{
"role": "user",
"content": "Hello, how are you?",
},
{
"role": "assistant",
"content": "I'm doing well, thank you for asking.",
},
{
"role": "user",
"content": "Can you tell me a joke?",
}
])
输出
目前,模型的输出将是 LangChain 消息,因此如果您也需要 OpenAI 格式的输出,则需要将输出转换为 OpenAI 格式。
`convert_to_openai_messages` 实用函数可用于将 LangChain 消息转换为 OpenAI 格式。