消息
概述
消息是聊天模型中的通信单位。它们用于表示聊天模型的输入和输出,以及可能与对话相关的任何额外上下文或元数据。
每条消息都有一个角色(例如,“用户”,“助手”)和内容(例如,文本,多模态数据),并带有根据聊天模型提供商而定的额外元数据。
LangChain 提供了一个统一的消息格式,可以在聊天模型中使用,允许用户与不同的聊天模型一起工作,而无需担心每个模型提供商使用的消息格式的具体细节。
消息里面有什么?
一条消息通常由以下几部分信息组成:
- 角色: 消息的角色(例如,"用户", "助手")。
- 内容: 消息的内容(例如,文本、多模态数据)。
- 附加元数据:id、名称、token 使用情况以及其他模型特定的元数据。
角色
角色用于区分对话中不同类型的消息,并帮助聊天模型理解如何响应给定的消息序列。
角色 | 描述 |
---|---|
system | 用于告诉聊天模型如何行为并提供额外的上下文。并非所有聊天模型提供商都支持。 |
user | 表示与模型交互的用户输入,通常以文本或其他交互式输入的形式出现。 |
assistant | 表示来自模型的响应,可以包括文本或调用工具的请求。 |
tool | 用于在获取外部数据或处理后,将工具调用的结果传递回模型的消息。与支持工具调用的聊天模型一起使用。 |
function (legacy) | 这是一个遗留角色,对应于OpenAI的遗留函数调用API。应改用tool角色。 |
内容
消息文本的内容或表示多模态数据(例如图像、音频、视频)的字典列表。不同聊天模型提供商之间的内容格式可能有所不同。
目前,大多数聊天模型支持文本作为主要内容类型,一些模型还支持多模态数据。然而,大多数聊天模型提供商对多模态数据的支持仍然有限。
更多信息请参见:
- SystemMessage -- 用于传递应指导对话的内容
- HumanMessage -- 用于用户输入的内容。
- AIMessage -- 用于模型响应中的内容。
- Multimodality -- 了解更多关于多模态内容的信息。
其他消息数据
根据聊天模型提供商的不同,消息可以包含其他数据,例如:
- ID: 消息的可选唯一标识符。
- 名称: 一个可选的
name
属性,允许区分具有相同角色的不同实体/说话者。并非所有模型都支持此功能! - 元数据: 关于消息的额外信息,例如时间戳、令牌使用情况等。
- 工具调用: 模型发出的调用一个或多个工具的请求。有关更多信息,请参见工具调用。
对话结构
聊天模型中的消息序列应遵循特定结构,以确保聊天模型能够生成有效的响应。
例如,一个典型的对话结构可能如下所示:
- 用户消息: "你好,你好吗?"
- 助手消息: "我很好,谢谢你的关心。"
- 用户消息: "你能给我讲个笑话吗?"
- 助手消息: "当然!为什么稻草人会获奖?因为他在他的领域里非常出色!"
请阅读聊天历史指南,了解更多关于管理聊天历史和确保对话结构正确的信息。
LangChain 消息
LangChain 提供了一个统一的消息格式,可以在所有聊天模型中使用,使用户能够与不同的聊天模型一起工作,而无需担心每个模型提供商使用的消息格式的具体细节。
LangChain 消息是从 BaseMessage 继承的 Python 对象。
五种主要的消息类型是:
- SystemMessage: 对应 system 角色
- HumanMessage: 对应于 用户 角色
- AIMessage: 对应 assistant 角色
- AIMessageChunk: 对应于 assistant 角色,用于 流式 响应
- ToolMessage: 对应 tool 角色
其他重要信息包括:
- RemoveMessage -- 不对应任何角色。这是一个抽象概念,主要用于LangGraph中管理聊天历史。
- 旧版 FunctionMessage: 对应于OpenAI的旧版函数调用API中的function角色。
你可以在API参考中找到更多关于消息的信息。
系统消息
一个SystemMessage
用于引导AI模型的行为并提供额外的上下文,例如指示模型采用特定的角色或设置对话的语气(例如,“这是一次关于烹饪的对话”)。
不同的聊天提供商可能以以下方式之一支持系统消息:
- 通过“系统”消息角色:在这种情况下,系统消息作为消息序列的一部分包含在内,角色明确设置为“系统”。
- 通过单独的API参数传递系统指令:系统指令不是作为消息包含在内,而是通过专用的API参数传递。
- 不支持系统消息:有些模型根本不支持系统消息。
大多数主要的聊天模型提供商通过聊天消息或单独的API参数支持系统指令。LangChain将根据提供商的功能自动适应。如果提供商支持用于系统指令的单独API参数,LangChain将提取系统消息的内容并通过该参数传递。
如果提供者不支持系统消息,在大多数情况下,LangChain 会尝试将系统消息的内容合并到 HumanMessage 中,如果不可能,则会引发异常。然而,这种行为在所有实现中尚未一致执行,如果使用不太流行的聊天模型实现(例如,来自 langchain-community
包的实现),建议检查该模型的特定文档。
人类消息
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
用于表示角色为 "assistant" 的消息。这是模型的响应,可以包括文本或调用工具的请求。它也可能包括其他媒体类型,如图像、音频或视频——尽管目前这种情况还不常见。
from langchain_core.messages import HumanMessage
ai_message = model.invoke([HumanMessage("Tell me a joke")])
ai_message # <-- AIMessage
一个AIMessage
具有以下属性。那些被标准化的属性是LangChain尝试在不同聊天模型提供商之间标准化的属性。raw字段是特定于模型提供商的,可能会有所不同。
属性 | 标准化/原始 | 描述 |
---|---|---|
content | 原始 | 通常是一个字符串,但也可以是一个内容块的列表。详情请参见content。 |
tool_calls | 标准化 | 与消息相关的工具调用。详情请参阅工具调用。 |
invalid_tool_calls | 标准化 | 与消息相关的解析错误的工具调用。详情请参阅工具调用。 |
usage_metadata | 标准化 | 消息的使用元数据,例如令牌计数。请参阅使用元数据API参考。 |
id | 标准化 | 消息的可选唯一标识符,最好由创建消息的提供者/模型提供。 |
response_metadata | 原始 | 响应元数据,例如响应头、logprobs、令牌计数。 |
内容
AIMessage
的 content 属性表示聊天模型生成的响应。
内容可能是:
- text -- 几乎所有聊天模型的规范。
- 一个字典列表 -- 每个字典代表一个内容块,并与一个
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 + ...
工具消息
这表示一个角色为“工具”的消息,其中包含调用工具的结果。除了role
和content
之外,此消息还具有:
- 一个
tool_call_id
字段,用于传递调用工具以生成此结果的调用ID。 - 一个
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格式。
convert_to_openai_messages 工具函数可用于将 LangChain 消息转换为 OpenAI 格式。