消息 (Messages)
消息是 LangChain 中模型的基本上下文单元。它们代表模型的输入和输出,携带与 LLM 交互时表示对话状态所需的内容和元数据。
消息是包含以下内容的对象:
- 角色 (Role) - 标识消息类型(如
system、user) - 内容 (Content) - 表示消息的实际内容(如文本、图像、音频、文档等)
- 元数据 (Metadata) - 可选字段,如响应信息、消息 ID 和令牌使用情况
LangChain 提供了一种标准消息类型,适用于所有模型提供商,确保无论调用哪个模型都能获得一致的行为。
基本用法
使用消息的最简单方法是创建消息对象,并在调用时将它们传递给模型。
import { initChatModel, HumanMessage, SystemMessage } from "langchain";
const model = await initChatModel("gpt-4.1");
const systemMsg = new SystemMessage("你是一个有帮助的助手。");
const humanMsg = new HumanMessage("你好,你好吗?");
const messages = [systemMsg, humanMsg];
const response = await model.invoke(messages); // 返回 AIMessage
文本提示
文本提示是字符串 - 非常适合不需要保留对话历史的简单生成任务。
const response = await model.invoke("写一首关于春天的俳句");
在以下情况使用文本提示:
- 你有一个单独的独立请求
- 你不需要对话历史
- 你想要最小的代码复杂性
消息提示
或者,你可以通过提供消息对象列表来向模型传递消息列表。
import { SystemMessage, HumanMessage, AIMessage } from "langchain";
const messages = [
new SystemMessage("你是一位诗歌专家"),
new HumanMessage("写一首关于春天的俳句"),
new AIMessage("樱花盛开时..."),
];
const response = await model.invoke(messages);
在以下情况使用消息提示:
- 管理多轮对话
- 处理多模态内容(图像、音频、文件)
- 包含系统指令
字典格式
你也可以直接使用 OpenAI 聊天完成格式指定消息。
const messages = [
{ role: "system", content: "你是一位诗歌专家" },
{ role: "user", content: "写一首关于春天的俳句" },
{ role: "assistant", content: "樱花盛开时..." },
];
const response = await model.invoke(messages);
消息类型
LangChain 提供了几种消息类型,每种都有特定的用途:
SystemMessage
系统消息为模型设置行为和上下文。它们通常放在对话的开头。
import { SystemMessage } from "langchain";
const systemMsg = new SystemMessage("你是一个专业的翻译助手,专注于中英文翻译。");
HumanMessage
人类消息代表用户的输入。
import { HumanMessage } from "langchain";
const humanMsg = new HumanMessage("请把这句话翻译成英文:你好世界");
AIMessage
AI 消息代表模型的响应。它们也可以包含工具调用。
import { AIMessage } from "langchain";
const aiMsg = new AIMessage({
content: "Hello World",
tool_calls: [] // 可选的工具调用
});
ToolMessage
工具消息携带工具执行的结果。
import { ToolMessage } from "langchain";
const toolMsg = new ToolMessage({
content: "北京的天气是晴天,温度 25°C",
tool_call_id: "call_123",
});
消息内容
消息内容可以是简单的文本字符串,也可以是多模态内容的数组。
文本内容
const msg = new HumanMessage("这是一条简单的文本消息");
多模态内容
对于支持多模态的模型,你可以包含图像和其他媒体:
const msg = new HumanMessage({
content: [
{ type: "text", text: "描述这张图片" },
{
type: "image_url",
image_url: { url: "https://example.com/image.jpg" }
}
]
});
使用 Base64 图像
import * as fs from "fs";
const imageData = fs.readFileSync("image.png");
const base64Image = imageData.toString("base64");
const msg = new HumanMessage({
content: [
{ type: "text", text: "这张图片里有什么?" },
{
type: "image_url",
image_url: { url: `data:image/png;base64,${base64Image}` }
}
]
});
消息元数据
AI 消息可以包含有用的元数据:
const response = await model.invoke(messages);
// 访问响应元数据
console.log(response.response_metadata);
// {
// model: "gpt-4.1",
// finish_reason: "stop",
// ...
// }
// 访问令牌使用情况
console.log(response.usage_metadata);
// {
// input_tokens: 100,
// output_tokens: 50,
// total_tokens: 150
// }
消息转换
LangChain 提供了在不同格式之间转换消息的实用函数:
import { convertToOpenAIMessages } from "langchain";
const messages = [
new SystemMessage("你是一个助手"),
new HumanMessage("你好"),
];
// 转换为 OpenAI 格式
const openaiMessages = convertToOpenAIMessages(messages);
// [
// { role: "system", content: "你是一个助手" },
// { role: "user", content: "你好" }
// ]
最佳实践
- 使用系统消息 - 始终使用系统消息来设置模型的行为和上下文
- 保持对话历史 - 对于多轮对话,保持完整的消息历史
- 处理令牌限制 - 注意模型的上下文窗口大小,必要时截断历史
- 使用正确的类型 - 为不同的消息来源使用正确的消息类型