LangGraph 通过in-memory持久化实现多轮对话能力Chatbot

基于LangGraph、Groq和Tavily打造可以调用外部搜索引擎工具的对话机器人 的基础上,我们再进一步让对话机器人具备对历史交互上下文的记忆能力,以打造一个可以与用户进行连贯(多轮)对话能力的chatbot。

何为基于LLM的chatbot的多轮对话能力?(ChatGPT回答)

基于大语言模型(LLM, Large Language Model)的chatbot的多轮对话能力,指的是该系统能够在多次交互中保持上下文,理解并处理与用户的连续对话。这种能力包括以下几个方面:

  1. 上下文理解:chatbot能够记住用户在之前轮次中的输入,从而在后续对话中做出与上下文相关的回答。它可以跨多个对话轮次保持一致性,并能根据前文的内容调整输出。
  2. 动态应对:在多轮对话中,用户的需求和意图可能会随着对话的深入而变化。chatbot可以根据新输入的信息灵活调整对话的方向,处理不同的话题和场景转换。
  3. 意图追踪:在多轮对话中,chatbot需要持续追踪用户的核心意图。即使用户在多轮对话中表达方式变化,chatbot依然能够理解其背后的意图并做出相应回应。
  4. 任务导向对话:对于一些任务型chatbot(如预定酒店、查询信息等),多轮对话能力至关重要,能够通过多次交互获取完整的上下文信息,帮助用户完成特定任务。
  5. 个性化和记忆:在更复杂的多轮对话中,chatbot还可以记住用户的偏好、历史对话等信息,提供个性化的回应。这种能力可以在不同对话中提供持续的用户体验。

LLM通过大量数据训练,具备语言理解和生成的强大能力,能够支持这种复杂的对话交互模式。

LangGraph 提供的解决方案

LangGraph 通过将 checkpointing (检查点)持久化解决了chatbot没有对之前交互上下文的记忆功能。具体实现是在编译图的时候提供一个检查器(checkpointer),并在调用图时提供线程 ID(thread_id)(用于隔离不同用户与chatbot的交互上下文)。通过这种方式,LangGraph 就会在每一步之后自动保存状态;当再次使用相同的线程 ID 调用图时,LangGraph 会加载保存的状态,进而让chatbot能够继续之前的对话,实现与用户之间交互的连贯性。

代码实现

说明:本文将基于 LangGraph 官方教程文档 中提供的代码进行讲解,代码实现的是将Graph的状态持久化到内存(in-memory persistence),所以程序一旦运行结束,暂时保存的状态也会被清除掉。如果希望可以持久化到数据库而不是暂时的内存持久化,可以参考 官方教程 进行实现。

先附上完整代码

import os
os.environ["TAVILY_API_KEY"] = "TAVILY_API_KEY"
os.environ["LANGCHAIN_API_KEY"] = "LANGCHAIN_API_KEY"  # Get this from smith.langchain.com
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["GROQ_API_KEY"] = "GROQ_API_KEY"
from langchain_community.tools.tavily_search import TavilySearchResults
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langchain_groq import ChatGroq
from langchain_core.messages import ToolMessage
from langgraph.prebuilt import ToolNode, tools_condition
from langgraph.checkpoint.memory import MemorySaver


class State(TypedDict):
    messages: Annotated[list
基于大模型智能体Agent的LangGraph入门与实战课程目标:本课程旨在为LangGraph的初学者提供深入的理论知识和实践技能,使其能够独立构建和部署基于LangGraph的应用程序。课程形式:理论讲解 + 实战演练第1课 LangGraph基础架构与环境配置-LangGraph的概念解析第2课 LangGraph基础架构与环境配置-LangGraph的环境搭建与依赖管理第3课 LangGraph的基础原理与应用入门-构建基本聊天机器人及使用工具增强第4课 LangGraph的基础原理与应用入门-内存管理、人在回路、状态更新第5课 LangGraph高级图控制技术-并行节点扇出和扇入、增加额外步骤、条件分支第6课 LangGraph高级图控制技术-稳定排序、Map-Reduce并行执行、图递归控制第7课 LangGraph持久化机制与状态管理-线程级持久化、子图持久化、跨线程持久化第8课 LangGraph Human-in-the-loop-断点设置、动态设置断点、编辑更新状态第9课 LangGraph Human-in-the-loop-等待用户输入、时间旅行、工具评审第10课 LangGraph在具有长期记忆的有状态Agent中的应用-长期记忆及短期记忆、过滤信息、删掉信息第11课 LangGraph在具有长期记忆的有状态Agent中的应用-摘要总结、跨线程持久化、代理语义搜索第12课 LangGraph工具集成与调用-直接调用ToolNode、大模型使用工具第13课 LangGraph工具集成与调用-工具调用报错处理、运行时值传递给工具、注入参数第14课 LangGraph工具集成与调用-配置传入工具、从工具更新图状态、管理大量工具第15课 LangGraph子图设计与实现-添加及使用子图、父图及子图状态管理第16课 LangGraph子图设计与实现-子图状态的查看与更新、子图输入输出的转换与处理第17课 LangGraph项目实战演练-多智能体系统主管委托各个代理第18课 LangGraph课程复习与答疑 自我反思案例及论文案例讲解
### 创建基于类的多轮对话Chatbot并使用Gradio封装 为了构建一个多轮对话的聊天机器人,可以定义一个Python类来管理对话状态和逻辑。这个类负责处理用户的输入,并根据当前上下文返回合适的响应。 #### 定义对话管理器类 通过创建`DialogueManager`类,能够有效地追踪会话历史记录以及维护对话流程的状态: ```python class DialogueManager: def __init__(self): self.context = [] def add_message(self, message): """Add a new user or bot message to the context.""" self.context.append(message) def get_response(self, input_text): """Generate response based on current dialogue history and latest input.""" # Here you can implement more complex logic such as calling OpenAI API with accumulated conversation. reply = f"Echo: {input_text}" # Add both incoming text and generated answer into context self.add_message({"role": "user", "content": input_text}) self.add_message({"role": "assistant", "content": reply}) return reply ``` 此部分展示了如何初始化对话管理对象、更新消息队列以及生成回应[^1]。 #### 使用Gradio集成图形化界面 接下来利用Gradio库快速搭建交互式的Web应用,使用户可以通过浏览器与上述实现的聊天机器人互动: ```python import gradio as gr def chat_interface(user_input, state=None): if not isinstance(state, DialogueManager): # Initialize dialogue manager when needed state = DialogueManager() output = state.get_response(user_input) return output, state iface = gr.Interface( fn=chat_interface, inputs=[gr.inputs.Textbox(lines=2, placeholder="Enter your question here..."), 'state'], outputs=["text", 'state'] ).launch(share=True) ``` 这里说明了怎样设置Gradio接口函数接收来自前端的消息作为参数传递给后台处理器(`chat_interface`);同时保存对话状态以便支持连续性的交流过程[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值