用Docker搭一套本地AI Agent工作流:n8n+Ollama+Qdrant实操记录
想让 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 |
| CPU | 4 核 | M2 Pro 12 核 |
| GPU | 非必须,有更好 | M2 集成 GPU |
| Docker | Docker Desktop 或 Docker Engine | Docker 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 节点:
- 搜索 "AI Agent",拖进来
- 在 Agent 配置里:
- Chat Model: 点击添加,选 Ollama Chat Model
- Model:
qwen2.5:7b -
Base URL:
http://ollama:11434(容器内通信用服务名) -
System Prompt 写:
你是一个技术文章摘要助手。用户会给你一篇文章的正文内容,你需要:
1. 用中文输出 200 字以内的摘要
2. 提取 3-5 个关键技术点
3. 给出一句话评价
输出格式:
【摘要】...
【关键技术点】...
【一句话评价】...
- 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:中文输出乱码
部分模型默认走英文,中文输出质量不好或者出乱码。解决办法:
- 用对中文友好的模型,Qwen 系列最好
- System Prompt 明确写"用中文回答"
- 如果还不行,在 Ollama 里设置
OLLAMA_NUM_PARALLEL=1,避免并发推理时的编码问题
坑 5:Qdrant 写入向量失败
如果你做 RAG 工作流,往 Qdrant 写向量的时候报维度不匹配,检查两个地方:
- 创建 Collection 时指定的维度和 Embedding 模型的输出维度一致
- 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:3b | 0.8 秒 | 42 token/s |
| Qwen2.5:7b | 1.5 秒 | 28 token/s |
| Llama3.1:8b | 1.8 秒 | 25 token/s |
| Qwen2.5:14b | 3.2 秒 | 14 token/s |
生成一篇 200 字的摘要,7B 模型大约 8-12 秒。日常用够了。
整套东西装起来花了大约 2 小时(包括查文档和踩坑),Docker 启动本身就几分钟。如果你一直想试试本地 AI Agent 但觉得门槛高,这个 Starter Kit 是目前最低成本的入门方式。代码全开源,四个容器拉起来就能用。
仓库地址:https://github.com/n8n-io/self-hosted-ai-starter-kit
更多推荐
所有评论(0)