跳到主要内容

消息

先决条件

概述

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

每条消息都有一个角色(例如,“用户”、“助手”)、内容(例如,文本、多模态数据)以及额外的元数据,这些元数据可能因聊天模型提供商而异。

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

消息内部是什么?

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

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

角色

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

角色描述
系统用于告诉聊天模型如何表现并提供额外的上下文。并非所有聊天模型提供商都支持。
用户表示与模型交互的用户的输入,通常以文本或其他交互式输入的形式。
助手表示来自模型的响应,可以包括文本或调用工具的请求。
工具一种消息,用于在检索到外部数据或处理后,将工具调用的结果传递回模型。与支持工具调用的聊天模型一起使用。
函数(旧版)这是一个旧版角色,对应于 OpenAI 的旧版函数调用 API。应使用 tool 角色代替。

内容

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

目前,大多数聊天模型支持文本作为主要内容类型,一些模型也支持多模态数据。 但是,在大多数聊天模型提供商中,对多模态数据的支持仍然有限。

有关更多信息,请参阅

  • HumanMessage -- 用于来自用户的输入内容。
  • AIMessage -- 用于来自模型的响应内容。
  • 多模态 -- 有关多模态内容的更多信息。

其他消息数据

根据聊天模型提供商,消息可以包括其他数据,例如

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

对话结构

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

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

  1. 用户消息:“你好,你好吗?”
  2. 助手消息:“我很好,谢谢你的询问。”
  3. 用户消息:“你能给我讲个笑话吗?”
  4. 助手消息:“当然! 为什么稻草人赢得了奖项? 因为他在他的领域里很杰出!”

请阅读 聊天历史记录 指南,以获取有关管理聊天历史记录和确保对话结构正确的更多信息。

LangChain 消息

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

LangChain 消息是从 BaseMessage 继承的类。

五个主要消息类型是

其他重要消息包括

  • RemoveMessage -- 不对应于任何角色。 这是一种抽象,主要用于 LangGraph 中以管理聊天历史记录。
  • 旧版 FunctionMessage:对应于 OpenAI 的 旧版 函数调用 API 中的 function 角色。

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

SystemMessage

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

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

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

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

如果提供商不支持系统消息,在大多数情况下,LangChain 将尝试将系统消息的内容合并到 HumanMessage 中,或者在不可能的情况下引发异常。 但是,此行为尚未在所有实现中得到一致执行,如果使用不太流行的聊天模型实现(例如,来自 @langchain/community 包的实现),建议检查该模型的具体文档。

HumanMessage

HumanMessage 对应于 “user” 角色。 人类消息表示来自与模型交互的用户的输入。

文本内容

大多数聊天模型都期望用户输入采用文本形式。

import { HumanMessage } from "@langchain/core/messages";

await model.invoke([new HumanMessage("Hello, how are you?")]);
提示

当使用字符串作为输入调用聊天模型时,LangChain 会自动将字符串转换为 HumanMessage 对象。 这对于快速测试非常有用。

await model.invoke("Hello, how are you?");

多模态内容

一些聊天模型接受多模态输入,例如图像、音频、视频或 PDF 等文件。

请参阅 多模态 指南以获取更多信息。

AIMessage

AIMessage 用于表示角色为 “assistant” 的消息。 这是来自模型的响应,可以包括文本或调用工具的请求。 它还可以包括其他媒体类型,如图像、音频或视频 - 尽管目前这仍然不常见。

import { HumanMessage } from "@langchain/core/messages";

const aiMessage = await model.invoke([new HumanMessage("Tell me a joke")]);
console.log(aiMessage);
AIMessage({
content: "Why did the chicken cross the road?\n\nTo get to the other side!",
tool_calls: [],
response_metadata: { ... },
usage_metadata: { ... },
})

AIMessage 具有以下属性。 标准化 的属性是 LangChain 尝试在不同的聊天模型提供商之间标准化的属性。 raw 字段特定于模型提供商,可能会有所不同。

属性标准化/原始描述
内容原始通常是一个字符串,但也可以是内容块的列表。 有关详细信息,请参阅 内容
tool_calls标准化与消息关联的工具调用。 有关详细信息,请参阅 工具调用
invalid_tool_calls标准化与消息关联的具有解析错误的工具调用。 有关详细信息,请参阅 工具调用
usage_metadata标准化消息的使用元数据,例如 令牌计数。 请参阅 使用情况元数据 API 参考
id标准化消息的可选唯一标识符,最好由创建消息的提供商/模型提供。
response_metadata原始响应元数据,例如,响应标头、对数概率、令牌计数。

内容

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

内容可以是

  • 文本 -- 几乎所有聊天模型的规范。
  • 对象数组 -- 每个对象代表一个内容块,并与一个 type 关联。
    • Anthropic 用于在进行 工具调用 时显示代理思考过程。
    • OpenAI 用于音频输出。 请参阅 多模态内容 以获取更多信息。
信息

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

AIMessageChunk

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

它从聊天模型的 streamstreamEvents 方法返回。

例如,

for await (const chunk of model.stream([
new HumanMessage("what color is the sky?"),
])) {
console.log(chunk);
}

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

聚合

<Type>MessageChunks 具有你可以使用的 concat 方法,或者你可以导入它。 当你想向用户显示最终响应时,这很有用。

const aiMessage = chunk1.concat(chunk2).concat(chunk3).concat(...);

或者

import { concat } from "@langchain/core/utils/stream";
const aiMessage = concat(chunk1, chunk2);

ToolMessage

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

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

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

RemoveMessage

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

请参阅以下内容以获取有关如何使用 RemoveMessage 的更多信息

(旧版)FunctionMessage

这是一个旧版消息类型,对应于 OpenAI 的旧版函数调用 API。 应使用 ToolMessage 代替,以对应更新的工具调用 API。

OpenAI 格式

输入

聊天模型也接受 OpenAI 的格式作为聊天模型的输入

await chatModel.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 格式。


此页面是否对您有帮助?


您也可以留下详细的反馈 在 GitHub 上.