工业级大模型学习之路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
相关推荐
IT19952 小时前
Fail2Ban 防护 MySQL 实战|登录失败 3 次,IP 封禁 24 小时
数据库·mysql
夕除2 小时前
redis--IO 多路复用(select + poll)
数据库·sql
Data-Miner2 小时前
面对 AI 大模型智能涌现,如何从技术层面保护好隐私与数据安全?
大数据·人工智能
行思理2 小时前
go语言学习难度及适合学习的人群
开发语言·学习·golang
hpoenixf3 小时前
当 AI 开始谈“买什么”,研究助手离投顾和交易还有多远?
人工智能
大模型真好玩3 小时前
如何让视频模型对你言听计从?结构化提示词助你生成电影级画面
人工智能·agent·deepseek
zhang133830890753 小时前
传统机械三杯式风速传感器易磨损冻堵?CG-88金属超声波风速风向传感器给出免运维方案
运维·服务器·网络·人工智能·自动化
特立独行的猫a3 小时前
会说确认叫车才下单-启元机器人官方滴滴打车技能源码详解
人工智能·机器人·技能·启元机器人
老金带你玩AI3 小时前
GPT-6.1 Terra上线:更便宜了,干活到底怎么样?
人工智能
会议咨询4 小时前
2027年电力电子、人工智能与大数据国际会议(PEABD 2027)
大数据·人工智能·电力电子