VPS 私有化部署 AI 知识库 / RAG(Dify / AnythingLLM):把文档变成问答机器人(2026)

想让 AI 只基于你的私有文档回答?本文讲清什么是 RAG(检索增强生成),对比 Dify、AnythingLLM 与 OpenWebUI,手把手在 VPS 用 Docker Compose 部署,接入自带大模型 Key,并选好向量库。

延伸阅读

更多相关攻略推荐:Ollama AI系列(2):VPS上的AI推理与API应用Ollama AI系列(2):VPS上的AI推理与API应用【CPU选型 01】搭载 AMD Ryzen 9950X 的 VPSARM / Ampere 席卷 VPS:性价比真香还是兼容陷阱?Ollama AI系列(2):VPS上的AI推理与API应用

一、什么是 RAG(检索增强生成)及通俗原理

RAG 是 Retrieval-Augmented Generation(检索增强生成)的缩写。这套思路在 2020 年由 Lewis 等人(当时来自 Meta FAIR 与伦敦大学学院)在 NeurIPS 论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中正式提出。它的核心目标只有一个:让大语言模型在回答问题之前,先去一个外部知识库里"查资料",而不是只凭训练时记住的内容硬编。

一个好懂的类比是开卷考试与闭卷考试。没有 RAG 的模型像在考场上闭卷答题,只能依赖记忆,遇到没记牢的内容就会"猜",于是产生幻觉(编造答案)。接上 RAG 后,模型每次答题前都会先翻到相关的几页资料、读关键段落,再组织答案——学生还是同一个学生,但开卷版本明显更准、更稳。

RAG 的运行可以拆成三个阶段:离线建库(Embedding)在线检索(Retrieval)生成回答(Generation)。建库时,系统把你的 PDF、Word、网页等文档切成一个个 200 到 1000 词的小块(chunk),用嵌入模型(Embedding Model)把每块文字变成一串高维数字向量,存入向量数据库,并保留来源等元数据。问答时,用户的问题会先用同一个嵌入模型转成向量,再去库里做语义相似度搜索(常用余弦相似度),召回最相关的 Top-K 个片段(通常 3 到 10 段),最后把这些片段和用户问题拼成提示词交给大模型,由模型写出带依据的回答。

相比纯靠模型记忆,RAG 有四个实打实的好处:一是减少幻觉,答案被限定在检索到的资料里;二是数据私有,敏感文档不需要送进公共大模型训练;三是可溯源,好的平台会标注引用来源(哪份文件、哪一段),增强可信度;四是低成本实时更新,知识库变了只要重新索引新文档,无需重训昂贵的模型。

二、为什么把知识库搬到自己的 VPS(而非用云服务)

市面上有不少"上传文档就能聊"的 SaaS 知识库产品,但很多面向中文用户、尤其涉及合同、人事制度、财务数据的团队,更在意数据是否出境。把整套 RAG 跑在自己租的 VPS 上,本质是把"数据不出站"这件事掌握在自己手里。

私有化部署的隐私优势分两档。第一档是全本地:大模型、嵌入模型、向量库全跑在你机器上,文档从解析、向量化到检索、生成全程不出内网,物理上最安全,适合金融、政务等对隔离要求极端的场景。第二档是本地存文档 + 云端大模型:文档和向量都留在本地,只有"问题 + 检索到的相关片段"会被发往云端模型 API。即便走这一档,原始文档也从不整体外传,暴露面被大幅缩小——这正是 RAG 架构的精髓:大模型只接触解决当前问题所需的那一小段信息,而不是整个数据库

此外,自己部署意味着自带密钥(BYOK)和可控成本:你用自己的模型 API Key,用量和账单清晰;也方便随时切换供应商(OpenAI、DeepSeek、通义千问、硅基流动等),不被单一平台绑定。

三、Dify vs AnythingLLM vs OpenWebUI 怎么选

三个都是开源、可 Docker 自托管的方案,但定位差别明显,按"想省事还是想可控"来挑:

Dify(由 LangGenius 开发)更像一套"LLM 应用开发平台"。它把可视化编排、提示词工程、知识库、工作流和 API 发布集中在一个后台里,适合要做企业知识库、智能客服、并把应用发布成 WebApp 或嵌入网站的团队。功能最全,但组件也最多(默认自带 Weaviate 向量库),上手和运维成本相对高。

AnythingLLM 是开箱即用的全栈 RAG 应用,主打"几分钟跑起来"。它用单容器就能把 Web 界面、向量库(默认 LanceDB)、文档处理器全包了,还提供"工作区(Workspace)"隔离——可以给工程、法务分别建独立知识库和模型设置。不需要 GPU,对初学者最友好。

OpenWebUI(前身 Ollama WebUI,GitHub 已超 13 万 star)是一个自托管的 AI 聊天界面,强项是多后端:同一个界面里能同时挂本地 Ollama、OpenAI、Anthropic、vLLM、Groq、OpenRouter 等,模型下拉框一键切换。它的 RAG 支持"知识集(Knowledge Collections)"这种可共享的持久文档集,适合已经习惯用聊天界面、又想顺手加文档问答的用户。

一句话建议:想快速搭个能聊自己文档的助手,选 AnythingLLM;想把 RAG 做成可发布、可编排的产品/客服,选 Dify;如果你主要在用 Ollama 本地模型、想要一个漂亮的聊天前端顺带做 RAG,选 OpenWebUI

四、部署前准备:VPS 配置、Docker 与硬件要求

系统建议选 Ubuntu 22.04 LTS(或 Rocky/AlmaLinux 9)。先装好 Docker 与 Docker Compose:Dify 明确要求 Docker 19.03+ 且 Compose 为 V2(版本号 2.24.0 以上);AnythingLLM 与 OpenWebUI 对 Compose 版本要求更宽松,但统一用 V2 最稳。

硬件方面,三者都不强制要显卡,差别主要在内存:

  • Dify:官方最低 2 核 CPU / 4 GiB 内存;生产环境建议 4 核 / 16 GiB 内存,磁盘预留 20–50 GB(要装向量库、日志)。
  • AnythingLLM:最低 2 vCPU / 4 GB 内存,推荐 4 vCPU / 8 GB;应用本身无需 GPU,嵌入默认走 CPU;存储 10 GB 起,文档多则 50 GB+。资料称 1 GB 空间就能装下数万页文本。
  • OpenWebUI:最低 8 GB 内存 / 4 vCPU,推荐 16 GB,因为常和 Ollama 同机跑。

关于显卡:只有在你要在本机跑大模型推理(Ollama / vLLM 本地模型)时才需要 GPU。跑 7B–13B 级别模型大致要 RTX 3090(24 GB 显存);70B+ 大模型得上 A100 80 GB。而嵌入模型与向量检索在 CPU 上完全够用,所以"先不买显卡、用云端 LLM Key"是性价比最高的起步方式。

五、用 Docker Compose 部署 Dify(含关键片段)

Dify 官方提供了完整的 docker-compose.yml 与 .env 模板,照着跑即可:

git clone --branch "$(curl -s https://api.github.com/repos/langgenius/dify/releases/latest | jq -r .tag_name)" https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
docker compose up -d

启动后一共会拉起 7 个核心服务(api、api_websocket、worker、worker_beat、web、plugin_daemon、agent_backend)和 8 个依赖组件(weaviate、db_postgres、redis、nginx、ssrf_proxy、agent_ssrf_proxy、sandbox、local_sandbox)。用 docker compose ps 确认都处于 Up 或 healthy 即可。

浏览器打开 http://你的服务器IP/install 完成管理员初始化,之后访问 http://你的服务器IP 登录。生产环境务必在 .env 里设置一个强随机的 SECRET_KEY(一旦设定不要改,否则已加密数据和 JWT 会失效),并改用反向代理 + HTTPS 暴露,不要直接把端口裸奔到公网。

在 Dify 后台建知识库:点"知识库 → 导入已有文本",支持 Markdown、Docx、TXT、PDF 等。索引方式选"高质量",Embedding 模型可选 Qwen3-Embedding-8B 这类中文表现好的模型,检索方式选混合检索,Top K 设 5,再可选一个 Rerank 模型(如 Qwen3-Reranker-8B)提升召回质量,最后"保存并处理"。

六、更轻量的选择:AnythingLLM 与 OpenWebUI

AnythingLLM 一条命令就能起来(注意 --cap-add SYS_ADMIN 是为了让容器内 Chromium 做网页抓取和 PDF 渲染,不能省略):

export STORAGE_LOCATION=$HOME/anythingllm
mkdir -p $STORAGE_LOCATION
touch "$STORAGE_LOCATION/.env"
docker run -d --name anythingllm --restart unless-stopped   -p 3001:3001 --cap-add SYS_ADMIN   -v $STORAGE_LOCATION:/app/server/storage   -v $STORAGE_LOCATION/.env:/app/server/.env   -e STORAGE_DIR="/app/server/storage"   mintplexlabs/anythingllm

等日志出现 "Server listening on port 3001",打开 http://IP:3001 走设置向导:建管理员 → 选 LLM 供应商 → 选嵌入模型 → 建第一个工作区。上传 PDF/Word/TXT 或填网址后,记得点"Move to Workspace"再"Save and Embed",系统才会切块、向量化入库。回答时会清晰列出引用来源,基本杜绝"凭空编造"。

OpenWebUI 如果想连本地 Ollama 一起跑,可用下面这段 Compose(已含 RAG 调参):

services:
  ollama:
    image: ollama/ollama:latest
    ports: ["11434:11434"]
    volumes: ["ollama_data:/root/.ollama"]
    restart: unless-stopped
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    ports: ["3000:8080"]
    volumes: ["open_webui_data:/app/backend/data"]
    environment:
      OLLAMA_BASE_URL: "http://ollama:11434"
      RAG_EMBEDDING_MODEL: "nomic-embed-text:latest"
      CHUNK_SIZE: "1000"
      CHUNK_OVERLAP: "200"
      RAG_TOP_K: "5"
    depends_on: [ollama]
    restart: unless-stopped
volumes:
  ollama_data:
  open_webui_data:

启动后访问 3000 端口,在 Settings → Connections 里还能再添加 OpenAI、Anthropic 等后端,实现"同一界面多模型";在 Settings → Features 开启 RAG,就能上传文档建知识集。

七、接入大模型 API:BYOK 与密钥保护

一个能用的 RAG 至少需要两类模型:LLM(生成回答)Embedding(把文字变向量);再进阶可加一个 Rerank(重排序)模型来提升检索质量。国内可选硅基流动、阿里云百炼、智谱 AI、通义千问、DeepSeek;海外有 OpenAI、Cohere、Anthropic 等。新手用硅基流动这类聚合平台,一个 Key 能试多家模型,比较省心。

BYOK(Bring Your Own Key)的意思是密钥由你自己提供,填在服务器的 .env 或环境变量里,绝不要写进前端网页或提交到公开仓库。任何暴露 11434(Ollama)、3001(AnythingLLM)、5432(Postgres)等内部端口的做法都要避免;对外只开 80/443,前面套一层 Caddy 或 Nginx 做自动 TLS,并用防火墙(如 ufw)只放行必要端口。同时给各组件设置强密码和 SECRET_KEY,避免默认凭据被扫。

嵌入模型的中文场景,优先选 BGE-M3、Qwen3-Embedding 这类对中文友好的开源模型;若用云端嵌入,OpenAI 的 text-embedding-3-small 也常见。记得建库和查询必须用同一个嵌入模型,否则向量空间不一致,检索会失效。

八、向量数据库选型:Postgres+pgvector / Milvus / Qdrant

向量库负责存放和检索那堆高维向量,是 RAG 的"记忆中枢"。常见选项与取向如下:

  • Postgres + pgvector:复用你已有的 PostgreSQL,运维最简单,适合万级文档的中小规模。AnythingLLM 有专门的 mintplexlabs/anythingllm:pg 镜像,Dify 也能切到 pgvector。
  • Milvus:分布式向量数据库,能扛亿级向量、高并发,性能强但运维最重,适合企业大规模知识库。
  • Qdrant:用 Rust 写的嵌入式高性能库,本地和云端都能跑,很多 OpenWebUI 生产教程拿它做向量后端(通过 VECTOR_DB=qdrant 指定)。
  • Chroma:OpenWebUI 默认,零配置、开箱即用,适合小体量。
  • LanceDB:AnythingLLM 默认,基于 Rust 的嵌入式无服务库,万文件内几乎瞬时响应。

选型口诀:个人或小团队(几千到几万文档)直接用 LanceDB / Chroma / pgvector,省心;文档量上百万、要求高可用和弹性扩展,再上 Milvus 或 Qdrant。检索策略上建议开混合检索(关键词 BM25 + 语义向量),并对 Top-K 结果做重排序,能明显纠正"语义相近但答非所问"的偏差。

#RAG #私有化部署 #Dify #AnythingLLM #OpenWebUI #VPS #知识库