AnythingLLM + Ollama 实战:跟本地文档对话的私有知识库
把本地文档丢给大模型,让它基于你的资料回答问题,是当下最常见的私有知识库方案。AnythingLLM 是一个开源的全功能 AI 应用前端,自带文档解析、向量化、工作区管理;Ollama 则让你在本地跑开源大模型,不需要把数据送到云端。两者组合,可以快速搭一个数据不出本地的”私人 ChatGPT”,下面从零开始一步步做。

准备环境
整套方案跑在一台机器上即可,建议配置:
- 系统:Linux、macOS、Windows 均可
- 内存:16 GB 起(要本地跑 7B 模型的话 8 GB 是底线)
- 存储:SSD,预留 20 GB 以上(模型 + 向量库)
- Docker 与 Docker Compose(用于跑 AnythingLLM)
如果还没装 Docker,按下面命令装。以 Linux 为例:
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER
装完重新登录终端让 docker 组生效。macOS / Windows 直接装 Docker Desktop 即可。
部署 Ollama
Ollama 是本地大模型运行时,负责加载对话模型和 embedding 模型。
Linux 安装:
curl -fsSL https://ollama.com/install.sh | sh
macOS:brew install ollama 或去 ollama.com 下载安装包。
Windows:去 ollama.com 下载 OllamaSetup.exe。
安装完成后启动服务(Linux 通常已自动起为 systemd 服务,macOS 桌面端启动 App 即可):
systemctl status ollama # Linux 查看状态
# 或直接前台运行
ollama serve
确认服务正常:
curl http://127.0.0.1:11434
# 返回 "Ollama is running" 说明 OK
拉取对话模型和 embedding 模型:
# 对话模型,按机器显存选
ollama pull qwen2.5:7b # 通用中文场景,8GB 显存可跑
# ollama pull llama3.1:8b # 英文为主可选这个
# embedding 模型
ollama pull nomic-embed-text # AnythingLLM 兼容的常用 embedding
验证模型拉取成功:
ollama list
# NAME ID SIZE MODIFIED
# qwen2.5:7b xxx 4.7 GB ...
# nomic-embed-text:latest xxx 274 MB ...
部署 AnythingLLM(Docker 方式)
AnythingLLM 提供官方 Docker 镜像,包含前端、Node 服务、文档解析服务三个组件,还自带 MySQL 做元数据存储。先建一个工作目录:
mkdir -p ~/anythingllm && cd ~/anythingllm
在目录下创建 docker-compose.yml:
version: "3.8"
services:
anythingllm-db:
container_name: anythingllm-db
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASS:-anythingllm}
MYSQL_DATABASE: ${DB_NAME:-anythingllm}
MYSQL_USER: ${DB_USER:-anythingllm}
MYSQL_PASSWORD: ${DB_PASS:-anythingllm}
volumes:
- dbdata:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
retries: 10
timeout: 10s
anythingllm-collector:
container_name: anythingllm-collector
image: mintplexlabs/anythingllm-collector:latest
restart: always
environment:
ANYTHING_LLM_URL: http://anythingllm:3001/api/collector
COLLECTOR_PORT: 8888
COLLECTOR_API_KEY: ${COLLECTOR_API_KEY:-dev}
depends_on:
anythingllm-db:
condition: service_healthy
anythingllm:
container_name: anythingllm
image: mintplexlabs/anythingllm:latest
restart: always
ports:
- "3001:3001"
depends_on:
anythingllm-db:
condition: service_healthy
anythingllm-collector:
condition: service_started
volumes:
- anythingllm_storage:/app/server/storage
- anythingllm_hotdir:/app/server/hotdir
- anythingllm_plugins:/app/server/plugins
environment:
STORAGE_DIR: "/app/server/storage"
VECTOR_DB: "lancedb"
DB_HOST: "anythingllm-db"
DB_PORT: "3306"
DB_USER: "${DB_USER:-anythingllm}"
DB_PASS: "${DB_PASS:-anythingllm}"
DB_NAME: "${DB_NAME:-anythingllm}"
LLM_PROVIDER: "ollama"
OLLAMA_BASE_URL: "http://host.docker.internal:11434"
OLLAMA_MODEL_PICKER: "qwen2.5:7b"
EMBEDDING_MODEL_PICKER_PROVIDER: "ollama"
EMBEDDING_MODEL_PICKER_MODEL: "nomic-embed-text"
WHISPER_PROVIDER: "local"
TTS_PROVIDER: "native"
volumes:
dbdata:
anythingllm_storage:
anythingllm_hotdir:
anythingllm_plugins:
关键项说明:
ports: "3001:3001":把容器的 3001 端口暴露给宿主,UI 入口。OLLAMA_BASE_URL: "http://host.docker.internal:11434":这是 Docker 容器访问宿主机的特殊域名,Mac/Windows 自带支持,Linux 用户需要在启动时加--add-host=host.docker.internal:host-gateway(见下)。OLLAMA_MODEL_PICKER/EMBEDDING_MODEL_PICKER_MODEL:默认模型,启动后也能在 UI 里改。volumes:三个卷分别保存存储、上传的临时文档(hotdir)、自定义插件,删容器数据不丢。
启动(Linux 注意加 add-host):
# Mac / Windows 直接
docker compose up -d
# Linux 需要让容器能解析 host.docker.internal
docker compose up -d \
--add-host=host.docker.internal:host-gateway
启动后等几秒,浏览器打开 http://localhost:3001,看到 AnythingLLM 登录/初始化页面就算成功。首次进入会让你设置管理员账号,按提示走完。
### 配置 LLM Provider 连 Ollama
进 UI 后默认会让你建一个工作区,先点左下角头像进入 Settings(设置) → LLM Providers。
在 LLM provider 列表里选 Ollama:
- Base URL:填
http://host.docker.internal:11434(如果你按上面的 compose 已经预设进环境变量,这里通常会自动填好;想换地址也能在 UI 改) - Chat Model Selection:下拉里能看到 Ollama 已拉取的模型,选
qwen2.5:7b或你实际拉的那个 - Max Tokens:保持默认即可
点 Save 保存。如果出现 Could not connect to Ollama 报错,多半是上面 Linux add-host 没加,或者宿主 Ollama 没跑。
### 配置 Embedding 模型
同样在 Settings 里找 Embedder(或 Vector Database 旁边的 Embedding Provider):
- Provider 选 Ollama
- Model 填
nomic-embed-text(或你在ollama list里看到的任意 embedding 模型) - Max embedding chunk length 保持默认
保存。这一步没配好,上传文档后会出现”向量化失败”或者检索不到内容。
建工作区 + 上传文档
回到主界面,左上角点 New Workspace 创建一个工作区,例如叫”产品手册”。
进入工作区后,Documents 区有几种添加方式:
- 拖拽文件(支持 PDF、DOCX、TXT、MD 等)
- 点击上传按钮选文件
- Connect to a data source 接外部数据源(GitHub repo、Confluence 页面等,后续进阶再说)
上传一个 PDF 后,会进入 “processing” 状态:collector 容器解析文本 → 切片 → embedding 入库。文档多时这一步较慢,进度条会显示当前 chunk。
完成后文档状态变为绿色,鼠标悬停可以看到 chunk 数量。
### 对话测试
切到工作区的 Chat 面板,开始提问。可以这样试:
- 问一个文档里有的事实(比如”产品保修期多久?”),看回答是否带引用
- 问一个文档没提到的内容,确认模型会回答”不知道”或者不引用
AnythingLLM 默认每条回答下方会列出引用的文档片段(source citations),点击可以跳到原文上下文。如果引用为空而你期待有,说明:
- 文档没成功向量化(看 Documents 状态)
- Embedding 模型没配对
- 问题与文档语义距离太远,可以换问法重试
### 进阶玩法
多工作区隔离:AnythingLLM 支持多工作区,每个工作区独立的文档集合、独立的对话上下文。适合把”产品手册”、”客户案例”、”内部 SOP”分开放。在 Workspaces 页新建即可。
调整文档切片:Settings → Vector Database → Text Splitter 里可以改 chunk size 和 overlap。文档段落特别长或特别短时调一下,检索质量会好很多。
对接外部数据源:工作区 Documents 区右上角有 “Data Connectors”,AnythingLLM 内置 GitHub repo、Confluence、网页链接等 connector,填好凭证后能定时同步内容进来,不用手动上传。
多用户与权限:Docker 部署版支持多用户(桌面端不支持),在 Settings → Users 启用。多用户模式启用后,每个工作区可单独设访问权限。
模型切换:跑完小模型觉得回答质量不够,可以在 Settings 里把 Chat Model 换成 qwen2.5:14b 之类更大的(前提是机器显存够),不用重启容器。
常见坑
- Linux Docker 连不到宿主 Ollama:默认
host.docker.internal不生效,必须按上文加--add-host=host.docker.internal:host-gateway。 - 模型找不到:UI 下拉是空的,说明 Ollama 里没模型,先
ollama pull拉好再回去刷新。 - 回答不带引用:检查 Embedding Provider 是否配了,并且 Documents 里文档状态不是”failed”。
- 上传大文件 OOM:collector 是单独容器,受 Docker 内存限制影响,过百 MB 的 PDF 可能需要调高 Docker 内存或在 Settings 里调小 chunk。
- 工作区 vs 全局文档:AnythingLLM 的文档是绑在工作区里的,把文档从工作区 A 移到 B 要在 Documents 页用 Move 操作,不是简单的拖拽。
- 首次启动很慢:MySQL 第一次初始化要拉镜像、跑 schema,加起来一两分钟很正常,看
docker compose logs -f anythingllm实时追进度。
小结一下流程
跑通这条链路的最小闭环是:Ollama 起服务 + 拉模型 → AnythingLLM 用 Docker Compose 起 → Settings 配 Ollama 为 LLM Provider + embedding provider → 建工作区 → 拖文档进去 → 提问看引用。之后可以加多工作区、接外部数据源、换更大模型,都是在 UI 里点几下。
官方文档提供了更细的配置项(向量库换 PGVector / Pinecone、加 MCP server、Agent flows 等),需要深入时建议参考 AnythingLLM 官方文档。
更多横向对比可以看:

评论(0)