Open WebUI 的 RAG 功能默认可以使用本地向量库,但如果你想把知识库放到独立的外部存储里,Milvus 是一个常见选择。这篇内容面向已经跑通 Open WebUI 基础功能的用户,重点说清楚两件事:Milvus 怎么起、Open WebUI 怎么把向量写入 Milvus。配置过程中会遇到版本参数不一致、连接地址不可达、embedding 模型不匹配等问题,下面给的步骤和检查方式可以帮你定位。
在 Open WebUI 中使用 Milvus,本质上是在启动阶段指定向量库类型和连接地址,并在同一环境里配置 embedding 模型。Milvus 本身只存向量和元数据,不负责生成向量,所以 embedding 模型的选型与 Milvus 中的维度必须一致。配置是否生效,最终要回到“写入后能否在 Milvus 里查到 collection”和“RAG 问答时能否取到上下文”这两个验证点。
前置准备:确认你要走哪种接入方式
Open WebUI 支持通过环境变量指定向量库。当前版本中,控制向量库的关键变量是 VECTOR_DB,当你设为 milvus 时,还需要提供连接信息。另一种做法是使用 Open WebUI 自带的向量库,并在应用内部通过 API 对接 Milvus,但这种方式配置链更长,建议先走环境变量方案。你需要准备一个可访问的 Milvus 实例,可以是 Docker 启动的独立容器,也可以是已部署的集群服务。如果 Milvus 和 Open WebUI 在同一台机器上,用 localhost 即可;如果是跨主机,需要确认防火墙和网络策略。
第一步:启动 Milvus 实例
Milvus 官方提供了 Docker Compose 方式。通常需要启动 etcd、minio 和 standalone 三个服务。下面是一份可用的编排片段,你可以保存为 docker-compose.yml,再执行 docker-compose up -d。端口使用默认的 19530,这是 gRPC 端口。
services:
etcd:
image: quay.io/coreos/etcd:v3.5.5
environment:
- ETCD_AUTO_COMPACTION_MODE=revision
- ETCD_AUTO_COMPACTION_RETENTION=1000
- ETCD_QUOTA_BACKEND_BYTES=4294967296
volumes:
- etcd_data:/etcd
minio:
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
environment:
MINIO_ACCESS_KEY: minioadmin
MINIO_SECRET_KEY: minioadmin
command: minio server /minio_data
volumes:
- minio_data:/minio_data
standalone:
image: milvusdb/milvus:v2.3.3
command: ["milvus", "run", "standalone"]
ports:
- "19530:19530"
environment:
ETCD_ENDPOINTS: etcd:2379
MINIO_ADDRESS: minio:9000
depends_on:
- etcd
- minio
volumes:
etcd_data:
minio_data:
启动后用 docker-compose ps 查看状态,确保 standalone 处于 running。接着可以用 Python 客户端做一个连通性检查:
pip install pymilvus
python -c "from pymilvus import connections; connections.connect(host='localhost', port='19530'); print('ok')"
如果输出 ok,说明 Milvus 的 gRPC 端口可访问。若连接超时,先检查容器是否正常,再确认端口映射是否被占用。
第二步:配置 Open WebUI 环境变量
Open WebUI 支持通过环境变量注入 RAG 配置。如果你是用 Docker 启动 Open WebUI,常见做法是在 docker run 的 -e 参数里传入。下面是一组需要关注的变量:
VECTOR_DB=milvus
MILVUS_URI=localhost:19530
MILVUS_TOKEN=
RAG_EMBEDDING_ENGINE=ollama
RAG_EMBEDDING_MODEL=nomic-embed-text
MILVUS_URI 默认使用端口 19530,如果 Milvus 在远程服务器,改成对应的 IP 或域名。若 Milvus 启用了认证,需要把用户名密码放在 MILVUS_TOKEN 中,格式通常是 username:password。如果不填 MILVUS_TOKEN,Open WebUI 会尝试匿名连接,多数本地部署的 Milvus 默认放行。
RAG_EMBEDDING_ENGINE 用来指定生成向量的引擎。Open WebUI 的 RAG 流程会先对文档做切块,再用 embedding 模型把文本块变成向量,最后写入 Milvus。这里选 ollama 表示使用 Ollama 托管的本地模型,你也可以选 openai 或 sentence-transformers,但必须确认模型能产出固定维度的向量,且后续查询时使用同一个模型。embedding 模型一旦确定,后续更换会导致 Milvus 里旧向量和新向量维度不一致,RAG 检索会报错或结果异常。
如果你是直接用 Python 源码运行 Open WebUI,可以在启动前设置系统环境变量,或者使用 export 命令:
export VECTOR_DB=milvus
export MILVUS_URI=localhost:19530
export RAG_EMBEDDING_ENGINE=ollama
export RAG_EMBEDDING_MODEL=nomic-embed-text
启动后,打开 Open WebUI 的 管理面板,在文档设置里上传一个测试 PDF。上传完成后,进入 Milvus 的命令行或 Python 客户端,查看是否出现了 collection。默认情况下,collection 名称可能类似 file_xxx,可以通过 list_collections() 查看。
第三步:验证 RAG 链路是否打通
配置完不能只看到“上传成功”就结束。你需要做三个层级的验证:写入验证、检索验证、问答验证。
- 写入验证:在 Milvus 里能看到 collection,并且 collection 的行数与文档切块数量相近。调用
get_collection_stats()可以看行数。 - 检索验证:在 Open WebUI 中新建对话,开启 RAG 或知识库引用功能,问一个能从测试文档中直接找到答案的问题。如果回答引用了文档内容,说明检索链路正常。
- 错误日志验证:如果问答时提示找不到向量或连接失败,检查 Open WebUI 日志中是否有
milvus相关报错。常见问题包括 embedding 模型未启动、MILVUS_URI 写成了 HTTP 地址、端口不对、Milvus 版本与客户端驱动不兼容。
一个容易忽略的坑是 Milvus 版本。Open WebUI 使用的 pymilvus 版本对 Milvus 服务端有兼容范围,如果你用的是较新的 Milvus 2.4,而 Open WebUI 内置的客户端较旧,可能握手失败。建议先跑通上述连通性检查,再配置 Open WebUI,这样能快速分清楚问题是出在 Milvus 本体还是 Open WebUI 调用层。
常见问题
上传文档后 Milvus 里没有 collection
先确认 Open WebUI 是否真的读取到了 VECTOR_DB=milvus。可以在 Open WebUI 日志里搜索 milvus 或 vector db 关键词。如果日志没提到,说明环境变量没有生效,检查是 docker run 时传参位置不对,还是 shell 里 export 后没有重启进程。
问答时提示 embedding 维度不一致
这通常是因为之前往同一个 collection 写入过不同模型的向量,或者更换了 RAG_EMBEDDING_MODEL。Milvus 的 collection 在创建时已经确定了维度,无法中途改变。最简单的做法是在 Milvus 里删掉对应 collection,重新上传文档,并保持 embedding 模型不再更换。
Milvus 作为外部向量库的好处是数据独立于 Open WebUI 的重装和升级,但配置过程对版本一致性要求较高。建议先在一台测试机或容器环境里把完整链路跑通,再迁移到正式使用环境,这样排查问题时能减少变量干扰。