工业级大模型学习之路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
相关推荐
志栋智能1 小时前
超越监控:超自动化巡检提供的主动价值
运维·网络·人工智能·自动化
SunnyDays10111 小时前
Python操作Excel批注:从基础添加到高级自定义的完整指南
开发语言·python·excel
Elastic 中国社区官方博客1 小时前
Elastic 线下 Meetup 将于 2026 年 7 月 26 号下午在深圳举行
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
独隅1 小时前
PyTorch自动微分模块:从原理到实战一
人工智能·pytorch·python
code_pgf2 小时前
ViT 与 MAE 在图像特征提取方面的优势详解
人工智能·stable diffusion
feifeigo1232 小时前
基于隐马尔可夫模型(HMM)的孤立词语音识别系统
人工智能·语音识别·xcode
YL200404262 小时前
【Redis实战篇】秒杀实现方案(以优惠券秒杀为例)
数据库·redis
DIY源码阁2 小时前
JavaSwing宿舍管理系统 - MySQL版
java·数据库·mysql·eclipse
weixin_468466852 小时前
千问大模型在阿里生态中的实战应用指南
大数据·人工智能·深度学习·ai·大模型·智能交互·自动应答