LangGraph 多用户并发:Thread 会话隔离 + Redis 持久化,彻底解决 Agent 上下文串话泄露
平时遇到线上AI Agent一旦上线多用户并发会出现致命级 Bug用户 A 询问订单数据用户 B 对话里突然出现 A 的隐私订单用户聊完 A 的业务切换会话后历史记忆错乱批量并发请求时不同用户 LLM 上下文互相穿插回答完全答非所问。根源只有一个多用户共享同一个 Agent 状态空间发生状态泄露。很多开发者尝试手动拆分历史消息、前端缓存对话记录不仅开发成本高还无法实现对话回滚、多轮记忆持久化、会话断点续聊。底层原理LangGraph Thread 如何实现会话完全隔离Thread 核心定义Thread 是 LangGraph 内置逻辑隔离单元核心依靠唯一thread_id作为会话标识具备三大隔离特性独立状态空间不同 thread_id 的 messages、自定义状态完全互不共享独立 Checkpoint 快照每个会话拥有专属历史记录撤回、分支不会影响其他用户独立配置上下文图执行参数、记忆边界完全隔离。核心运行逻辑所有用户共用同一个 Graph 实例、同一套 Redis 存储仅通过 config 内的 thread_id 做数据分区# 用户1会话配置 config_user1 {configurable: {thread_id: user_1001_session_01}} # 用户2会话配置 config_user2 {configurable: {thread_id: user_1002_session_01}} # 底层Redis自动按thread_id分区存储状态读写互不干扰 await graph.ainvoke(inputs, configconfig_user1) await graph.ainvoke(inputs, configconfig_user2)隔离性验证逻辑简单测试即可证明隔离效果thread1 存入记忆我叫张三工程师thread2 存入记忆我叫李四设计师询问 thread1 “我叫什么”只会返回张三完全看不到李四信息询问 thread2 仅返回李四无任何跨会话数据泄露。业务层Thread 隔离粒度怎么选4 种场景落地方案thread_id 拼接规则直接决定业务灵活性4 种主流隔离粒度覆盖全部 Agent 场景用户级隔离 thread_id fuser:{user_id}适用通用单会话聊天机器人优点实现简单缺点同一用户无法新建独立对话。会话级隔离最推荐 thread_id fuser:{user_id}:session:{session_id}适用客服系统、多会话对话优点一个用户可创建多个独立聊天窗口会话互不干扰。文档级隔离 thread_id fdoc:{doc_id}适用本地知识库 RAG 文档问答每个文档对应独立对话跨文档不会混入上下文。任务 / 工单级隔离 thread_id ftask:{task_id}适用工作流智能体、审批流程 Agent每个任务状态独立流程执行互不干扰。多维度组合隔离 thread_id forg:{org_id}:user:{uid}:doc:{did}适用企业多租户 SaaS 系统租户、用户、文档三层隔离满足权限合规要求生产进阶Thread 生命周期自动管理长期运行会产生大量过期会话堆积海量对话快照占用 Redis 存储需要做自动清理机制记录每个 thread_id 最后活跃时间定时扫描过期会话例如 48 小时无交互自动判定过期过期会话可先归档至 MySQL / 对象存储再清理 Redis 状态节省内存后台异步定时任务执行清理不阻塞正常用户请求。可观测Thread 会话监控方案搭配 LangSmith 链路追踪给每条 Trace 自动挂载 thread_id 标签线上问题排查效率翻倍根据 thread_id 筛选单一用户全部交互日志统计每个会话 token 消耗、消息条数、平均响应耗时快速定位异常会话超长对话、频繁超时、幻觉严重的用户会话。FastAPI 全异步服务兼容 Redis Thread 隔离依赖pip install fastapi uvicorn langgraph langgraph-checkpoint-redis redis langchain-openai pydantic httpxmain.py —模拟Agentimport asyncio from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.responses import StreamingResponse from pydantic import BaseModel from typing import List, Optional from datetime import datetime, timedelta from langgraph.graph import StateGraph, START, END, MessagesState from langchain_openai import ChatOpenAI from langgraph.checkpoint.redis.aio import AsyncRedisSaver from langgraph.checkpoint.base import BaseCheckpointSaver from langgraph.checkpoint.memory import InMemorySaver # 全局资源 checkpointer: Optional[BaseCheckpointSaver] None agent None # llm ChatOpenAI(modelgpt-4o-mini, streamingTrue) api_keysk-xxxxxxxxxxxxxxxxxxx base_urlhttps://api.deepseek.com/v1 llm ChatOpenAI( modeldeepseek-chat, temperature0.6, api_keyapi_key, base_urlbase_url ) # Thread生命周期管理器自动清理过期会话 class ThreadManager: def __init__(self, max_age_hours: int 48): self.max_age timedelta(hoursmax_age_hours) self.active_threads: dict[str, datetime] {} def touch(self, thread_id: str): self.active_threads[thread_id] datetime.now() def get_expired_threads(self) - list[str]: now datetime.now() return [ tid for tid, last_active in self.active_threads.items() if now - last_active self.max_age ] async def cleanup_expired(self, graph): expired_list self.get_expired_threads() for tid in expired_list: config {configurable: {thread_id: tid}} try: state await graph.aget_state(config) if state.values: print(f归档并清理过期会话: {tid}) await graph.adelete_state(config) except Exception as e: print(f清理会话{tid}失败: {str(e)}) for tid in expired_list: self.active_threads.pop(tid, None) thread_mgr ThreadManager(max_age_hours48) # LangGraph工作流定义 async def call_model(state: MessagesState): resp await llm.ainvoke(state[messages]) return {messages: [resp]} builder StateGraph(MessagesState) builder.add_node(agent, call_model) builder.add_edge(START, agent) builder.add_edge(agent, END) # 生命周期管理器 asynccontextmanager async def lifespan(app: FastAPI): global checkpointer, agent try: # 初始化Redis持久化存储器 checkpointer AsyncRedisSaver(redis_urlredis://localhost:6379/0) # 连通性测试 await checkpointer.aget_state({configurable: {thread_id: test_conn}}) print(Redis持久化连接成功开启Thread会话隔离) except Exception as e: print(fRedis连接失败自动降级内存会话存储: {str(e)}) # Redis不可用时切换内存存储保证对话记忆跨请求生效 checkpointer InMemorySaver() # 编译工作流注入状态存储器 agent builder.compile(checkpointercheckpointer) # 后台定时清理过期会话每小时执行一次 async def cleanup_task(): while True: await asyncio.sleep(3600) await thread_mgr.cleanup_expired(agent) asyncio.create_task(cleanup_task()) yield # 退出阶段无需手动关闭连接saver自动管理 print(服务关闭资源释放完成) # 初始化FastAPI应用 app FastAPI(title多会话隔离AI Agent服务, lifespanlifespan) # 请求入参模型 class AgentRequest(BaseModel): message: str user_id: str session_id: str default stream: bool False # 1. 一次性问答接口 app.post(/agent/invoke) async def invoke_agent(req: AgentRequest): thread_id fuser:{req.user_id}:session:{req.session_id} thread_mgr.touch(thread_id) config {configurable: {thread_id: thread_id}} res await agent.ainvoke( {messages: [{role: user, content: req.message}]}, config ) return {response: res[messages][-1].content, thread_id: thread_id} # 2. SSE流式打字机输出接口 app.post(/agent/stream) async def stream_agent(req: AgentRequest): thread_id fuser:{req.user_id}:session:{req.session_id} thread_mgr.touch(thread_id) config {configurable: {thread_id: thread_id}} async def event_generator(): async for event in agent.astream_events( {messages: [{role: user, content: req.message}]}, config, versionv2 ): if event[event] on_chat_model_stream: chunk event[data][chunk] if chunk.content: yield fdata: {chunk.content}\n\n yield data: [DONE]\n\n return StreamingResponse(event_generator(), media_typetext/event-stream) # 3. 获取用户单会话全部历史修复req未定义BUG app.get(/agent/history/{user_id}/{session_id}) async def get_session_history(user_id: str, session_id: str): # 修复直接使用路径参数session_id删除不存在的req变量 thread_id fuser:{user_id}:session:{session_id} config {configurable: {thread_id: thread_id}} state await agent.aget_state(config) msg_list state.values.get(messages, []) history [] # 只返回最新20条消息截断长文本至300字符 for m in msg_list[-20:]: role user if getattr(m, type, ) human else assistant history.append({role: role, content: m.content[:300]}) return { thread_id: thread_id, message_count: len(msg_list), history: history } # 服务启动入口修复uvicorn.run传参语法错误 if __name__ __main__: import uvicorn uvicorn.run(appmain:app, host0.0.0.0, port8000, reloadTrue)隔离性自测脚本 test_run.pyimport httpx import asyncio BASE_URL http://localhost:8000/agent/invoke async def test_thread_isolation(): # 两个完全独立会话 payload_a { message: 我叫张三专职做后端开发, user_id: u001, session_id: s01 } payload_b { message: 我叫李四产品设计师, user_id: u002, session_id: s01 } async with httpx.AsyncClient() as client: # 分别存入记忆 await client.post(BASE_URL, jsonpayload_a) await client.post(BASE_URL, jsonpayload_b) # 查询会话A res_a await client.post(BASE_URL, json{ message: 我叫什么名字, user_id: u001, session_id: s01 }) # 查询会话B res_b await client.post(BASE_URL, json{ message: 我叫什么名字, user_id: u002, session_id: s01 }) print(会话A回答, res_a.json()[response]) print(会话B回答, res_b.json()[response]) # 结果A只会输出张三B只会输出李四无交叉信息即隔离生效 if __name__ __main__: asyncio.run(test_thread_isolation())运行结果学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

相关新闻

百度开发者中心软文_企业AI知识库的价值

百度开发者中心软文_企业AI知识库的价值

当800人团队告别"翻聊天记录找文件":企业AI知识库的协作效率革命 开篇:一场让我下定决心的复盘会 去年年初的公司年度复盘会上,COO投屏了一张数据报表,全场安静了。 报表显示:过去一年,公司内部的…

2026/8/3 4:39:40 阅读更多 →
现代C++ :constexpr:一个常态的世界

现代C++ :constexpr:一个常态的世界

引言我们已经连续讲了几讲比较累人的编译期编程了。今天我们还是继续这个话题,但是,相信今天学完之后,你会感觉比之前几讲要轻松很多。C 语言里的很多改进,让我们做编译期编程也变得越来越简单了。初识 constexpr我们先来看一些例…

2026/8/3 4:39:50 阅读更多 →
EDMA寄存器配置实战:从架构理解到性能优化与错误处理

EDMA寄存器配置实战:从架构理解到性能优化与错误处理

1. 从手册到实战:为什么EDMA寄存器配置是嵌入式开发的硬骨头在嵌入式系统开发,尤其是基于TI C6000、C7000系列DSP或Sitara系列处理器的项目中,但凡涉及到高速数据搬移,比如图像处理中的帧数据搬运、音频处理中的Ping-Pong缓冲区切…

2026/8/2 5:43:14 阅读更多 →

最新新闻

【导弹】基于matlab 6自由度导弹制导、导航与控制模拟【含Matlab源码 15917期】

【导弹】基于matlab 6自由度导弹制导、导航与控制模拟【含Matlab源码 15917期】

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞&#x1f49…

2026/8/3 4:39:15 阅读更多 →
企业级异步子代理部署实战:5种高可用架构方案深度解析

企业级异步子代理部署实战:5种高可用架构方案深度解析

企业级异步子代理部署实战:5种高可用架构方案深度解析 【免费下载链接】pi-subagents Pi extension for async subagent delegation with truncation, artifacts, and session sharing 项目地址: https://gitcode.com/GitHub_Trending/pi/pi-subagents pi-su…

2026/8/3 4:39:15 阅读更多 →
你的下载管理革命:为什么AB Download Manager能让文件整理变得如此简单?

你的下载管理革命:为什么AB Download Manager能让文件整理变得如此简单?

你的下载管理革命:为什么AB Download Manager能让文件整理变得如此简单? 【免费下载链接】ab-download-manager A Download Manager that speeds up your downloads 项目地址: https://gitcode.com/GitHub_Trending/ab/ab-download-manager 你是否…

2026/8/3 4:39:15 阅读更多 →
SPT-AKI存档编辑器:终极塔科夫离线版存档管理工具

SPT-AKI存档编辑器:终极塔科夫离线版存档管理工具

SPT-AKI存档编辑器:终极塔科夫离线版存档管理工具 【免费下载链接】SPT-AKI-Profile-Editor Программа для редактирования профиля игрока на сервере SPT-AKI 项目地址: https://gitcode.com/gh_mirrors/sp/SP…

2026/8/3 4:39:15 阅读更多 →
Python学习新思维:从零到项目实战,构建问题解决能力

Python学习新思维:从零到项目实战,构建问题解决能力

你是不是也刷到过那种标题——“七天从小白到大神”“学完即可就业”“最全零基础教程”?点进去一看,几十上百个小时的视频,从安装Python讲到人工智能,感觉什么都讲了,又感觉什么都没记住。收藏夹里塞满了,…

2026/8/3 4:39:14 阅读更多 →
【导弹】6自由度导弹制导、导航与控制模拟【含Matlab源码 15917期】

【导弹】6自由度导弹制导、导航与控制模拟【含Matlab源码 15917期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab领域博客之家💞&…

2026/8/3 4:38:14 阅读更多 →

日新闻

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:47 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/2 2:47:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →