工业级大模型学习之路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
相关推荐
ting94520003 小时前
Humalike X Hermes 深度技术剖析:单指令注入群聊社交智能的底层架构、算法与跨 IM 平台实现
人工智能·算法·架构
Data_Journal3 小时前
用于网页抓取的 Node-unblocker
大数据·开发语言·数据库·python·scrapy
涤生大数据3 小时前
一次“没有运行日志”的DolphinScheduler任务失败排查
大数据·数据库·人工智能·状态模式
东风破_3 小时前
Vibe Coding 上头之后,我开始用 SDD 给 AI 编程加一张“施工图”
人工智能·程序员
专注API从业者3 小时前
告别人工盯品!借助 Open Claw 搭建电商商品自动化监控与数据分析系统(完整可运行源码)
大数据·运维·数据库·数据分析·自动化
豆角焖肉3 小时前
SSM 聚合项目搭建:多 Maven 模块项目
开发语言·python·pycharm
weixin_403810134 小时前
AI智能体写安卓自动化脚本教程:Cursor/Trae+CLI 实战,自然语言生成代码
android·人工智能·自动化·跨境电商·安卓自动化脚本·多账户运营
青 春 记 忆4 小时前
零基础入门python20:Flask配置、扩展和蓝图拆分
python·flask·后端开发
深圳雨林凯AI4 小时前
雨林凯AI四方连图介质适配原理:像素密度、纱线纹理与颜色管理怎么协调
人工智能
viskaz4 小时前
数据库迁移流程学习
数据库