本次切换的核心价值在于:将 Dify 本地知识库的默认向量数据库从 Weaviate 迁移至 Milvus,能够显著提升高并发场景下的索引构建速度与检索稳定性。特别是当文档数量超过 500 页、工作流并行数达到 4 个以上时,原 Weaviate 极易出现内存溢出、索引状态长期卡死等问题,而 Milvus 在此类高负载环境下的表现明显更加稳健。
准备 Milvus 服务环境
推荐使用 Docker Compose 独立部署 Milvus 实例,避免与 Dify 容器混合运行,从而防止资源竞争。直接拉取官方独立部署文件:wget https://github.com/milvus-io/milvus/releases/download/v2.6.2/milvus-standalone-docker-compose.yml -O docker-compose.yml。
下载后,有一个细节容易被忽略——端口映射。需要在 standalone 服务块下补充两行:- "19530:19530"(gRPC 通信,必须配置)和 - "9091:9091"(健康检查与 HTTP 接口)。缺少这一步,Dify 后续将无法连接 Milvus,排查起来相当棘手。
启动服务只需执行 docker-compose up -d,等待约 90 秒使服务完全初始化。验证是否就绪的方法很简单:curl -f http://localhost:9091/healthz,返回 {"status":"healthy"} 即表示运行正常。
配置 Dify 指向 Milvus
返回 Dify 的部署目录 dify/docker/,找到 .env 文件,将 VECTOR_STORE 的值从 weaviate 修改为 milvus。
接下来填写连接参数,这里有一个容易踩坑的地方。设置 MILVUS_URI=http://milvus-standalone:19530 时,切勿使用 localhost。原因是 Dify 容器内部解析 DNS 需要依赖服务名,而 milvus-standalone 正是你在 docker-compose 中定义的服务名称。如果启用了认证,再补充 MILVUS_USER 和 MILVUS_PASSWORD;未启用认证时,这两行可以删除或留空。
关键前提:务必确保 docker-compose.yml 中 Dify 服务的 depends_on 包含 milvus-standalone,并且网络定义保持一致(例如都挂在同一个 milvus 自定义网络下)。否则容器之间无法互相访问,后续排查会非常繁琐。
执行向量数据迁移
操作分为三步。
第一步:停止当前 Dify 服务——docker-compose down。
第二步:重新启动,使新的配置文件生效——docker-compose up -d。
第三步:进入 API 容器,执行迁移命令——docker exec -it dify-api-1 flask vdb-migrate。该命令会自动读取 .env 中的 Milvus 配置,将 Weaviate 中的现有向量数据批量导出、转换格式,最后写入 Milvus 的集合 dify_rag_docs。
如果执行时出现 Fail connecting to server on 127.0.0.1:19530 错误,基本可以断定是 MILVUS_URI 中填写了 localhost。解决办法很简单:改回 milvus-standalone(对应 docker-compose 中的服务名),问题即可解决。
