1. 消息机制解读
在 LangChain 框架中,消息是实现模型交互的基础单元,简单来说就是输入与输出的载体。每次与大语言模型(LLM)对话时,消息都会携带内容、角色以及可能的元数据,帮助模型准确把握当前对话的上下文。每个消息对象通常由三部分构成:

- 角色(role)——标识该消息的发送方(例如系统指令、用户提问等)。
- 内容(content)——实际承载的信息,可以是文本、图片、音频、文档等多种格式。
- 元数据(metadata)——可选的附加信息,比如响应 ID、令牌用量等。
LangChain 提供了一套标准化的消息类型,无论对接哪种模型,消息的行为表现均保持一致,免去了适配不同接口的麻烦。
常见消息类型包括:
- 系统消息(SystemMessage)——用于设定模型的回复规则、基调或角色定义,相当于给模型预设的“操作手册”。
- 人类消息(HumanMessage)——用户输入的提问或指令,代表需要模型解答的问题。
- AI消息(AIMessage)——模型返回的响应,可包含文本、工具调用信息、元数据等。
- 工具消息(ToolMessage)——工具调用执行后返回的结果数据。
下面直接展示代码示例,结合实践理解更直观。
2. 实操演示
2.1 导入相关依赖模块
import dotenv from "dotenv"
import { ChatOpenAI } from "@langchain/openai"
dotenv.config()
2.2 创建模型实例
const llm = new ChatOpenAI({
model: "qwen-plus",
apiKey: process.env.QWEN_API_KEY,
temperature: 0.7,
streamUsage: false, // 是否启用流式输出,默认为 false
// maxTokens: 1000, // 最大令牌数
// maxRetries: 6 , // 最大重试次数
// timeout: undefined, // 超时时间设置
logprobs: true,
configuration: {
baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1"
}
})
2.3 消息的基础用法
将多种类型的消息一次性提交给模型,模型会根据每条消息的角色与内容依次理解并生成回应。这在多轮对话中尤为常见——要让模型记住历史信息,必须把先前的消息全部传入。来看一个完整示例:
import { HumanMessage, SystemMessage, AIMessage } from "langchain";
const systemMsg = new SystemMessage("你是一个有用的智能助手!");
const humanMsg1 = new HumanMessage("我叫小军,请问明朝什么时候建立?");
const aiMessage = new AIMessage("明朝建立于**1368年**。");
const humanMsg2 = new HumanMessage("我叫什么名字,刚刚我问的问题是什么?");
const messages = [systemMsg, humanMsg1, aiMessage, humanMsg2];
const response = await llm.invoke(messages);
console.log(response.content);
// 返回一个AIMessage对象
运行后可以看到模型正确记住了“小军”这个名字,并且知道之前询问的是“明朝什么时候建立”,说明消息传递的历史上下文已经生效。
当然,你也可以完全手动组装消息,而不使用框架提供的方法。例如:
const messages = [
{ role: "system", content: "You are a poetry expert" },
{ role: "user", content: "Write a haiku about spring" },
{ role: "assistant", content: "Cherry blossoms bloom..." },
];
const response = await model.invoke(messages);
对于 HumanMessage,你还可以附带额外的字段,比如名字和会话 ID,使消息携带更细粒度的信息:
const humanMsg = new HumanMessage({
content: "Hello!",
name: "alice",
id: "msg_123",
});
不过有一点值得留意:有时手动创建一个 AIMessage 并塞入历史记录反而很有用——就像模型自己回复了一样。不同厂商的模型对消息权重的处理方式存在差异,手动构造 AIMessage 可以灵活调整对话历史,在某些场景下非常实用。
2.3 工具消息 ToolMessage
工具消息指的是大模型调用某个外部工具后,由该工具返回的结果。对于支持工具调用的模型,AI 消息中可以包含 tool_calls,而工具消息则将调用结果回传给模型。下面是一个简单示例:
import { AIMessage, ToolMessage } from "langchain";
const aiMessage = new AIMessage({
content: [],
tool_calls: [
{
name: "get_weather",
args: { location: "San Francisco" },
id: "call_123
}
]
});
const toolMessage = new ToolMessage({
content: "Sunny, 72°F",
tool_call_id: "call_123
});
const messages = [
new HumanMessage("What's the weather in San Francisco?"),
aiMessage, // 模型发起的工具调用
toolMessage, // 工具执行后的返回结果
];
const response = await llm.invoke(messages);
// 模型处理工具返回的数据并生成最终回答
可以看到,模型先发出一个工具调用指令,工具执行后把结果封装成 ToolMessage 放回去,模型就能基于真实数据继续回复。这套机制在多步骤的 agent 工作流中非常关键。
