在 基于LangGraph、Groq和Tavily打造可以调用外部搜索引擎工具的对话机器人 的基础上,我们再进一步让对话机器人具备对历史交互上下文的记忆能力,以打造一个可以与用户进行连贯(多轮)对话能力的chatbot。
何为基于LLM的chatbot的多轮对话能力?(ChatGPT回答)
基于大语言模型(LLM, Large Language Model)的chatbot的多轮对话能力,指的是该系统能够在多次交互中保持上下文,理解并处理与用户的连续对话。这种能力包括以下几个方面:
- 上下文理解:chatbot能够记住用户在之前轮次中的输入,从而在后续对话中做出与上下文相关的回答。它可以跨多个对话轮次保持一致性,并能根据前文的内容调整输出。
- 动态应对:在多轮对话中,用户的需求和意图可能会随着对话的深入而变化。chatbot可以根据新输入的信息灵活调整对话的方向,处理不同的话题和场景转换。
- 意图追踪:在多轮对话中,chatbot需要持续追踪用户的核心意图。即使用户在多轮对话中表达方式变化,chatbot依然能够理解其背后的意图并做出相应回应。
- 任务导向对话:对于一些任务型chatbot(如预定酒店、查询信息等),多轮对话能力至关重要,能够通过多次交互获取完整的上下文信息,帮助用户完成特定任务。
- 个性化和记忆:在更复杂的多轮对话中,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