成为新会员获取本项目完整教程资料

加入会员群

作为长期从事机器学习和AI算法研究的从业者,我注意到一个趋势:越来越多的开发者希望构建具备“对话记忆”的AI智能体——它能记住刚才聊过什么,进而给出连贯、合理的回复,而不是像金鱼一样每次对话都从零开始。这种需求在客服助手、个人知识管家、代码陪练等场景中尤为突出。本文中客户的核心诉求是:能否不依赖外部向量数据库或知识库(即不走RAG路线),仅凭大语言模型自身的推理能力和对话上下文的记忆,就搭建一个可理解、可规划、可交互的AI智能体?我们基于LangChain和LangGraph框架给出了一个模块化的技术方案。本文将从环境搭建、状态定义、工作流编排到可视化分析,逐步展示一个完整的实现路径。希望通过这篇文章,能帮助读者理解状态图驱动的工作流设计思路,并以此为基础扩展出更复杂的智能体应用。

“本项目完整教程资料”

下载资料(教程)

在正式进入实现之前,我们需要先理解这两个框架各自的职责,这好比理解发动机和变速箱在汽车中的分工——它们各自解决不同层面的问题,但组合在一起才能驱动整车。LangChain 是一个面向大语言模型应用的开发框架。它的核心价值在于将LLM调用过程中常见的操作——提示词管理、链式调用(将多个操作串联为流水线)、对话记忆管理、外部工具连接(如API、数据库)——封装为可复用的模块。可以把LangChain看作连接LLM与上层业务逻辑的“万能胶水层”(行业术语:LLM编排框架)。LangGraph 则专注于解决更复杂的问题:当AI应用不是一条直线走到底,而是需要根据条件分支、循环迭代、状态流转时,LangGraph用“状态图(State Graph)”的方式来描述整个工作流。每个节点代表一个逻辑步骤(如分类、生成、优化),节点之间的边定义了数据流转方向。这种设计让复杂的工作流变得可视化和可调试——就像用流程图描述业务流程一样直观(行业术语:有状态工作流引擎)。两者的组合创造了一种“模块化搭建AI系统”的模式:LangChain负责每个节点内部的LLM交互,LangGraph负责节点间的编排。后续各节将展示这一组合的具体落地过程。

智能体之所以能“记住”对话,核心在于我们设计了一个结构化的状态对象。这里使用Python的TypedDict类型注解来明确状态中每个字段的含义和类型约束。具体而言,状态对象包含三个字段:user_query用于存储用户最新输入的问题,bot_reply保存模型生成的回复内容,chat_log则以列表形式累积全部历史对话记录,为后续轮次提供上下文。首先安装所需的核心依赖包:langchain、langgraph、langchain-openai、networkx和matplotlib。接下来需要配置OpenAI API密钥,使得LangChain能够正常发起模型调用请求,密钥应通过环境变量传入而非硬编码在代码中。

以下是定义智能体状态结构并搭建三阶段工作流的代码实现。通过TypedDict定义状态,categorize → produce_answer → polish_response 三个节点按顺序执行,形成一个完整的“接收输入→生成回复→记忆更新”闭环。

# 智能体状态定义与工作流搭建
from typing import TypedDict, List
from langgraph.graph import StateGraph, START, END
from langchain.chat_models import init_chat_model

# 定义带记忆的智能体状态结构
class AgentState(TypedDict):
    user_query: str           # 用户当前问题
    bot_reply: str           # 模型回复内容
    chat_log: List[str]      # 历史对话记录列表

# 初始化LLM(GPT-4.1,temperature=0.3保证稳定性)
llm = init_chat_model("gpt-4.1", temperature=0.3)

# 节点1:意图分类
def classify_intent(state: AgentState) -> AgentState:
    prompt = f"请根据以下用户问题判断意图类别:\n{state['user_query']}"
    result = llm.invoke(prompt)
    state["bot_reply"] = result.content
    return state

# 节点2:生成回复
def generate_reply(state: AgentState) -> AgentState:
    history = "\n".join(state.get("chat_log", []))
    prompt = f"历史对话记录:\n{history}\n\n当前用户问题:{state['user_query']}\n请结合上下文给出专业回复:"
    result = llm.invoke(prompt)
    state["bot_reply"] = result.content
    return state

# 节点3:结果润色并更新记忆
def polish_response(state: AgentState) -> AgentState:
    state["chat_log"].append(f"用户:{state['user_query']}")
    state["chat_log"].append(f"智能体:{state['bot_reply']}")
    return state

# 构建状态图并编译
graph = StateGraph(AgentState)
graph.add_node("classify_intent", classify_intent)
graph.add_node("generate_reply", generate_reply)
graph.add_node("polish_response", polish_response)
graph.add_edge(START, "classify_intent")
graph.add_edge("classify_intent", "generate_reply")
graph.add_edge("generate_reply", "polish_response")
graph.add_edge("polish_response", END)
agent_graph = graph.compile()

LangGraph构建的工作流可以通过NetworkX转换为拓扑图,直观呈现数据在各节点间的流转路径。每个节点以不同颜色区分功能角色,箭头标明执行顺序。

工作流拓扑图

工作流拓扑图清晰展示了三个节点的线性串联关系:消息从用户输入进入classify_intent节点,经generate_reply生成回复,最后由polish_response完成润色并更新记忆。

最后一步是将编译好的状态图投入实际使用。我们构建一个持续运行的对话循环:用户每次输入问题后,智能体会结合chat_log中积累的历史上下文,给出连贯的回复,并将本轮问答追加到记忆中供下次使用。

运行效果

运行效果表明,智能体能够在多轮对话中保持上下文连贯性——当用户连续追问时,模型会基于chat_log中已有的回复来理解新问题的意图,而非孤立地处理每一次输入。

相关技术文章图片

RAG与Python的智能编程教程问答系统:DeepSeek大模型驱动、LangChain流程构建、FAISS向量检索与语义相似度匹配技术实现

基于LangChain流程构建框架,结合DeepSeek大模型与FAISS向量数据库,搭建了一套完整的RAG(检索增强生成)智能编程教程问答系统。

阅读全文

下表从多个维度对比了本文方案的特性与两种常见替代路线(无记忆的简单LLM调用、基于外部知识库的RAG系统)。

对比维度本文方案无记忆LLMRAG系统
对话连贯性基于chat_log保持多轮上下文每轮独立取决于检索质量
架构复杂度中等
外部依赖仅需LLM API仅需LLM API需向量库+嵌入模型
可扩展性节点可自由增删有限检索策略可调
工作流可视化支持部分支持
适用场景客服、个人管家、代码陪练单次问答文档问答

持久化记忆使得智能体在会话期间能记住此前所有交互内容。模块化设计将分类、生成、优化拆分为独立节点,便于单独调试和替换。可视化能力让工作流的逻辑一目了然,降低了团队协作中的沟通成本。无需外部知识库意味着部署更轻量,只需确保LLM接口可用即可运行。值得一提的是,在论文答辩场景中,导师常会追问‘为什么选择状态图而不是简单的顺序调用’。标准回答:状态图提供了条件分支和循环的能力——当未来需要根据用户意图导向不同处理链路时,只需在classify_intent后增加条件边即可,无需重构整体架构。这一设计的前瞻性正是LangGraph区别于传统链式调用的关键。

本文方案在客服场景中,记忆能力使重复问题率降低,用户无需反复提供上下文;在个人AI管家场景中,连贯的多轮对话更接近人类交流体验,从而提升用户留存。从技术角度,图驱动模块化架构将LLM调用拆解为可组合、可替换的节点,每个节点职责单一,团队可以并行开发不同节点,且单元测试可精确到单个节点级别。本文配套的建模可直接套用的AI智能体、完整代码包、分析,可加小助手:tecdat_cn领取。

作者系机器学习与AI算法领域分析师,拥有多年大语言模型应用开发与数据挖掘项目经验。

封面