Langchain.js 实战二 会话消息管理
1 消息机制解读 在 LangChain 框架中,消息是实现模型交互的基础单元,简单来说就是输入与输出的载体。每次与大语言模型(LLM)对话时,消息都会携带内容、角色以及可能的元数据,帮助模型准确把握当前对话的上下文。每个消息对象通常由三部分构成: 角色(role)——标识该消息的发送方(例如系统
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 工作流中非常关键。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
天学会AI应用开发上下文与RAG阶段性总结
系统梳理了AI应用开发中的上下文与RAG核心概念。搭建Python3 10开发环境后,通过提示词工程管理历史对话,利用截断、摘要提取及离线大模型压缩上下文。RAG采用加载文档、分块、向量化、存入FAISS或Chroma库、检索五个步骤,中文场景推荐BGE-small嵌入模型,实战证明离线检索有效。
Yank Note系列14:如何与AI协作写文章
YankNote3 92 1发布,新增“审阅批注”和“编辑装订线”扩展,聚焦AI写作的人机协作循环。审阅批注将反馈绑定到选中文本,编辑装订线高亮显示修改行,帮助人看清AI改动。同时升级Markdown-it至14 3 0,优化中日韩文本渲染。
一文读懂MCP:让AI大模型万能插拔协议
MCP(模型上下文协议)由Anthropic提出,为AI大模型提供通用接口标准,解决工具调用碎片化问题。采用Host Client Server架构,支持动态发现工具,通过stdio或HTTP通信,实现工具即插即用、跨语言调用和统一对接规范。
BeeWeave开源:为AI Agent打造越用越懂你的知识创作台
BeeWeave是一个Agent原生的知识创作台,通过workbench和vault双层结构实现素材获取、内容创作、知识沉淀与上下文复用的持续闭环。它支持多Agent共用同一套知识库,内置41个Skills,采用MIT开源协议,旨在解决跨会话知识丢失问题。
AI闭环工程师自动推进工程任务
LoopEngineer是一种将AI嵌入可执行、可验证、可持续迭代的工作循环中的工程协作方式。通过触发器、上下文、工具和验证机制,AI在循环中自动分析、执行、验证并调整,直至任务完成或需人工介入,实现复杂任务的可观察、可审计、可批准的分段自动化。
- 热门数据榜
相关攻略
2026-07-12 15:04
2026-07-12 15:04
2026-07-12 15:04
2026-07-12 15:03
2026-07-12 15:03
2026-07-12 15:03
2026-07-12 15:03
2026-07-12 15:03
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

