
问题分析
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
