工业级大模型学习之路029:解决双智能体调用数据库报错问题

问题分析

Cannot operate on a closed database 错误发生在 checkpoint.py 第50-52行:

python 复制代码
context_manager = SqliteSaver.from_conn_string(db_path)
checkpointer_instance = context_manager.__enter__()
return checkpointer_instance

SqliteSaver.from_conn_string() 返回的是一个 上下文管理器 ,在 enter() 获取实例后,当上下文退出时数据库连接会被关闭。但代码将实例全局缓存( @lru_cache ),后续使用时连接已关闭。

修复方案

将上下文管理器的生命周期与应用程序生命周期绑定,而不是在函数内部立即退出上下文。

原理 :通过全局变量保持对上下文管理器的引用,防止其被垃圾回收时关闭数据库连接。

python 复制代码
# 全局上下文管理器引用,防止数据库连接被关闭
_sqlite_context_manager = None

def _get_sqlite_checkpointer() -> SqliteSaver:
    """开发环境:SQLite Checkpointer(配置化路径)"""
    global _sqlite_context_manager
    
    db_path = getattr(settings, "sqlite_checkpoint_path", "./data/agent_checkpoints.db")
    logger.info(f"✅ 初始化SQLite Checkpoint,数据库路径: {db_path}")
    
    # 创建目录(如果不存在)
    import os
    os.makedirs(os.path.dirname(db_path) if os.path.dirname(db_path) else ".", exist_ok=True)
    
    # 保存上下文管理器引用,防止连接被关闭
    _sqlite_context_manager = SqliteSaver.from_conn_string(db_path)
    checkpointer_instance = _sqlite_context_manager.__enter__()
    return checkpointer_instance
python 复制代码
2026-05-28 18:41:48 - root - INFO - rag_service.py:221 - 用户[admin]请求生成报告:生成一份中国建筑的研究报告
2026-05-28 18:41:48 - root - INFO - multi_agent.py:79 - 🔍 研究员开始工作,迭代次数 :0/10
2026-05-28 18:42:03 - root - INFO - multi_agent.py:175 - 🔧 研究员需要调用工具:['enterprise_knowledge_base']
2026-05-28 18:42:03 - root - INFO - document_processor.py:42 - ✅ 文档处理器初始化完成 | 分块大小:1000 | 重叠大小:100 | 分块策略:recursive
2026-05-28 18:42:03 - root - INFO - rag_retriever.py:26 - ✅ RAG检索器初始化完成    
2026-05-28 18:42:03 - root - INFO - rag_retriever.py:124 - 开始检索:中国建筑行业发 展现状及趋势
2026-05-28 18:42:07 - root - INFO - rag_retriever.py:130 - 查询重写:中国建筑行业发 展现状及趋势 → 中国建筑行业当前发展现状与未来趋势分析
2026-05-28 18:42:25 - root - INFO - rag_retriever.py:176 - 检索完成:原始=40 → 去重=2 → 过滤=2 → 最终=0
2026-05-28 18:42:25 - root - INFO - multi_agent.py:79 - 🔍 研究员开始工作,迭代次数 :1/10
2026-05-28 18:42:37 - root - INFO - multi_agent.py:175 - 🔧 研究员需要调用工具:['enterprise_knowledge_base']
2026-05-28 18:42:37 - root - INFO - document_processor.py:42 - ✅ 文档处理器初始化完成 | 分块大小:1000 | 重叠大小:100 | 分块策略:recursive
2026-05-28 18:42:37 - root - INFO - rag_retriever.py:26 - ✅ RAG检索器初始化完成
2026-05-28 18:42:37 - root - INFO - rag_retriever.py:124 - 开始检索:中国建筑历史发
展
2026-05-28 18:42:41 - root - INFO - rag_retriever.py:130 - 查询重写:中国建筑历史发
展 → 中国建筑的历史发展脉络与演变特征
2026-05-28 18:42:56 - root - INFO - rag_retriever.py:176 - 检索完成:原始=40 → 去重=3 → 过滤=3 → 最终=0
2026-05-28 18:42:56 - root - INFO - multi_agent.py:79 - 🔍 研究员开始工作,迭代次数
:2/10
2026-05-28 18:43:02 - root - INFO - multi_agent.py:175 - 🔧 研究员需要调用工具:['enterprise_knowledge_base']
2026-05-28 18:43:02 - root - INFO - document_processor.py:42 - ✅ 文档处理器初始化完成 | 分块大小:1000 | 重叠大小:100 | 分块策略:recursive
2026-05-28 18:43:02 - root - INFO - rag_retriever.py:26 - ✅ RAG检索器初始化完成    
2026-05-28 18:43:02 - root - INFO - rag_retriever.py:124 - 开始检索:中国建筑企业发 展
2026-05-28 18:43:06 - root - INFO - rag_retriever.py:130 - 查询重写:中国建筑企业发
展 → 中国建筑行业企业近年发展现状与趋势分析
2026-05-28 18:43:18 - root - INFO - rag_retriever.py:176 - 检索完成:原始=40 → 去重=2 → 过滤=2 → 最终=0
2026-05-28 18:43:18 - root - INFO - multi_agent.py:79 - 🔍 研究员开始工作,迭代次数
:3/10
2026-05-28 18:43:22 - root - INFO - multi_agent.py:175 - 🔧 研究员需要调用工具:['enterprise_knowledge_base']
2026-05-28 18:43:22 - root - INFO - document_processor.py:42 - ✅ 文档处理器初始化完成 | 分块大小:1000 | 重叠大小:100 | 分块策略:recursive
2026-05-28 18:43:22 - root - INFO - rag_retriever.py:26 - ✅ RAG检索器初始化完成    
2026-05-28 18:43:22 - root - INFO - rag_retriever.py:124 - 开始检索:中国建筑行业政 策
2026-05-28 18:43:29 - root - INFO - rag_retriever.py:130 - 查询重写:中国建筑行业政
策 → 2020-2025中国建筑行业最新政策文件、产业规划及支持措施
2026-05-28 18:43:46 - root - INFO - rag_retriever.py:176 - 检索完成:原始=40 → 去重=3 → 过滤=3 → 最终=0
2026-05-28 18:43:46 - root - INFO - multi_agent.py:79 - 🔍 研究员开始工作,迭代次数
:4/10
2026-05-28 18:43:51 - root - INFO - multi_agent.py:79 - 🔍 研究员开始工作,迭代次数
:5/10
2026-05-28 18:43:53 - root - INFO - multi_agent.py:79 - 🔍 研究员开始工作,迭代次数
:6/10
2026-05-28 18:43:56 - root - INFO - multi_agent.py:79 - 🔍 研究员开始工作,迭代次数
:7/10
2026-05-28 18:43:58 - root - INFO - multi_agent.py:79 - 🔍 研究员开始工作,迭代次数
:8/10
2026-05-28 18:44:01 - root - INFO - multi_agent.py:79 - 🔍 研究员开始工作,迭代次数
:9/10
2026-05-28 18:44:03 - root - INFO - multi_agent.py:79 - 🔍 研究员开始工作,迭代次数
:10/10
2026-05-28 18:44:07 - root - WARNING - multi_agent.py:89 - ⚠️  超过最大迭代次数,强
制进入写作阶段
2026-05-28 18:44:07 - langgraph.checkpoint.serde.jsonplus - WARNING - jsonplus.py:79 - Deserializing unregistered type core.multi_agent.TaskPhase from checkpoint. This will be blocked in a future version. Set LANGGRAPH_STRICT_MSGPACK=true to block now, or add to allowed_msgpack_modules to allow explicitly: [('core.multi_agent', 'TaskPhase')]
2026-05-28 18:44:07 - root - INFO - rag_service.py:237 - 自动批准研究结果,继续生成
报告
2026-05-28 18:44:07 - root - INFO - multi_agent.py:151 - ✍️  写作家开始工作
2026-05-28 18:44:23 - root - INFO - multi_agent.py:159 - ✅ 报告生成完成
INFO:     127.0.0.1:61221 - "POST /api/agent/report/generate HTTP/1.1" 200 OK
相关推荐
海宇AI12 分钟前
微服务架构实战:基于海宇对外投资历史查询服务构建自动化合规审计网关
人工智能·微服务·架构·自动化
IpdataCloud18 分钟前
高可用的IP数据接口平台有哪些?从可用性、P99延迟到离线部署的评估框架(含代码)
数据库·tcp/ip·ip
微财经观圈23 分钟前
AI 3D生成工具重拓扑后怎样检查UV、法线和材质是否正常?
人工智能·3d·重拓扑
网易云信26 分钟前
首个 AI 玩具团标发布,我们把能力写进了行业标准
人工智能
码农学院28 分钟前
企业官网改版GEO实战:把 Blazor SPA 改造成 AI 爬虫可读的预渲染方案
人工智能·爬虫·geo
我不会起名字32229 分钟前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
呆萌很33 分钟前
MySQL 数据库和表的管理操作(命令行)
数据库·mysql
民乐团扒谱机42 分钟前
【一文吃透】图像灰度非线性拉伸:对数、Gamma、S型曲线与直方图均衡化公式详解与避坑
人工智能·计算机视觉
ThornArmor1 小时前
重铸1996|肉体渲染:关节的裂缝:分段模型积木拼装与未成熟的 RSP 矩阵骨骼动画形变
c语言·汇编·c++·python·硬件架构·游戏机
毕业设计7031 小时前
(免费领源码)基于Python的博物馆研学活动管理系统的设计与实现22724- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
python·mysql·随机森林·pycharm·django·flask·推荐算法