Langchain-Chatchat 版本升级后如何用 chatchat kb --import-db 从备份恢复 info.db 数据
【免费下载链接】Langchain-ChatchatLangchain-Chatchat(原Langchain-ChatGLM)基于 Langchain 与 ChatGLM, Qwen 与 Llama 等语言模型的 RAG 与 Agent 应用 | Langchain-Chatchat (formerly langchain-ChatGLM), local knowledge based LLM (like ChatGLM, Qwen and Llama) RAG and Agent app with langchain项目地址: https://gitcode.com/GitHub_Trending/la/Langchain-Chatchat
升级 Langchain-Chatchat 到新版本后,知识库元数据库info.db的表结构可能发生变化,旧库不能直接沿用。但如果你的知识库和向量库内容本身没有改动、不需要重新向量化,项目提供了chatchat kb --import-db命令:从旧版本备份的 SQLite 数据库(即备份下来的info.db)把数据导入当前版本的info.db。本文只覆盖这一场景——版本升级导致info.db结构变化、但无需重建向量库时的数据恢复操作。
--import-db 的适用条件与边界
--import-db对应的实现是 import_from_db,其文档说明如下:
在知识库与向量库无变化的情况下,从备份数据库中导入数据到 info.db。适用于版本升级时,info.db 结构变化,但无需重新向量化的情况。请确保两边数据库表名一致,需要导入的字段名一致。当前仅支持 sqlite。
据此,使用它需要同时满足:
- 备份文件是一个SQLite数据库(也就是旧版本的
info.db文件拷贝),其他数据库类型不受支持; - 备份库与当前版本的数据库模型表名一致、待导入的字段名一致;
- 知识库与向量库无变化,向量数据不需要重建。
info.db的默认位置由 settings.py 定义,位于数据根目录(CHATCHAT_ROOT)下的data/knowledge_base/info.db,也可通过DB_ROOT_PATH/SQLALCHEMY_DATABASE_URI配置项指向其他路径(README.md 给出了自定义路径的示例配置)。备份时拷贝的就是这个文件。
注意一条边界:如果你的DEFAULT_VS_TYPE(向量库类型)或DEFAULT_EMBEDDING_MODEL(嵌入模型)发生了变化,或向量库尚未填充,属于重建向量库的场景,应使用chatchat kb -r(--recreate-vs),而不是--import-db。
准备:停止服务并备份旧版 info.db
导入前有两个来自文档的明确要求:
- 执行导入时应确保没有其他操作正在访问目标数据库,以避免数据冲突(见 migrate.md 中
import_from_db的注意事项),所以先停掉正在运行的 chatchat 服务; - 升级前先备份重要数据。README.md 中关于 0.3.x 的提示写明:“0.3.x 结构改变很大……记得提前备份重要数据!”,Docker 迁移文档 docs/install/README_docker.md 也要求在迁移前先备份好数据。
具体做法:把旧版本的info.db文件拷贝到一个安全位置,这个拷贝文件就是后面--import-db要传入的备份路径。
执行导入命令
chatchat kb子命令由 cli.py 注册(main.add_command(kb_main, "kb")),各选项定义在 init_database.py。基本命令:
chatchat kb --import-db <备份文件路径><备份文件路径>替换为上面备份下来的旧版info.db文件路径,例如:
chatchat kb --import-db ./data/knowledge_base/info.db.bak如果担心新版本中部分表还不存在,可以组合--create-tables选项。它的 help 说明是 “create empty tables if not existed”:先看下表是否存在,不存在则创建,已存在的表不会被修改:
chatchat kb --create-tables --import-db ./data/knowledge_base/info.db.bakchatchat kb的其他选项(-r、-u、-i、--prune-db等)与本次恢复任务无关,不要与--import-db混用。
验证导入结果
文档没有给出一段固定的成功日志,可以依据import_from_db的实际输出行为来判断:
- 对每个在备份库中存在、且对应当前数据库模型的表,终端会打印
processing table: {表名},随后逐行打印导入的数据(代码中通过pprint输出每一行); - 成功完成时函数返回
True;如果无法读取备份数据库或过程中遇到其他错误,会打印无法读取备份数据库:{sqlite_path}。错误信息:{e}并返回False(以上输出行为见 migrate.md 中“输出示例”与源码 migrate.py); chatchat kb的父进程在子任务结束后打印总计用时:...(见 init_database.py)。
如果终端出现无法读取备份数据库错误行,说明本次导入失败,需要检查备份文件路径是否正确、文件是否为可读的 SQLite 文件。执行过程中按 Ctrl+C 会终止子进程(代码中捕获KeyboardInterrupt后调用p.terminate()),此时不要当作完成,应重新执行。
确认数据导入无误后,按项目文档的启动方式执行chatchat start -a重新启动服务即可。
限制与注意事项
- 仅支持 SQLite:备份库必须是 SQLite 文件,不支持其他数据库(
import_from_db文档说明“当前仅支持 sqlite”)。 - 字段按当前模型过滤:导入时每一行会按当前数据库模型定义的列名过滤,备份中不在当前模型列内的字段不会被写入(见 migrate.py 中
data = {k: row[k] for k in row.keys() if k in model.columns}的过滤逻辑)。所以备份库与当前模型表名、字段名不一致时,缺失或不匹配的字段不会导入。 - 不存在的表会被跳过:备份库中没有的表直接跳过,不报错。
- 不涉及向量数据:该命令只恢复
info.db中的元数据,不清除、不重建任何向量库。向量库类型或嵌入模型变化时请改用chatchat kb -r。 --create-tables不修改已有表:它只创建尚不存在的表,不会更新或修改现有表结构(见 migrate.md 中create_tables的注意事项)。
相关文档与源码路径:
- markdown_docs/server/knowledge_base/migrate.md:
import_from_db、create_tables、folder2db等迁移函数的完整说明 - libs/chatchat-server/chatchat/server/knowledge_base/migrate.py:导入实现
- libs/chatchat-server/chatchat/init_database.py:
chatchat kb的 CLI 选项定义 - libs/chatchat-server/chatchat/settings.py:
info.db默认路径配置
【免费下载链接】Langchain-ChatchatLangchain-Chatchat(原Langchain-ChatGLM)基于 Langchain 与 ChatGLM, Qwen 与 Llama 等语言模型的 RAG 与 Agent 应用 | Langchain-Chatchat (formerly langchain-ChatGLM), local knowledge based LLM (like ChatGLM, Qwen and Llama) RAG and Agent app with langchain项目地址: https://gitcode.com/GitHub_Trending/la/Langchain-Chatchat
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考