AnythingLLM + Ollama 实战:跟本地文档对话的私有知识库

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

AnythingLLM + Ollama 私有知识库整体架构示意:用户浏览器 -> AnythingLLM 容器 -> Ollama 本地服务 -> 本地文档/向量库-1

准备环境

整套方案跑在一台机器上即可,建议配置:

  • 系统: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

macOSbrew 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 面板,开始提问。可以这样试:

  1. 问一个文档里有的事实(比如”产品保修期多久?”),看回答是否带引用
  2. 问一个文档没提到的内容,确认模型会回答”不知道”或者不引用

AnythingLLM 默认每条回答下方会列出引用的文档片段(source citations),点击可以跳到原文上下文。如果引用为空而你期待有,说明:

  • 文档没成功向量化(看 Documents 状态)
  • Embedding 模型没配对
  • 问题与文档语义距离太远,可以换问法重试

    ### 进阶玩法

多工作区隔离:AnythingLLM 支持多工作区,每个工作区独立的文档集合、独立的对话上下文。适合把”产品手册”、”客户案例”、”内部 SOP”分开放。在 Workspaces 页新建即可。

调整文档切片:Settings → Vector DatabaseText Splitter 里可以改 chunk size 和 overlap。文档段落特别长或特别短时调一下,检索质量会好很多。

对接外部数据源:工作区 Documents 区右上角有 “Data Connectors”,AnythingLLM 内置 GitHub repo、Confluence、网页链接等 connector,填好凭证后能定时同步内容进来,不用手动上传。

多用户与权限:Docker 部署版支持多用户(桌面端不支持),在 Settings → Users 启用。多用户模式启用后,每个工作区可单独设访问权限。

模型切换:跑完小模型觉得回答质量不够,可以在 Settings 里把 Chat Model 换成 qwen2.5:14b 之类更大的(前提是机器显存够),不用重启容器。

常见坑

  1. Linux Docker 连不到宿主 Ollama:默认 host.docker.internal 不生效,必须按上文加 --add-host=host.docker.internal:host-gateway
  2. 模型找不到:UI 下拉是空的,说明 Ollama 里没模型,先 ollama pull 拉好再回去刷新。
  3. 回答不带引用:检查 Embedding Provider 是否配了,并且 Documents 里文档状态不是”failed”。
  4. 上传大文件 OOM:collector 是单独容器,受 Docker 内存限制影响,过百 MB 的 PDF 可能需要调高 Docker 内存或在 Settings 里调小 chunk。
  5. 工作区 vs 全局文档:AnythingLLM 的文档是绑在工作区里的,把文档从工作区 A 移到 B 要在 Documents 页用 Move 操作,不是简单的拖拽。
  6. 首次启动很慢: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 官方文档

更多横向对比可以看:

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。