# AnythingLLM RAG 平台

## 概览

[AnythingLLM](https://github.com/Mintplex-Labs/anything-llm) 是一个功能完备的开源 AI 工作区，拥有 40K+ 的 GitHub 星标。它将基于文档的 RAG（检索增强生成）、AI 代理和无代码代理构建器整合到一个自托管应用中 —— 通过干净、直观的界面管理，设置无需编程。

**为什么在 Clore.ai 上运行 AnythingLLM？**

* **开箱即用的完整 RAG 管道** — 上传 PDF、Word 文档、网站和 YouTube 转录。AnythingLLM 会自动分块、嵌入并存储它们以用于语义搜索。
* **应用不需要 GPU** — AnythingLLM 默认使用基于 CPU 的嵌入。可将其与在 Clore.ai 上运行 Ollama 或 vLLM 的 GPU 服务器配对以进行本地推理。
* **具有真实工具的 AI 代理** — 内置代理可以浏览网页、编写并执行代码、管理文件和调用外部 API —— 所有这些都通过 GUI 编排。
* **MCP 兼容性** — 与 Model Context Protocol 生态集成，以扩展工具连接性。
* **工作区隔离** — 为不同项目或团队创建具有不同知识库和 LLM 设置的独立工作区。

### 架构概览

```
┌─────────────────────────────────────────────┐
│            AnythingLLM (端口 3001)           │
│                                             │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  │
│  │ RAG/文档 │  │  代理    │  │  用户    │  │
│  └────┬─────┘  └────┬─────┘  └──────────┘  │
│       │             │                       │
│  ┌────▼─────────────▼───────┐               │
│  │    LLM 提供者路由器       │               │
│  └──────────────┬───────────┘               │
└─────────────────┼───────────────────────────┘
                  │
     ┌────────────┼────────────┐
     ▼            ▼            ▼
  OpenAI       Anthropic    Ollama（本地）
  Claude        Gemini      vLLM（本地）
```

***

## 要求

### 服务器规格

| 组件      | 最低     | 推荐                  | 注意事项                |
| ------- | ------ | ------------------- | ------------------- |
| **GPU** | 不需要    | RTX 3090（如使用本地 LLM） | 仅适用于 Ollama/vLLM 后端 |
| **显存**  | —      | 24 GB               | 用于本地模型推理            |
| **CPU** | 2 vCPU | 4 个 vCPU            | 嵌入在 CPU 上运行         |
| **内存**  | 4 GB   | 8 GB                | 更多 = 内存中更大的文档索引     |
| **存储**  | 10 GB  | 50+ GB              | 文档存储、向量数据库、模型缓存     |

### Clore.ai 价格参考

| 服务器类型                  | 大致费用            | 模型变体                         |
| ---------------------- | --------------- | ---------------------------- |
| CPU 实例（4 vCPU，8 GB 内存） | 约 $0.05–0.10/小时 | AnythingLLM + 外部 API 提供商     |
| RTX 3090（24 GB 显存）     | \~$0.20/小时      | AnythingLLM + Ollama 本地 LLMs |
| RTX 4090（24 GB 显存）     | \~$0.35/小时      | AnythingLLM + 更快的本地推理        |
| A100 80 GB             | \~$1.10/小时      | AnythingLLM + 大型 70B+ 模型     |

> 💡 **专业提示：** AnythingLLM 的内置嵌入（LanceDB + 本地 CPU 嵌入器）无需 GPU 即可工作。对于 LLM 后端，你可以使用 OpenRouter 或 Groq 等免费额度 API 提供商以将成本保持在最低。

### 先决条件

* 带 SSH 访问的 Clore.ai 服务器
* Docker（Clore.ai 服务器上预装）
* 至少一个 LLM API 密钥 **或** 本地 Ollama/vLLM 后端

***

## 快速开始

### 方法 1：单个 Docker 容器（推荐）

官方的单容器部署包含所有内容：Web UI、LanceDB 向量存储和文档处理器。

**步骤 1：连接到你的 Clore.ai 服务器**

```bash
ssh root@<your-clore-server-ip> -p <ssh-port>
```

**步骤 2：设置存储目录**

```bash
export STORAGE_LOCATION=$HOME/anythingllm
mkdir -p $STORAGE_LOCATION
touch "$STORAGE_LOCATION/.env"
```

**步骤 3：运行 AnythingLLM**

```bash
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
```

> **原因 `--cap-add SYS_ADMIN`?** AnythingLLM 使用 Chromium 进行网页抓取和 PDF 渲染，这需要容器提升的能力（capabilities）。

**步骤 4：验证启动**

```bash
docker logs anythingllm --tail 30 -f
# 等待："Server listening on port 3001"
```

**步骤 5：完成设置向导**

在浏览器中打开：

```
http://<your-clore-server-ip>:3001
```

首次设置向导将引导你完成：

1. 创建管理员账户
2. 选择 LLM 提供者
3. 选择嵌入模型
4. 配置你的第一个工作区

***

### 方法 2：Docker Compose（多服务）

用于具有独立服务和更易管理的生产部署：

**步骤 1：创建项目目录**

```bash
mkdir -p ~/anythingllm && cd ~/anythingllm
mkdir -p storage
touch storage/.env
```

**步骤 2：创建 `docker-compose.yml`**

```bash
cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
  anythingllm:
    image: mintplexlabs/anythingllm:latest
    container_name: anythingllm
    restart: unless-stopped
    ports:
      - "3001:3001"
    cap_add:
      - SYS_ADMIN
    environment:
      STORAGE_DIR: "/app/server/storage"
      # LLM 提供者（配置一种）
      LLM_PROVIDER: openai
      OPEN_AI_KEY: ${OPENAI_API_KEY}
      OPEN_MODEL_PREF: gpt-4o-mini
      # 嵌入
      EMBEDDING_ENGINE: native
      # 向量数据库
      VECTOR_DB: lancedb
      # 认证
      AUTH_TOKEN: ${ANYTHINGLLM_AUTH_TOKEN}
      JWT_SECRET: ${JWT_SECRET}
    volumes:
      - ./storage:/app/server/storage
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3001/api/ping"]
      interval: 30s
      timeout: 10s
      retries: 3

volumes:
  anythingllm_storage:
EOF
```

**步骤 3：创建 `.env` 文件**

```bash
cat > .env << 'EOF'
OPENAI_API_KEY=sk-your-openai-key-here
ANYTHINGLLM_AUTH_TOKEN=your-instance-password-here
JWT_SECRET=your-random-64-char-secret-here
EOF
```

**步骤 4：启动**

```bash
docker compose up -d
docker compose logs anythingllm -f
```

***

### 方法 3：使用预配置环境变量

用于无需设置向导的自动化部署：

```bash
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" \
  -e LLM_PROVIDER=openai \
  -e OPEN_AI_KEY=sk-your-key \
  -e OPEN_MODEL_PREF=gpt-4o-mini \
  -e EMBEDDING_ENGINE=native \
  -e VECTOR_DB=lancedb \
  -e AUTH_TOKEN=your-password \
  -e JWT_SECRET=$(openssl rand -hex 32) \
  mintplexlabs/anythingllm
```

***

## 配置

### LLM 提供者选项

AnythingLLM 支持多种 LLM 后端。在 UI 中于以下位置设置 **设置 → LLM 偏好**，或通过环境变量：

**OpenAI：**

```bash
-e LLM_PROVIDER=openai
-e OPEN_AI_KEY=sk-your-key
-e OPEN_MODEL_PREF=gpt-4o
```

**Anthropic Claude：**

```bash
-e LLM_PROVIDER=anthropic
-e ANTHROPIC_API_KEY=sk-ant-your-key
-e ANTHROPIC_MODEL_PREF=claude-sonnet-4-5
```

**Google Gemini：**

```bash
-e LLM_PROVIDER=gemini
-e GEMINI_API_KEY=your-key
-e GEMINI_LLM_MODEL_PREF=gemini-1.5-pro
```

**Ollama（本地）：**

```bash
-e LLM_PROVIDER=ollama
-e OLLAMA_BASE_PATH=http://172.17.0.1:11434
-e OLLAMA_MODEL_PREF=llama3.2
```

**OpenRouter（访问 100+ 模型）：**

```bash
-e LLM_PROVIDER=openrouter
-e OPENROUTER_API_KEY=sk-or-your-key
-e OPENROUTER_MODEL_PREF=meta-llama/llama-3.1-8b-instruct:free
```

### 嵌入配置

| 引擎        | 后端         | 需要 GPU | 质量    |
| --------- | ---------- | ------ | ----- |
| `native`  | CPU（内置）    | 否      | 良好    |
| `openai`  | OpenAI API | 否      | 优秀    |
| `ollama`  | 本地 Ollama  | 可选     | 良好-优秀 |
| `localai` | LocalAI    | 可选     | 变量    |

```bash
# 为获得最佳质量使用 OpenAI 嵌入
-e EMBEDDING_ENGINE=openai
-e OPEN_AI_KEY=sk-your-key
-e EMBEDDING_MODEL_PREF=text-embedding-3-small

# 使用 Ollama 嵌入以实现完全本地化的管道
-e EMBEDDING_ENGINE=ollama
-e OLLAMA_BASE_PATH=http://172.17.0.1:11434
-e EMBEDDING_MODEL_PREF=nomic-embed-text
```

### 向量数据库选项

| 数据库        | 4s            | 最适合           |
| ---------- | ------------- | ------------- |
| `lancedb`  | 内置，无需配置       | 默认，适用于小到中等数据集 |
| `chroma`   | ChromaDB（外部）  | 中等数据集，灵活性高    |
| `pinecone` | Pinecone 云    | 大型数据集，生产环境    |
| `weaviate` | Weaviate（自托管） | 高级用例          |

### 工作区配置

AnythingLLM 工作区是具有自身以下内容的隔离环境：

* 文档知识库
* LLM 设置（可覆盖全局设置）
* 聊天历史
* 代理配置

通过 UI 或 API 创建工作区：

```bash
# 通过 API 创建工作区
curl -X POST http://localhost:3001/api/v1/workspace/new \
  -H "Authorization: Bearer your-api-key" \
  -H "Content-Type: application/json" \
  -d '{"name": "My Project", "similarityThreshold": 0.7}'
```

### 文档摄取

通过 UI 或 API 上传文档：

```bash
# 通过 API 上传文档
curl -X POST http://localhost:3001/api/v1/document/upload \
  -H "Authorization: Bearer your-api-key" \
  -F "file=@/path/to/document.pdf"

# 将文档移动到工作区
curl -X POST http://localhost:3001/api/v1/workspace/my-project/update-embeddings \
  -H "Authorization: Bearer your-api-key" \
  -H "Content-Type: application/json" \
  -d '{"adds": ["custom-documents/document.pdf-chunk-1.json"]}'
```

***

## GPU 加速

AnythingLLM 本身在 CPU 上运行。GPU 加速适用于 LLM 推理后端。

### 在同一 Clore.ai 服务器上运行 Ollama

```bash
# 使用 GPU 支持启动 Ollama
docker run -d \
  --name ollama \
  --gpus all \
  --restart unless-stopped \
  -p 11434:11434 \
  -v ollama_data:/root/.ollama \
  ollama/ollama

# 为 AnythingLLM 拉取模型
docker exec ollama ollama pull llama3.2          # 2B，快速
docker exec ollama ollama pull llama3.1:8b       # 8B，平衡
docker exec ollama ollama pull nomic-embed-text  # 用于嵌入
docker exec ollama ollama pull mxbai-embed-large # 更好的嵌入

# 使用 Ollama 配置重启 AnythingLLM
docker stop anythingllm && docker rm anythingllm

docker run -d \
  --name anythingllm \
  --restart unless-stopped \
  -p 3001:3001 \
  --cap-add SYS_ADMIN \
  -v $HOME/anythingllm:/app/server/storage \
  -v $HOME/anythingllm/.env:/app/server/.env \
  -e STORAGE_DIR="/app/server/storage" \
  -e LLM_PROVIDER=ollama \
  -e OLLAMA_BASE_PATH=http://172.17.0.1:11434 \
  -e OLLAMA_MODEL_PREF=llama3.1:8b \
  -e EMBEDDING_ENGINE=ollama \
  -e EMBEDDING_MODEL_PREF=nomic-embed-text \
  mintplexlabs/anythingllm
```

### Clore.ai 上的 GPU-模型性能

| A100          | GPU    | 显存    | 嵌入速度 | 推理速度        | 每小时成本   |
| ------------- | ------ | ----- | ---- | ----------- | ------- |
| Llama 3.2 3B  | 速度     | 2 GB  | 快速   | 60–80 tok/s | \~$0.20 |
| Llama 3.1 8B  | 速度     | 6 GB  | 快速   | 40–60 tok/s | \~$0.20 |
| Mistral 7B    | 速度     | 5 GB  | 快速   | 45–65 tok/s | \~$0.20 |
| Llama 3.1 70B | 4 小时会话 | 40 GB | 中等   | 20–35 tok/s | \~$1.10 |

***

## 提示与最佳实践

### 文档摄取最佳实践

```bash
# 对于大量文档集，请增加 Node.js 内存
-e NODE_OPTIONS="--max-old-space-size=4096"

# 面向不同文档类型的推荐分块设置
# 技术文档：分块大小 1000，重叠 200
# 法律/合同：分块大小 500，重叠 100
# 书籍/文章：分块大小 1500，重叠 300
```

* **预处理大型 PDF** — 含大量 OCR 的扫描会减慢摄取速度。事先使用 `pdftotext` 或 Adobe OCR。
* **按工作区组织** — 为每个项目/领域创建独立工作区以提高检索精确度。
* **使用针对性的查询** — RAG 对具体问题效果最佳，而非宽泛请求。

### 在 Clore.ai 上的成本管理

```bash
# 在停止 Clore.ai 实例之前备份你的存储
tar -czf anythingllm-backup-$(date +%Y%m%d).tar.gz ~/anythingllm/

# 要在新的 Clore.ai 实例上恢复，请还原备份
tar -xzf anythingllm-backup-20240101.tar.gz -C ~/
```

由于 Clore.ai 实例是短暂的，请始终备份存储目录。它包含：

* 向量嵌入（LanceDB）
* 已上传的文档
* 聊天历史
* 代理配置

### 多用户设置

```bash
# 在 UI 中启用多用户模式：
# 设置 → 安全 → 启用多用户模式

# 或通过环境变量：
-e MULTI_USER_MODE=true

# 启用多用户后通过 API 创建用户
curl -X POST http://localhost:3001/api/v1/admin/users/new \
  -H "Authorization: Bearer admin-api-key" \
  -H "Content-Type: application/json" \
  -d '{"username": "alice", "password": "securepass", "role": "default"}'
```

### AI 代理配置

AnythingLLM 代理可以执行真实世界任务。在以下位置启用工具 **设置 → 代理**:

* **网页浏览** — 抓取并读取网页
* **Google 搜索** — 搜索 Google（需要 API 密钥）
* **代码解释器** — 在沙箱中执行 Python
* **GitHub** — 读取代码仓库
* **SQL 连接器** — 查询数据库

```bash
# 通过环境变量启用代理能力
-e AGENT_SEARCH_PROVIDER=google
-e AGENT_GSX_GOOGLE_SEARCH_ENGINE_ID=your-cx-id
-e AGENT_GSX_GOOGLE_SEARCH_KEY=your-api-key
```

### 性能调优

```bash
# 对于繁重的文档处理工作负载
docker run -d \
  --name anythingllm \
  --restart unless-stopped \
  --cpus="4" \
  --memory="8g" \
  -p 3001:3001 \
  --cap-add SYS_ADMIN \
  -v $HOME/anythingllm:/app/server/storage \
  -v $HOME/anythingllm/.env:/app/server/.env \
  -e STORAGE_DIR="/app/server/storage" \
  mintplexlabs/anythingllm
```

### 更新 AnythingLLM

```bash
# 拉取最新镜像
docker pull mintplexlabs/anythingllm:latest

# 先备份
cp -r $HOME/anythingllm $HOME/anythingllm-backup-$(date +%Y%m%d)

# 停止并移除旧容器（数据在卷中，安全）
docker stop anythingllm && docker rm anythingllm

# 使用相同命令重启
docker run -d \
  --name anythingllm \
  --restart unless-stopped \
  -p 3001:3001 \
  --cap-add SYS_ADMIN \
  -v $HOME/anythingllm:/app/server/storage \
  -v $HOME/anythingllm/.env:/app/server/.env \
  -e STORAGE_DIR="/app/server/storage" \
  mintplexlabs/anythingllm
```

***

## # 使用固定种子以获得一致结果

### 容器启动但 UI 无法访问

```bash
# 检查容器是否在运行
docker ps | grep anythingllm

# 检查启动错误日志
docker logs anythingllm --tail 50

# 验证端口绑定
ss -tlnp | grep 3001

# 检查 Clore.ai 服务器在端口映射中是否包含 3001
# （在 Clore.ai 部署设置中添加）
```

### 文档上传失败

```bash
# 检查可用磁盘空间
df -h

# 检查文档处理器日志
docker logs anythingllm 2>&1 | grep -i "error\|fail\|upload"

# 验证是否已设置 SYS_ADMIN 能力（Chromium 所需）
docker inspect anythingllm | grep -A5 CapAdd
```

### RAG 响应质量差 / 幻觉问题

常见原因与修复：

```bash
# 1. 调整相似度阈值（更低 = 检索更多文档）
# 设置 → 工作区 → 向量数据库 → 相似度阈值：0.5

# 2. 增加 top-K 结果数
# 设置 → 工作区 → 向量数据库 → 最大上下文片段数：10

# 3. 改进分块大小（更改后重新摄取文档）
# 设置 → 工作区 → 文本分割器 → 分块大小：1000，重叠：200

# 4. 切换到更好的嵌入模型
-e EMBEDDING_ENGINE=openai
-e EMBEDDING_MODEL_PREF=text-embedding-3-large
```

### AnythingLLM 无法连接到 Ollama

```bash
# 在 AnythingLLM 容器中进行测试
docker exec anythingllm curl -s http://172.17.0.1:11434/api/tags

# 如果失败，查找实际的 Docker 桥接 IP
ip route | grep docker
# 在 OLLAMA_BASE_PATH 中使用该 IP

# 另一种：使用主机网络（host networking）
docker run -d \
  --name anythingllm \
  --network host \
  --cap-add SYS_ADMIN \
  -v $HOME/anythingllm:/app/server/storage \
  -v $HOME/anythingllm/.env:/app/server/.env \
  -e STORAGE_DIR="/app/server/storage" \
  -e OLLAMA_BASE_PATH=http://localhost:11434 \
  mintplexlabs/anythingllm
```

### 内存耗尽 / 容器崩溃

```bash
free -h
docker stats anythingllm

# 通过减少 LanceDB 缓存释放内存
# 或切换到具有更多内存的 Clore.ai 实例

# 使用内存限制和交换重启
docker run -d \
  --name anythingllm \
  --memory=6g \
  --memory-swap=8g \
  -p 3001:3001 \
  --cap-add SYS_ADMIN \
  -v $HOME/anythingllm:/app/server/storage \
  -v $HOME/anythingllm/.env:/app/server/.env \
  -e STORAGE_DIR="/app/server/storage" \
  mintplexlabs/anythingllm
```

***

## 延伸阅读

* [AnythingLLM 文档](https://docs.anythingllm.com) — 完整的设置和 API 参考
* [AnythingLLM GitHub](https://github.com/Mintplex-Labs/anything-llm) — 源代码、问题追踪、路线图
* [AnythingLLM Docker Hub](https://hub.docker.com/r/mintplexlabs/anythingllm) — 镜像标签
* [在 Clore.ai 上运行 Ollama](https://docs.clore.ai/guides/guides_v2-zh/yu-yan-mo-xing/ollama) — AnythingLLM 的本地 LLM 后端
* [在 Clore.ai 上运行 vLLM](https://docs.clore.ai/guides/guides_v2-zh/yu-yan-mo-xing/vllm) — 高性能推理
* [GPU 比较指南](https://docs.clore.ai/guides/guides_v2-zh/kuai-su-ru-men/gpu-comparison) — 选择合适的 Clore.ai 等级
* [MCP 文档](https://modelcontextprotocol.io) — 用于扩展代理的 Model Context Protocol
* [AnythingLLM API 参考](https://docs.anythingllm.com/api-reference) — 用于自动化的 REST API
