常见用例

聊天机器人

构建具备记忆、工具调用和流式响应能力的智能聊天机器人

📚 学习目标

学完这篇文章后,你将能够:

  • 使用 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)

为了让机器人记住之前的对话,我们需要:

  1. 使用 MemorySaver 作为 checkpointer。
  2. 在调用时传入 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️⃣ 智能助手 (工具调用)

现代聊天机器人通常需要调用工具(如搜索、查天气)。

架构图

关键代码

利用 bindToolsToolNode 可以快速实现。

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);
}

💡 练习题

  1. 实战题:构建一个“算命大师”聊天机器人。它应该:
    • 记住用户的名字和生日(使用 Memory)。
    • 有一个 calculate_fortune 工具,根据生日计算运势。
    • 语气始终神秘兮兮的。

📚 参考资源

官方文档


✅ 总结

本章要点

  • MemorySaver + thread_id 是实现记忆的关键。
  • 工具调用让聊天机器人变成了真正的“助手”。
  • 流式输出能显著提升长文本生成的体验。

下一步:如何让机器人基于文档回答问题?学习RAG 系统

登录以继续阅读

解锁完整文档、代码示例及更多高级功能。

立即登录

On this page