Skip to main content
在 GitHub 上打开

消息

先决条件

概述

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

每条消息都有一个角色(例如,“用户”、“助手”)和内容(例如,文本、多模态数据),以及根据聊天模型提供商而有所不同的附加元数据。

LangChain 提供了可以跨聊天模型使用的统一消息格式,允许用户使用不同的聊天模型,而无需担心每个模型提供商使用的消息格式的具体细节。

消息中有什么?

消息通常包含以下信息:

  • Role:消息的角色(例如,“user”、“assistant”)。
  • 内容:消息的内容(例如,文本、多模态数据)。
  • 其他元数据:id、name、token usage 和其他特定于模型的元数据。

角色

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

角色描述
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 对象。

五种主要消息类型是:

其他重要信息包括:

  • RemoveMessage —— 不对应于任何角色。这是一个抽象概念,在 LangGraph 中主要用于管理聊天记录。
  • legacy FunctionMessage:对应 OpenAI 传统函数调用 API 中的函数角色。

您可以在 API 参考中找到有关消息的更多信息。

SystemMessage 系统

一个SystemMessage用于启动 AI 模型的行为并提供其他上下文,例如指示模型采用特定角色或设置对话的基调(例如,“这是关于烹饪的对话”)。

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

  • 通过 “system” 消息角色:在这种情况下,系统消息作为消息序列的一部分包含在内,角色显式设置为 “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 试图在不同聊天模型提供商之间标准化的属性。原始字段特定于模型提供程序,可能会有所不同。

属性标准化/原始描述
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.

内容

的 content 属性AIMessage表示 Chat 模型生成的响应。

内容是:

  • text —— 几乎所有聊天模型的规范。
  • 词典列表 -- 每个词典代表一个内容块,并与type.
    • 被 Anthropic 用于在进行工具调用时呈现代理的思维过程。
    • 由 OpenAI 用于音频输出。有关更多信息,请参阅多模式内容
重要

content 属性在不同的聊天模型提供商之间没有标准化,主要是因为有 仍然很少有例子可以概括。

AIMessageChunk

在生成聊天模型的响应时流式传输响应是很常见的,因此用户可以实时查看响应,而不是等待生成整个响应后再显示响应。

它是从stream,astreamastream_eventschat 模型的方法。

例如

for chunk in model.stream([HumanMessage("what color is the sky?")]):
print(chunk)

AIMessageChunk遵循与AIMessage,但使用不同的 ToolCallChunk 以便能够以标准化方式流式传输工具调用。

聚合

AIMessageChunks支持运算符将它们合并为单个+AIMessage.当您想要向用户显示最终响应时,这非常有用。

ai_message = chunk1 + chunk2 + chunk3 + ...

工具消息

这表示一条角色为 “tool” 的消息,其中包含调用工具的结果。除了rolecontent,此消息包含:

  • 一个tool_call_id字段,该字段传达对为生成此结果而调用的工具的调用 ID。
  • artifact字段,该字段可用于传递工具执行的任意工件,这些工件对跟踪很有用,但不应发送到模型。

有关更多信息,请参阅工具调用

删除消息

这是一种特殊的消息类型,不对应于任何角色。它被使用 用于在 LangGraph 中管理聊天记录。

有关如何使用RemoveMessage:

(旧版)函数消息

这是一种遗留消息类型,对应于 OpenAI 的传统函数调用 API。ToolMessage应改用 API 来对应更新的工具调用 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 格式。