# 重建 hybrid 知识库(dense + BM25) 面向当前 `knowledge_base/` 目录文档,**清空并重建**配置中的 Milvus collection(默认 **`biz`**)。 ## 前提 1. 应用已启动(默认 `http://localhost:9900`) 2. `MILVUS_TOKEN` 等连接配置可用 3. `application.yml` 已配置: ```yaml milvus: collection: biz retrieval: search: mode: hybrid knowledge: base-path: knowledge_base/ ``` ## 一键脚本(Python) 在项目根目录执行: ```bash python scripts/rebuild_hybrid_knowledge.py --confirm REBUILD ``` 指定服务地址: ```bash python scripts/rebuild_hybrid_knowledge.py --base-url http://127.0.0.1:9900 --confirm REBUILD ``` 跳过前后 stats: ```bash python scripts/rebuild_hybrid_knowledge.py --confirm REBUILD --skip-stats ``` 依赖:Python 3.9+ 标准库即可(无需 pip 包)。 ## 脚本会做什么 | 步骤 | 动作 | |---|---| | 1 | 检查 `/milvus/health` | | 2 | 打印重建前 `/api/knowledge/stats` | | 3 | `POST /api/knowledge/rebuild-hybrid?confirm=REBUILD` | | 4 | 打印重建后 stats | 服务端 `rebuild-hybrid` 内部顺序: 1. **Drop + recreate** Milvus collection(`milvus.collection`,默认 `biz`) - 原有向量数据会被删除 - 按 dense + BM25 schema 重建 2. **清空** MySQL `api_document` 3. **清空** 内存 L0 索引 4. **扫描** `knowledge_base/**/*.md`(跳过 `README.md`)并 force 全量导入 - 写 MySQL 元数据 - 切片 - 写 dense 向量 + BM25 `search_text` - 更新 L0 ## 不会做什么 - **不会**动 `knowledge_base/` 源文件 - **不会**在未传 `--confirm REBUILD` 时执行 ## 手动 curl 等价命令 ```bash # 重建(危险:会清空 biz collection + api_document) curl -X POST "http://localhost:9900/api/knowledge/rebuild-hybrid?confirm=REBUILD" # 仅强制导入(不 drop collection) curl -X POST "http://localhost:9900/api/knowledge/init?force=true" # 统计 curl "http://localhost:9900/api/knowledge/stats" ``` ## 成功判据 响应中大致应有: ```json { "success": true, "collection": "biz", "inserted": 15, "failed": 0, "milvus": { "recreated": true, "loaded": true } } ``` 然后用一条知识库里真实存在的术语/故障词走 `lookup_knowledge` 或 chat 验证 hybrid 命中。 ## 失败排查 | 现象 | 可能原因 | |---|---| | connect / token 错误 | `MILVUS_TOKEN`、host、database | | BM25 / analyzer 相关报错 | 云端 Milvus/Zilliz 版本不支持 BM25 Function | | inserted=0 | `knowledge_base` 路径不对,或 md 缺 frontmatter/title | | failed>0 | 看响应 `details` 与应用日志 |