想让 AI Agent 帮你干活,但不想把数据传到云端?n8n 官方出了个 Self-hosted AI Starter Kit,Docker Compose 一拉,本地就能跑起 AI 工作流。我上周花了一个下午把它跑通了,这篇文章记录整个过程,包括踩过的坑。

这套东西有什么

先说清楚这个 Starter Kit 里装了什么:

  • n8n:开源工作流自动化平台,400 多个集成,拖拽式编排,不用写代码也能搞定自动化
  • Ollama:本地跑大模型,支持 Llama 3、Qwen 2.5、Mistral 等主流开源模型
  • Qdrant:向量数据库,做 RAG(检索增强生成)要用
  • PostgreSQL:n8n 的数据存储

四个容器,各司其职。n8n 负责编排工作流,Ollama 跑模型推理,Qdrant 存向量,PostgreSQL 存工作流配置和执行记录。

机器要求

先确认你的机器够不够用。我的实测环境:

配置项最低要求我的机器
内存8GB(跑 7B 模型)32GB
磁盘20GB 可用空间100GB SSD
CPU4 核M2 Pro 12 核
GPU非必须,有更好M2 集成 GPU
DockerDocker Desktop 或 Docker EngineDocker Desktop 4.38

如果你只有 8GB 内存,建议用 Qwen2.5:3b 或 Phi-3 mini 这种小模型。16GB 以上可以跑 7B 甚至 14B。

部署步骤

1. 克隆仓库

git clone https://github.com/n8n-io/self-hosted-ai-starter-kit.git
cd self-hosted-ai-starter-kit

2. 配置环境变量

复制 .env.example.env,改几个值:

cp .env.example .env

打开 .env 文件,主要改这几项:

# n8n 的访问地址
N8N_HOST=localhost
N8N_PORT=5678
N8N_PROTOCOL=http

# PostgreSQL 密码,随便设一个强一点的
POSTGRES_PASSWORD=your_strong_password_here

# n8n 加密密钥,必须改
N8N_ENCRYPTION_KEY=your_random_encryption_key

# Ollama 地址,容器间通过服务名访问
OLLAMA_BASE_URL=http://ollama:11434

加密密钥可以用 openssl rand -hex 32 生成一个。

3. 启动所有服务

docker compose up -d

第一次启动要拉镜像,n8n 和 PostgreSQL 加起来大概 1.5GB,Qdrant 大约 200MB,Ollama 镜像本身不大但后面要拉模型。

等所有容器变成 running 状态:

docker compose ps

输出大概长这样:

NAME                    STATUS       PORTS
n8n                     running      0.0.0.0:5678->5678/tcp
ollama                  running      0.0.0.0:11434->11434/tcp
qdrant                  running      0.0.0.0:6333->6333/tcp
postgres                running      5432/tcp

4. 拉一个本地模型

Ollama 启动后是空的,没有模型。进容器拉一个:

docker exec -it ollama ollama pull qwen2.5:7b

Qwen2.5 7B 大概 4.7GB,下载时间取决于网速。如果你在国内,可能需要挂代理或者用镜像源。

拉完验证一下:

docker exec -it ollama ollama list

能看到 qwen2.5:7b 就行。

5. 打开 n8n

浏览器访问 http://localhost:5678,第一次进去要注册一个管理员账号。注册完就能看到 n8n 的工作流编辑器了。

搭一个实际的 AI Agent 工作流

光装好不够,搭个能用的东西才算完。我做了一个"技术文章摘要 Bot":接收一个 URL,抓取文章内容,用本地大模型生成中文摘要。

工作流结构

Webhook 触发 → HTTP Request 抓网页 → HTML 提取正文 → AI Agent 生成摘要 → 返回结果

具体步骤:

第一步:添加 Webhook 节点

在 n8n 编辑器里点"+"号,搜索 Webhook,拖进来。配置: - HTTP Method: POST - Path: /summarize

这样你就有了一个接收请求的入口:http://localhost:5678/webhook/summarize

第二步:添加 HTTP Request 节点

连接到 Webhook 后面,配置: - Method: GET - URL: {{ $json.url }}(从 Webhook 的请求体里拿 URL) - Response Format: String

第三步:HTML Extract 节点

n8n 内置了 HTML Extract 节点,可以从 HTML 里提取文本: - Source Data: 上一步的 body - Extraction Values: - Key: content - CSS Selector: article, .post-content, .article-content, main - Return Value: Text

这一步会把网页里的文章正文提取出来,去掉导航栏、侧边栏、广告这些东西。

第四步:AI Agent 节点

这是整个工作流的核心。n8n 有专门的 AI Agent 节点:

  1. 搜索 "AI Agent",拖进来
  2. 在 Agent 配置里:
  3. Chat Model: 点击添加,选 Ollama Chat Model
  4. Model: qwen2.5:7b
  5. Base URL: http://ollama:11434(容器内通信用服务名)

  6. System Prompt 写:

你是一个技术文章摘要助手。用户会给你一篇文章的正文内容,你需要:
1. 用中文输出 200 字以内的摘要
2. 提取 3-5 个关键技术点
3. 给出一句话评价

输出格式:
【摘要】...
【关键技术点】...
【一句话评价】...
  1. Prompt 里引用上一步提取的内容:请为以下文章生成摘要:{{ $json.content }}

第五步:Respond to Webhook 节点

把 AI Agent 的输出返回给调用者: - Respond With: JSON - Response Body: {{ $json.output }}

测试一下

保存工作流并激活,然后用 curl 测试:

curl -X POST http://localhost:5678/webhook/summarize \
  -H "Content-Type: application/json" \
  -d '{"url": "https://blog.cloudflare.com/workers-ai-update-2025"}'

等个 10-30 秒(本地模型推理没有 GPU 加速的话会慢),你会收到一个 JSON 响应,包含文章的中文摘要。

踩坑记录

坑 1:Ollama 容器里找不到模型

我第一次部署的时候,重建容器后发现模型没了。原因是没做数据持久化。检查 docker-compose.yml 里有没有这行:

ollama:
  volumes:
    - ollama_data:/root/.ollama

如果用的是官方的 Starter Kit,这行已经有了。但如果你自己写的 docker-compose,别忘了加。

坑 2:n8n AI Agent 节点连不上 Ollama

报错 ECONNREFUSED。这是因为 n8n 容器里用 localhost:11434 访问不到 Ollama——它们是两个不同的容器。要用 Docker 服务名:http://ollama:11434

坑 3:内存不够模型被 Kill

跑 7B 模型至少要 8GB 可用内存。如果你的 Docker Desktop 默认只分了 4GB,改一下:

Docker Desktop → Settings → Resources → Memory,拉到 8GB 以上。

改完重启 Docker Desktop。

坑 4:中文输出乱码

部分模型默认走英文,中文输出质量不好或者出乱码。解决办法:

  1. 用对中文友好的模型,Qwen 系列最好
  2. System Prompt 明确写"用中文回答"
  3. 如果还不行,在 Ollama 里设置 OLLAMA_NUM_PARALLEL=1,避免并发推理时的编码问题

坑 5:Qdrant 写入向量失败

如果你做 RAG 工作流,往 Qdrant 写向量的时候报维度不匹配,检查两个地方:

  1. 创建 Collection 时指定的维度和 Embedding 模型的输出维度一致
  2. n8n 的 Embeddings 节点里选的模型和 Qdrant Collection 的维度对上

比如用 nomic-embed-text,输出维度是 768,建 Collection 时要设 size: 768

进阶玩法

基础跑通之后,几个方向可以继续折腾:

1. 换更好的模型

Ollama 支持的模型列表在 https://ollama.com/library ,根据你的硬件条件选:

# 拉更大的模型
docker exec -it ollama ollama pull llama3.1:70b  # 需要 40GB+ 内存
# 或者试试代码模型
docker exec -it ollama ollama pull deepseek-coder-v2:16b

2. 加 RAG 能力

n8n 有 Vector Store 节点,配合 Qdrant 可以做知识库问答:

  • 文档 → 分段 → Embedding → 写入 Qdrant
  • 用户提问 → Embedding → 从 Qdrant 检索相关段落 → 拼入 Prompt → 大模型回答

适合企业内部文档问答、产品手册查询这类场景。

3. 定时自动化

n8n 支持 Cron 触发器。比如每天早上 9 点自动抓取 Hacker News 前 10 条,用 AI 生成中文摘要,推到飞书群。不用写一行代码。

和云端 AI 方案比,本地方案怎么样

直说:本地方案的推理速度比不过云端 API。GPT-4o 和 Claude 3.5 的响应速度,本地 7B 模型追不上。

但本地方案有两个硬优势:

数据不出门。 企业内部文档、客户数据、财务数据,放云端 API 跑有合规风险。本地跑就没这个问题。

成本可控。 云端 API 按 token 计费,跑量大的任务(比如批量处理 1000 篇文章)费用上去了。本地方案除了电费和硬件折旧,没有额外开支。

如果你的场景对速度要求不高、但对数据安全和成本敏感,本地方案更合适。

几个数据

我在 M2 Pro MacBook 上实测的推理速度:

模型首 token 延迟生成速度
Qwen2.5:3b0.8 秒42 token/s
Qwen2.5:7b1.5 秒28 token/s
Llama3.1:8b1.8 秒25 token/s
Qwen2.5:14b3.2 秒14 token/s

生成一篇 200 字的摘要,7B 模型大约 8-12 秒。日常用够了。


整套东西装起来花了大约 2 小时(包括查文档和踩坑),Docker 启动本身就几分钟。如果你一直想试试本地 AI Agent 但觉得门槛高,这个 Starter Kit 是目前最低成本的入门方式。代码全开源,四个容器拉起来就能用。

仓库地址:https://github.com/n8n-io/self-hosted-ai-starter-kit

更多推荐