消息
概览
消息是聊天模型中的通信单元。它们用于表示聊天模型的输入和输出,以及与对话相关的任何附加上下文或元数据。
每条消息都有一个 role(例如,"user"、"assistant")和 content(例如,文本、多模态数据),以及根据聊天模型提供商而异的其他元数据。
LangChain 提供了一个统一的格式,可用于各种聊天模型,使用户能够在不关心每个模型提供商所使用的具体消息格式细节的情况下,与不同的聊天模型进行交互。
消息中包含什么?
一条消息通常包含以下信息:
- 角色: 消息的角色(例如,"user"、"assistant")。
- 内容: 消息的内容(例如,文本、多模态数据)。
- 附加元数据:id、name、令牌使用情况以及其他特定于模型的元数据。
角色
角色用于区分对话中不同类型的消息,并帮助聊天模型理解如何响应给定的消息序列。
| 角色 | 描述 |
|---|---|
| system | Used to tell the chat model how to behave and provide additional context. Not supported by all chat model providers. |
| user | Represents input from a user interacting with the model, usually in the form of text or other interactive input. |
| assistant | Represents a response from the model, which can include text or a request to invoke tools. |
| tool | A message used to pass the results of a tool invocation back to the model after external data or processing has been retrieved. Used with chat models that support tool calling. |
| function (legacy) | This is a legacy role, corresponding to OpenAI's legacy function-calling API. tool role should be used instead. |
内容
消息文本的内容或表示多模态数据(例如,图像、音频、视频)的字典列表。内容的确切格式可能因不同的聊天模型提供商而异。
目前,大多数聊天模型支持文本作为主要的内容类型,部分模型还支持多模态数据。然而,大多数聊天模型提供商对多模态数据的支持仍然有限。
更多信息请见:
其他消息数据
根据聊天模型提供商的不同,消息可能包含其他数据,例如:
- ID: 消息的可选唯一标识符。
- 名称: 一个可选的
name属性,用于区分具有相同角色的不同实体/说话者。并非所有模型都支持此功能! - 元数据: 关于消息的附加信息,例如时间戳、令牌使用情况等。
- 工具调用: 模型发起的调用一个或多个工具的请求> 请查看 工具调用 以获取更多信息。
对话结构
将消息序列输入到聊天模型时,应遵循特定结构,以确保聊天模型能够生成有效的响应。
例如,一个典型的对话结构可能如下所示:
- 用户消息: "你好,你怎么样?"
- 助手消息: "我很好,谢谢你的关心。"
- 用户消息: "能给我讲个笑话吗?"
- 助手消息: "当然!为什么稻草人获奖了?因为他在自己的领域里非常出色!"
请阅读 聊天历史 指南,以获取更多关于管理聊天历史并确保对话结构正确的信息。
LangChain 消息
LangChain 提供了一个统一的消息格式,可用于所有聊天模型,使用户能够与不同的聊天模型协作,而无需担心各模型提供商所使用的具体消息格式细节。
LangChain 消息是继承自 BaseMessage 的 Python 对象。
五种主要消息类型是:
- SystemMessage: 对应 system 角色
- HumanMessage: 对应 user 角色
- AIMessage: 对应 assistant 角色
- AIMessageChunk: 对应 assistant 角色,用于 流式 响应
- 工具消息: 对应于 工具 角色
其他重要消息包括:
- 移除消息 -- 不对应任何角色。这是一种抽象,主要用于 LangGraph 来管理聊天历史。
- 遗留 FunctionMessage: 对应于 OpenAI 的遗留函数调用 API 中的function角色。
您可以在 API 参考 中找到有关 消息 的更多信息。
SystemMessage
一个SystemMessage用于为AI模型的行为进行预热并提供额外上下文,例如指示模型采用特定角色或设定对话基调(例如,“这是一段关于烹饪的对话”)。
不同的聊天提供商可能以以下方式之一支持系统消息:
- 通过“系统”消息角色:在这种情况下,系统消息作为消息序列的一部分被包含在内,其角色明确设置为“系统”。
- 通过独立的 API 参数传递系统指令: 系统指令不作为消息包含,而是通过专用的 API 参数进行传递。
- 不支持系统消息: 某些模型完全不支持系统消息。
大多数主要的聊天模型提供商都支持通过聊天消息或单独的 API 参数传递系统指令。LangChain 会根据提供商的能力自动适配。如果提供商支持用于系统指令的单独 API 参数,LangChain 将提取系统消息的内容并通过该参数传递。
如果提供者不支持系统消息,在大多数情况下 LangChain 会尝试将系统消息的内容合并到 HumanMessage 中,或者在无法这样做时抛出异常。然而,这种行为尚未在所有实现中得到一致执行,如果使用不太流行的聊天模型实现(例如来自 langchain-community 包的实现),建议查阅该模型的具体文档。
HumanMessage
The HumanMessage corresponds to the "user" role. A human message represents input from a user interacting with the model.
文本内容
大多数聊天模型期望用户输入以文本形式提供。
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 用于表示角色为"assistant"的消息。这是来自模型的响应,可以包含文本或调用工具的请求。它也可能包含其他媒体类型,如图像、音频或视频——尽管目前这仍不常见。
from langchain_core.messages import HumanMessage
ai_message = model.invoke([HumanMessage("Tell me a joke")])
ai_message # <-- AIMessage
一个 AIMessage 具有以下属性。其中被 标准化 的属性是 LangChain 试图在不同聊天模型提供商之间统一的属性。raw 字段则特定于模型提供商,可能会有所不同。
| 属性 | 标准化/原始 | 描述 |
|---|---|---|
content | Raw | Usually a string, but can be a list of content blocks. See content for details. |
tool_calls | Standardized | Tool calls associated with the message. See tool calling for details. |
invalid_tool_calls | Standardized | Tool calls with parsing errors associated with the message. See tool calling for details. |
usage_metadata | Standardized | Usage metadata for a message, such as token counts. See Usage Metadata API Reference. |
id | Standardized | An optional unique identifier for the message, ideally provided by the provider/model that created the message. |
response_metadata | Raw | Response metadata, e.g., response headers, logprobs, token counts. |
内容
AIMessage的content属性代表由聊天模型生成的响应。
内容要么是:
- text -- 几乎所有聊天模型的标准格式。
- 一个字典列表——每个字典代表一个内容块,并关联着
type。
The 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
这表示一个角色为“工具”的消息,其中包含调用工具的结果。除了role和content之外,该消息还包含:
- a
tool_call_idfield which conveys the id of the call to the tool that was called to produce this result. - an
artifact字段,可用于传递工具执行过程中的任意中间产物,这些产物有助于追踪但不应发送给模型。
请查看 工具调用 以获取更多信息。
移除消息
这是一种特殊的消息类型,不对应任何角色。它用于在 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 格式。
The convert_to_openai_messages 实用函数可用于将 LangChain 消息转换为 OpenAI 格式。