LangGraph+MCP+ReactAgent黄金搭档!智能代理系统全流程实战,从入门到精通一篇通!
本文将深入剖析如何通过 LangGraph、MCP 协议与 ReactAgent 三者融合,构建一个支持多轮对话、工具调用、状态持久化与任务中断的生产级智能代理系统。
📌 一句话速览
本文将深入剖析如何通过 LangGraph、MCP 协议与 ReactAgent 三者融合,构建一个支持多轮对话、工具调用、状态持久化与任务中断的生产级智能代理系统。
运行效果
智能问答
📌 智能代理系统的演进需求
随着大模型能力的不断增强,单纯的“问答机器人”已无法满足企业级应用场景。用户期望的是:
- ✅ 多轮对话记忆 —— 能记住上下文,支持连续追问
- ✅ 工具调用能力 —— 可连接数据库、API、业务系统
- ✅ 状态可持久化 —— 对话中断后能恢复现场
- ✅ 任务可中断 —— 用户可随时取消长耗时操作
- ✅ 流式输出体验 —— 实时响应,提升交互感
传统单次 Prompt 调用模式已力不从心。我们需要一个状态驱动、工具感知、可中断、可恢复的智能代理架构 —— 这正是 LangGraph + MCP + ReactAgent 技术组合的价值所在。
技术组合全景图
技术组件 | 角色定位 | 解决的问题 |
---|---|---|
LangGraph | 状态图引擎 | 对话状态管理、流程控制、持久化 |
MCP协议 | 工具调用标准协议 | 统一接入外部工具,解耦工具实现 |
ReactAgent | 推理-行动循环框架 | 实现“思考→调用→观察→再思考”闭环 |
LangChain | LLM与工具抽象层 | 统一模型调用、消息封装、工具集成 |
💡 本系统通过
create_react_agent
创建基于状态图的代理,使用MultiServerMCPClient
动态加载工具,通过InMemorySaver
实现对话状态持久化,最终形成一个高内聚、低耦合、易扩展的智能代理系统。
核心代码结构详解
1. 初始化与环境配置
```python
def __init__(self):
# 校验环境变量,确保关键配置不缺失
required_env_vars = [
"MODEL_NAME", "MODEL_TEMPERATURE", "MODEL_BASE_URL",
"MODEL_API_KEY", "MCP_HUB_COMMON_QA_GROUP_URL",
]
for var in required_env_vars:
if not os.getenv(var):
raise ValueError(f"Missing required environment variable: {var}")
# 初始化LLM客户端,支持流式、重试、超时等生产级配置
self.llm = ChatOpenAI(...)
# 初始化MCP客户端,支持多工具服务器动态接入
self.client = MultiServerMCPClient({
"mcp-hub": {
"url": os.getenv("MCP_HUB_COMMON_QA_GROUP_URL"),
"transport": "streamable_http",
},
})
# 使用内存检查点保存对话状态(生产环境建议替换为Redis)
self.checkpointer = InMemorySaver()
# 运行中任务字典,用于支持任务取消
self.running_tasks = {}
🛠️ 设计要点:环境变量校验前置,避免运行时崩溃;工具配置支持热插拔;状态存储可替换,便于扩展。
2. 流式响应封装
@staticmethod
def _create_response(content: str, message_type: str = "continue", data_type: str = DataTypeEnum.ANSWER.value[0]) -> str:
"""
封装SSE格式响应,支持前端区分消息类型(继续/结束/错误/信息)
"""
res = {
"data": {"messageType": message_type, "content": content},
"dataType": data_type,
}
return"data:" + json.dumps(res, ensure_ascii=False) + "\n\n"
🌊 作用:实现真正的流式输出,前端可实时渲染模型思考过程、工具调用、最终答案,大幅提升用户体验。
3. 上下文记忆管理
@staticmethod
def short_trim_messages(state):
"""
模型调用前自动修剪历史消息,防止上下文溢出
保留系统消息 + 最新的人类消息序列,确保对话连贯性
"""
trimmed_messages = trim_messages(
messages=state["messages"],
max_tokens=20000,
token_counter=lambda msgs: sum(len(m.content or "") for m in msgs),
strategy="last", # 保留最新消息
start_on="human", # 从用户消息开始保留
include_system=True, # 必须保留系统提示
)
return {"llm_input_messages": trimmed_messages}
🧠 智能裁剪:避免因历史消息过长导致模型性能下降或API报错,同时保持对话逻辑连贯。
4. 主运行逻辑:run_agent
async def run_agent(self, query: str, response, session_id: Optional[str] = None, uuid_str: str = None, user_token=None):
"""
核心执行方法:启动智能代理,处理用户查询,流式返回结果
支持:身份验证、任务取消、工具调用监听、对话状态持久化、记录存储
"""
# 解码用户Token,获取用户ID作为任务标识
user_dict = await decode_jwt_token(user_token)
task_id = user_dict["id"]
task_context = {"cancelled": False}
self.running_tasks[task_id] = task_context
try:
t02_answer_data = [] # 收集完整回答用于后续存储
# 动态获取可用工具列表
tools = await self.client.get_tools()
# 使用session_id作为thread_id,实现多轮对话状态隔离
thread_id = session_id if session_id else"default_thread"
config = {"configurable": {"thread_id": thread_id}}
# 定义系统提示词,约束模型行为与输出格式
system_message = SystemMessage(content="""...""") # 内容略,见完整代码
# 创建React代理,绑定模型、工具、状态管理器和预处理钩子
agent = create_react_agent(
model=self.llm,
tools=tools,
prompt=system_message,
checkpointer=self.checkpointer,
pre_model_hook=self.short_trim_messages, # 注册消息修剪钩子
)
# 流式执行代理,监听每一步输出
async for message_chunk, metadata in agent.astream(
input={"messages": [HumanMessage(content=query)]},
config=config,
stream_mode="messages",
):
# 检查任务是否被取消
if self.running_tasks[task_id]["cancelled"]:
await response.write(self._create_response("\n> 这条消息已停止", "info"))
await response.write(self._create_response("", "end", DataTypeEnum.STREAM_END.value[0]))
break
# 处理工具调用节点
if metadata["langgraph_node"] == "tools":
tool_name = message_chunk.name or "未知工具"
tool_use = "> 调用工具:" + tool_name + "\n\n"
await response.write(self._create_response(tool_use))
t02_answer_data.append(tool_use)
continue
# 输出模型生成内容
if message_chunk.content:
content = message_chunk.content
t02_answer_data.append(content)
await response.write(self._create_response(content))
if hasattr(response, "flush"):
await response.flush()
await asyncio.sleep(0) # 让出事件循环
# 仅在未取消时保存对话记录
if not self.running_tasks[task_id]["cancelled"]:
await add_user_record(
uuid_str, session_id, query, t02_answer_data, {},
DiFyAppEnum.COMMON_QA.value[0], user_token
)
except asyncio.CancelledError:
... # 处理取消异常
except Exception as e:
... # 处理运行时异常
finally:
# 清理任务记录
if task_id in self.running_tasks:
del self.running_tasks[task_id]
⚙️ 核心价值: 状态隔离:通过 thread_id 区分不同用户/会话 工具透明:实时输出工具调用过程,增强可信度 可中断:支持用户主动取消长时间运行任务 可审计:完整记录对话过程,便于复盘与优化
5. 任务取消与状态管理
async def cancel_task(self, task_id: str) -> bool:
"""取消指定任务,通过设置标志位实现优雅中断"""
if task_id in self.running_tasks:
self.running_tasks[task_id]["cancelled"] = True
return True
return False
def get_running_tasks(self):
"""获取当前所有运行中任务ID,用于监控与管理"""
return list(self.running_tasks.keys())
🚫 用户体验:当模型“思考太久”,用户可点击“停止”按钮,系统立即响应,避免资源浪费与体验卡顿。
6. MCP使用姿势
- streamable_http方式调用
self.client = MultiServerMCPClient({
"mcp-hub": {
"url": "http://xxxx.com",
"transport": "streamable_http",
}
}
- 本地子进程方式调用三方开源工具
self.client = MultiServerMCPClient({
"undoom-douyin-data-analysis": {
"command": "uvx",
"transport": "stdio",
"args": [
"--index-url",
"https://mirrors.aliyun.com/pypi/simple/",
"--from",
"undoom-douyin-data-analysis",
"undoom-douyin-mcp",
],
},
}
- 本地子进程方式调用本地开发的工具
current_dir = os.path.dirname(os.path.abspath(__file__))
mcp_tool_path = os.path.join(current_dir, "mcp", "query_db_tool.py")
self.client = MultiServerMCPClient({
"query_qa_record": {
"command": "python",
"args": [mcp_tool_path],
"transport": "stdio",
}
}
总结
LangGraph + MCP + ReactAgent 的组合,不是简单的技术堆砌,而是面向复杂、真实、生产环境的智能代理架构解决方案。
它解决了传统 Agent 的三大痛点:
❌ 状态丢失 → ✅ LangGraph 状态图持久化 ❌ 工具混乱 → ✅ MCP 协议标准化接入 ❌ 黑盒执行 → ✅ ReactAgent 透明化推理过程
📚 完整代码
参考我的开源项目: git@github.com:apconw/sanic-web.git
🌈 项目亮点
- ✅ 集成 MCP 多智能体架构
- ✅ 支持 Dify / LangChain / LlamaIndex / Ollama / vLLM / Neo4j
- ✅ 前端采用 Vue3 + TypeScript + Vite5,现代化交互体验
- ✅ 内置 ECharts / AntV 图表问答 + CSV 表格问答
- ✅ 支持对接主流 RAG 系统 与 Text2SQL 引擎
- ✅ 轻量级 Sanic 后端,适合快速部署与二次开发
运行效果:
数据问答
如何学习大模型 AI ?
我国在AI大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着Al技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国Al产业的创新步伐。加强人才培养,优化教育体系,国际合作并进,是破解困局、推动AI发展的关键。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
2025最新大模型学习路线
明确的学习路线至关重要。它能指引新人起点、规划学习顺序、明确核心知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。
对于从来没有接触过AI大模型的同学,我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线。
针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。
大模型经典PDF书籍
新手必备的大模型学习PDF书单来了!全是硬核知识,帮你少走弯路!
配套大模型项目实战
所有视频教程所涉及的实战项目和项目源码等
博主介绍+AI项目案例集锦
MoPaaS专注于Al技术能力建设与应用场景开发,与智学优课联合孵化,培养适合未来发展需求的技术性人才和应用型领袖。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
为什么要学习大模型?
2025人工智能大模型的技术岗位与能力培养随着人工智能技术的迅速发展和应用 , 大模型作为其中的重要组成部分 , 正逐渐成为推动人工智能发展的重要引擎 。大模型以其强大的数据处理和模式识别能力, 广泛应用于自然语言处理 、计算机视觉 、 智能推荐等领域 ,为各行各业带来了革命性的改变和机遇 。
适合人群
- 在校学生:包括专科、本科、硕士和博士研究生。学生应具备扎实的编程基础和一定的数学基础,有志于深入AGI大模型行业,希望开展相关的研究和开发工作。
- IT行业从业人员:包括在职或失业者,涵盖开发、测试、运维、产品经理等职务。拥有一定的IT从业经验,至少1年以上的编程工作经验,对大模型技术感兴趣或有业务需求,希望通过课程提升自身在IT领域的竞争力。
- IT管理及技术研究领域人员:包括技术经理、技术负责人、CTO、架构师、研究员等角色。这些人员需要跟随技术发展趋势,主导技术创新,推动大模型技术在企业业务中的应用与改造。
- 传统AI从业人员:包括算法工程师、机器视觉工程师、深度学习工程师等。这些AI技术人才原先从事机器视觉、自然语言处理、推荐系统等领域工作,现需要快速补充大模型技术能力,获得大模型训练微调的实操技能,以适应新的技术发展趋势。
课程精彩瞬间
大模型核心原理与Prompt:掌握大语言模型的核心知识,了解行业应用与趋势;熟练Python编程,提升提示工程技能,为Al应用开发打下坚实基础。
RAG应用开发工程:掌握RAG应用开发全流程,理解前沿技术,提升商业化分析与优化能力,通过实战项目加深理解与应用。
Agent应用架构进阶实践:掌握大模型Agent技术的核心原理与实践应用,能够独立完成Agent系统的设计与开发,提升多智能体协同与复杂任务处理的能力,为AI产品的创新与优化提供有力支持。
模型微调与私有化大模型:掌握大模型微调与私有化部署技能,提升模型优化与部署能力,为大模型项目落地打下坚实基础。
顶尖师资,深耕AI大模型前沿技术
实战专家亲授,让你少走弯路
一对一学习规划,职业生涯指导
- 真实商业项目实训
- 大厂绿色直通车
人才库优秀学员参与真实商业项目实训
以商业交付标准作为学习标准,具备真实大模型项目实践操作经验可写入简历,支持项目背调
大厂绿色直通车,冲击行业高薪岗位
文中涉及到的完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
更多推荐
所有评论(0)