消息
概述
消息是 聊天模型 中通信的单位。它们用于表示聊天模型的输入和输出,以及可能与对话关联的任何其他上下文或元数据。
每条消息都有一个角色(例如,“用户”、“助手”)和内容(例如,文本、多模态数据),以及其他元数据,这些元数据因聊天模型提供商而异。
LangChain 提供了一种统一的消息格式,可用于各种聊天模型,使用户可以在使用不同聊天模型时无需担心每个模型提供商使用的消息格式的具体细节。
消息内部是什么?
一条消息通常包含以下信息
- 角色:消息的角色(例如,“用户”、“助手”)。
- 内容:消息的内容(例如,文本、多模态数据)。
- 其他元数据:ID、名称、令牌使用情况 和其他特定于模型的元数据。
角色
角色用于区分对话中不同类型的消息,并帮助聊天模型理解如何响应给定的消息序列。
角色 | 描述 |
---|---|
系统 | 用于告知聊天模型如何行为并提供其他上下文。并非所有聊天模型提供商都支持。 |
用户 | 表示与模型交互的用户的输入,通常以文本或其他交互式输入的形式。 |
助手 | 表示来自模型的响应,其中可以包括文本或调用工具的请求。 |
工具 | 一种消息,用于在检索到外部数据或处理后将工具调用的结果传递回模型。与支持 工具调用 的聊天模型一起使用。 |
函数(旧版) | 这是一个旧版角色,对应于 OpenAI 的旧版函数调用 API。应改用 工具 角色。 |
内容
消息的内容文本或表示 多模态数据(例如,图像、音频、视频)的字典列表。内容的确切格式可能因不同的聊天模型提供商而异。
目前,大多数聊天模型都支持文本作为主要内容类型,一些模型也支持多模态数据。但是,大多数聊天模型提供商对多模态数据的支持仍然有限。
有关更多信息,请参阅
- SystemMessage -- 用于应传递以指导对话的内容
- HumanMessage -- 用于来自用户的输入内容。
- AIMessage -- 用于来自模型的响应内容。
- 多模态 -- 有关多模态内容的更多信息。
其他消息数据
根据聊天模型提供商的不同,消息可以包括其他数据,例如
- ID:消息的可选唯一标识符。
- 名称:可选的
name
属性,允许区分具有相同角色的不同实体/发言者。并非所有模型都支持此功能! - 元数据:有关消息的其他信息,例如时间戳、令牌使用情况等。
- 工具调用:模型发出的调用一个或多个工具的请求。请参阅 工具调用 以获取更多信息。
对话结构
消息序列输入到聊天模型应遵循特定的结构,以确保聊天模型可以生成有效的响应。
例如,典型的对话结构可能如下所示
- 用户消息:“你好,你好吗?”
- 助手消息:“我很好,谢谢你的询问。”
- 用户消息:“你能给我讲个笑话吗?”
- 助手消息:“当然!为什么稻草人会获奖?因为他在他的田地里很出色!”
请阅读 聊天记录 指南,以获取有关管理聊天记录和确保对话结构正确的更多信息。
LangChain 消息
LangChain 提供了一种统一的消息格式,可用于所有聊天模型,使用户可以在使用不同聊天模型时无需担心每个模型提供商使用的消息格式的具体细节。
LangChain 消息是 Python 对象,它们从 BaseMessage 子类化而来。
五个主要的消息类型是
- 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 尝试在不同聊天模型提供商之间标准化的属性。原始 字段特定于模型提供商,并且可能有所不同。
属性 | 标准化/原始 | 描述 |
---|---|---|
内容 | 原始 | 通常是字符串,但也可以是内容块的列表。有关详细信息,请参阅 内容。 |
tool_calls | 标准化 | 与消息关联的工具调用。有关详细信息,请参阅 工具调用。 |
invalid_tool_calls | 标准化 | 与消息关联的具有解析错误的工具调用。有关详细信息,请参阅 工具调用。 |
usage_metadata | 标准化 | 消息的使用情况元数据,例如 令牌计数。请参阅 使用情况元数据 API 参考。 |
id | 标准化 | 消息的可选唯一标识符,最好由创建消息的提供商/模型提供。 |
response_metadata | 原始 | 响应元数据,例如,响应标头、对数概率、令牌计数。 |
内容
AIMessage
的 content 属性表示聊天模型生成的响应。
内容是
- 文本 -- 几乎所有聊天模型的规范。
- 字典列表 -- 每个字典表示一个内容块,并与一个
type
关联。
content 属性在不同的聊天模型提供商之间 未 标准化,主要是因为可以概括的示例仍然很少。
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
这表示角色为“tool”的消息,其中包含 调用工具 的结果。除了 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 格式。