Skip to main content
Open on GitHub

消息

先决条件

概览

消息是聊天模型中通信的基本单位。它们用于表示聊天模型的输入和输出,以及与对话相关联的任何额外上下文或元数据。

每条消息都有一个 角色(例如 "user"、"assistant")和 内容(例如文本、多模态数据),以及根据聊天模型提供商而异的附加元数据。

LangChain 提供了一种统一的消息格式,可在不同的聊天模型中使用,使用户能够使用不同的聊天模型,而无需担心每个模型提供商所使用的具体消息格式细节。

消息里面有什么?

一条消息通常包含以下信息:

  • 角色: 消息的角色(例如,“用户”、“助手”)。
  • 内容: 消息的内容(例如,文本、多模态数据)。
  • 附加元数据:id、名称、令牌使用情况 和其他特定于模型的元数据。

角色

角色用于区分对话中不同类型的消息,并帮助聊天模型理解如何根据给定的消息序列进行回应。

角色描述
systemUsed to tell the chat model how to behave and provide additional context. Not supported by all chat model providers.
userRepresents input from a user interacting with the model, usually in the form of text or other interactive input.
assistantRepresents a response from the model, which can include text or a request to invoke tools.
toolA 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.

内容

消息文本的内容或表示多模态数据(例如,图像、音频、视频)的字典列表。内容的确切格式可能因不同的聊天模型提供商而异。

目前,大多数聊天模型以文本作为主要的内容类型,部分模型还支持多模态数据。然而,大多数聊天模型提供商对多模态数据的支持仍然有限。

有关更多信息,请参见:

  • SystemMessage -- 用于传递到对话中的内容,以指导对话
  • HumanMessage -- 用于用户输入的内容。
  • AIMessage -- 用于模型响应中的内容。
  • 多模态 -- 有关多模态内容的更多信息。

其他消息数据

根据聊天模型提供商的不同,消息可能包含其他数据,例如:

  • ID: 消息的可选唯一标识符。
  • 名称: 一个可选的 name 属性,用于区分具有相同角色的不同实体/说话者。并非所有模型都支持此功能!
  • 元数据: 关于消息的附加信息,例如时间戳、令牌使用情况等。
  • 工具调用: 模型发起的调用一个或多个工具的请求> 了解更多信息,请参见 工具调用

对话结构

消息序列应遵循特定结构,以确保聊天模型能够生成有效的响应。

例如,典型的对话结构可能如下所示:

  1. 用户消息: "你好,你怎么样?"
  2. 助手消息: "我很好,谢谢你的关心。"
  3. 用户消息: "你能告诉我一个笑话吗?"
  4. 助手消息: "当然!为什么稻草人会获奖?因为他在他的领域里非常出色!"

请阅读 聊天历史记录 指南,了解如何管理聊天历史记录并确保对话结构正确。

LangChain 消息

LangChain 提供了一种统一的消息格式,可在所有聊天模型中使用,使用户能够使用不同的聊天模型,而无需担心每个模型提供商所使用的具体消息格式细节。

LangChain消息是继承自BaseMessage的Python对象。

五种主要的消息类型是:

其他重要信息包括:

  • 删除消息 -- 与任何角色都不对应。这是一个抽象概念,主要用于 LangGraph 中管理聊天历史记录。
  • 遗留 FunctionMessage: 对应 OpenAI 的 遗留 函数调用 API 中的 函数 角色。

您可以在此处找到有关 消息 的更多信息,详见 API 参考

SystemMessage

SystemMessage 用于引导 AI 模型的行为并提供额外的上下文,例如指示模型采用特定角色或设定对话的语气(例如,“这是一场关于烹饪的对话”)。

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

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

大多数主要的聊天模型提供商都通过聊天消息或单独的API参数支持系统指令。LangChain将根据提供商的功能自动适配。如果提供商支持用于系统指令的单独API参数,LangChain会提取系统消息的内容并通过该参数传递。

如果提供者不支持系统消息,大多数情况下,LangChain 会尝试将系统消息的内容包含到 HumanMessage 中,或者在无法做到这一点时抛出异常。然而,这种行为尚未在所有实现中一致执行,因此如果使用不太流行的聊天模型实现(例如来自 langchain-community 包的实现),建议查阅该模型的具体文档。

HumanMessage

HumanMessage 对应 "user" 角色。人类消息表示用户与模型交互时输入的内容。

文本内容

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

from langchain_core.messages import HumanMessage

model.invoke([HumanMessage(content="Hello, how are you?")])
API 参考:HumanMessage
提示

当使用字符串作为输入调用聊天模型时,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
API 参考:HumanMessage

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

属性Standardized/Raw描述
contentRawUsually a string, but can be a list of content blocks. See content for details.
tool_callsStandardizedTool calls associated with the message. See tool calling for details.
invalid_tool_callsStandardizedTool calls with parsing errors associated with the message. See tool calling for details.
usage_metadataStandardizedUsage metadata for a message, such as token counts. See Usage Metadata API Reference.
idStandardizedAn optional unique identifier for the message, ideally provided by the provider/model that created the message.
response_metadataRawResponse metadata, e.g., response headers, logprobs, token counts.

内容

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

内容为:

  • text -- 几乎所有聊天模型的标准。
  • A 字典列表-- 每个字典代表一个内容块,并与一个type.
    • 由Anthropic用于在执行工具调用时展示代理的思考过程。
    • 由OpenAI用于音频输出。有关更多信息,请参阅多模态内容
重要

content 属性在不同的聊天模型提供商之间尚未标准化,这主要是因为目前可用于归纳的示例还很少。

AIMessageChunk

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

它由聊天模型的 streamastreamastream_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”的消息,其中包含调用工具的结果。调用工具。除了 rolecontent 之外,此消息还包含:

  • 一个 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 格式。