常见用例
聊天机器人
构建具备记忆、工具调用和流式响应能力的智能聊天机器人
📚 学习目标
学完这篇文章后,你将能够:
- 使用
MemorySaver实现多轮对话记忆 - 构建具备工具调用能力的智能助手
- 实现流式响应以优化用户体验
前置知识
在开始学习之前,建议先阅读:
你需要了解:
MessagesAnnotation的基本用法
1️⃣ 基础聊天机器人
最简单的聊天机器人只需要一个节点:接收消息,调用 LLM,返回回复。
import { StateGraph, MessagesAnnotation, START, END } from '@langchain/langgraph';
import { ChatOpenAI } from '@langchain/openai';
const model = new ChatOpenAI({ model: "gpt-4" });
// 简单的聊天节点
const chatbotNode = async (state) => {
const response = await model.invoke(state.messages);
return { messages: [response] };
};
const app = new StateGraph(MessagesAnnotation)
.addNode("chatbot", chatbotNode)
.addEdge(START, "chatbot")
.addEdge("chatbot", END)
.compile();2️⃣ 添加记忆 (Memory)
为了让机器人记住之前的对话,我们需要:
- 使用
MemorySaver作为 checkpointer。 - 在调用时传入
thread_id。
import { MemorySaver } from '@langchain/langgraph';
const checkpointer = new MemorySaver();
// 👇 编译时传入 checkpointer
const app = workflow.compile({ checkpointer });
// 👇 调用时传入 thread_id
const config = { configurable: { thread_id: "user-123" } };
await app.invoke({ messages: [new HumanMessage("Hi!")] }, config);3️⃣ 智能助手 (工具调用)
现代聊天机器人通常需要调用工具(如搜索、查天气)。
架构图
关键代码
利用 bindTools 和 ToolNode 可以快速实现。
const tools = [weatherTool, searchTool];
const modelWithTools = model.bindTools(tools);
const toolNode = new ToolNode(tools);
// ... 构建图 ...
workflow
.addNode("agent", agentNode)
.addNode("tools", toolNode)
.addConditionalEdges("agent", shouldContinue);4️⃣ 流式响应 (Streaming)
LangGraph 支持流式输出,这对于聊天体验至关重要。
const stream = await app.stream(
{ messages: [new HumanMessage("写一篇长故事")] },
{ streamMode: "values" } // 或者 "updates"
);
for await (const chunk of stream) {
// 实时获取最新的消息列表
const lastMessage = chunk.messages[chunk.messages.length - 1];
console.log(lastMessage.content);
}💡 练习题
- 实战题:构建一个“算命大师”聊天机器人。它应该:
- 记住用户的名字和生日(使用 Memory)。
- 有一个
calculate_fortune工具,根据生日计算运势。 - 语气始终神秘兮兮的。
📚 参考资源
官方文档
✅ 总结
本章要点:
MemorySaver+thread_id是实现记忆的关键。- 工具调用让聊天机器人变成了真正的“助手”。
- 流式输出能显著提升长文本生成的体验。
下一步:如何让机器人基于文档回答问题?学习RAG 系统。
登录以继续阅读
解锁完整文档、代码示例及更多高级功能。