基于n8n与Ollama构建本地AI写作自动化流水线实战
1. 项目概述:为什么需要一个本地AI写作流水线
作为一名长期与技术文档和内容创作打交道的从业者,我每天都要处理大量的草稿撰写、邮件润色、代码注释生成和创意构思。过去,我依赖云端AI服务,但随之而来的延迟、隐私顾虑、API调用成本以及网络依赖,常常让我在关键时刻感到掣肘。尤其是在处理一些涉及内部项目细节或需要深度思考的连贯性内容时,我渴望一个完全在本地运行、响应迅速、且能根据我的工作流深度定制的AI助手。
这就是我构建这个本地AI写作流水线的初衷。它的核心很简单:利用 n8n 这个强大的开源工作流自动化工具作为“大脑”和“调度中心”,指挥部署在本地的 Ollama (一个运行大型语言模型的轻量级框架)作为“创作引擎”,将两者无缝衔接,形成一个从触发到生成再到后处理的自动化管道。这个管道彻底运行在我的笔记本电脑上,数据不出本地,响应在毫秒级,并且可以无限次调用,没有任何额外费用。
想象一下这样的场景:我在Obsidian里记下一个灵感关键词,n8n监听到文件变化,自动触发Ollama生成一段扩展论述,然后将结果整理并插入回我的笔记中;或者,我收到一封复杂的英文邮件,只需将其转发到一个特定邮箱,流水线就能自动解析邮件内容,调用本地模型生成回复草稿,并存入我的待发送文件夹。这一切都无需我手动打开任何AI聊天界面,完全在后台静默、高效地完成。这个项目不仅仅是技术栈的拼装,更是对个人生产力工具形态的一次深度重构,它让我从被动的“用户”变成了主动的“流程设计者”。
2. 核心工具选型与架构设计
2.1 为什么是 n8n + Ollama?
在开始动手之前,工具的选择决定了项目的上限和实现的复杂度。我评估了多个方案,最终锁定 n8n 和 Ollama 这个组合,原因如下:
n8n 作为流程中枢的优势:
- 可视化与灵活性 :n8n 的节点式工作流编辑器让我能以“搭积木”的方式设计复杂逻辑,无需编写大量胶水代码。这对于需要频繁调整触发条件、数据处理步骤的自动化场景至关重要。
- 强大的集成能力 :它内置了数百个节点,可以轻松连接本地文件系统、Webhook、电子邮件(IMAP/SMTP)、数据库、API等。这意味着我的AI流水线可以轻松地从任何地方获取输入,并将输出发送到任何地方。
- 开源与自托管 :n8n 可以完全免费地自托管,所有工作流和数据都掌握在自己手中,满足了项目最核心的隐私和安全需求。
- 调度与错误处理 :n8n 提供了完善的定时调度、错误重试、日志记录功能,能确保我的自动化流程稳定可靠地7x24小时运行。
Ollama 作为本地AI引擎的优势:
- 极简的本地模型运行 :Ollama 抽象了底层复杂的模型加载和推理过程,通过简单的命令行就能拉取和运行各种开源模型(如 Llama 2、Mistral、CodeLlama 等)。它自动处理GPU/CPU资源分配,让本地运行大模型变得像安装一个普通软件一样简单。
- 高效的API接口 :Ollama 提供了一个类 OpenAI 格式的 REST API(
/api/generate和/api/chat)。这意味着任何能调用 OpenAI API 的工具,经过微小的适配,就能直接调用我本地的模型。这大大降低了集成难度。 - 模型管理便捷 :使用
ollama pull和ollama run命令可以轻松切换不同的模型,方便我根据任务需求(是创意写作还是代码生成)选择最合适的“大脑”。
整体架构设计: 整个流水线的架构清晰且松耦合:
[触发源] -> [n8n 工作流] -> [Ollama API] -> [n8n 数据处理] -> [输出目的地]
- 触发源 :可以是定时器、文件夹文件变化、收到的邮件、Webhook调用等。
- n8n 工作流 :负责接收触发,准备请求数据(构造Prompt),调用 Ollama API,解析返回结果,并进行后续处理(如格式化、存储、转发)。
- Ollama API :本地运行的模型服务,接收Prompt并返回生成的文本。
- 输出目的地 :可以是本地文件、剪贴板、邮件、另一个API等。
这种设计使得每个部分都可以独立升级或替换。例如,未来如果有了更高效的本地模型服务,我只需更换 n8n 中调用 API 的那个节点即可。
2.2 环境准备与初始配置
工欲善其事,必先利其器。以下是搭建整个环境的具体步骤和注意事项。
Ollama 的安装与模型部署:
- 安装 :直接从 Ollama 官网下载对应操作系统(Windows/macOS/Linux)的安装包,安装过程非常简单。对于 Linux,也可以通过一行脚本安装。
- 拉取模型 :这是最关键的一步,模型的选择直接影响生成质量和速度。考虑到本地运行的资源限制(我使用一台配备 Apple Silicon 的 MacBook Pro),我选择了在性能和效果上平衡较好的
llama3.2:3b和mistral:7b模型。# 在终端中执行 ollama pull llama3.2:3b ollama pull mistral:7b注意 :首次拉取模型需要较长时间,取决于你的网络速度和模型大小。
7b参数的模型大约需要 4-5GB 磁盘空间。请确保你的硬盘有足够空间。 - 运行模型服务 :默认情况下,运行
ollama run <模型名>会进入交互式聊天。但对于 n8n 调用,我们需要它作为后台服务运行。Ollama 安装后会自动在后台运行一个服务,监听11434端口。你可以通过ollama serve命令来启动或管理它。通过访问http://localhost:11434可以查看API文档。
n8n 的安装与配置:
- 安装 :同样,n8n 提供了多种安装方式。为了最大程度的控制,我选择了使用 Docker Compose 进行部署,这便于管理数据持久化和未来扩展。
运行# docker-compose.yml version: '3.8' services: n8n: image: n8nio/n8n container_name: n8n restart: unless-stopped ports: - "5678:5678" environment: - N8N_BASIC_AUTH_ACTIVE=true - N8N_BASIC_AUTH_USER=你的用户名 - N8N_BASIC_AUTH_PASSWORD=你的强密码 - N8N_HOST=localhost - N8N_PORT=5678 - N8N_PROTOCOL=http - WEBHOOK_URL=http://localhost:5678/ - N8N_METRICS=false volumes: - ./n8n_data:/home/node/.n8ndocker-compose up -d即可启动。然后通过浏览器访问http://localhost:5678并用设置的用户名密码登录。 - 关键配置 :
- 安全 :务必如上例所示启用基础认证,否则你的自动化工作流和敏感数据将暴露在公网上。
- 存储 :通过 Docker 卷将
~/.n8n目录挂载到本地,确保工作流配置、执行历史等数据不会丢失。 - Webhook URL :确保
WEBHOOK_URL设置正确,这是外部服务触发 n8n 工作流的回调地址。
3. 构建核心工作流:从触发到生成
3.1 设计第一个工作流:文件监听与自动续写
我的第一个实战工作流,目标是实现一个“灵感孵化器”。当我在指定的 Markdown 文件中写入一个标题或几个关键词时,工作流能自动调用本地 AI 为我生成一段详细的段落。
步骤拆解:
-
触发节点 - “文件系统(Watch)”节点 :
- 我将其配置为监视我的
~/Documents/Brainstorm/目录下的.md文件。 - 关键参数是“事件”,我选择
fileAdded和fileUpdated。这样无论是新建文件还是修改已有文件,都能触发。 - 实操心得 :n8n 的文件监听在某些系统上可能有延迟。对于对实时性要求极高的场景,可以考虑使用“定时器”节点轮询,或者用更底层的文件系统监控工具(如
inotifywait)触发 Webhook。
- 我将其配置为监视我的
-
数据处理节点 - “Function” 或 “Set” 节点 :
- 触发节点会传递文件路径和内容。我需要从中提取出需要续写的文本。
- 我使用一个 Function 节点 (用 JavaScript 编写简单逻辑)来读取文件内容,并判断是否包含特定的触发标记,比如
<!-- AI_EXPAND -->。只有包含该标记的内容才会被发送给 AI。
// Function 节点示例代码 const fs = require('fs'); const filePath = items[0].json.filePath; let content = fs.readFileSync(filePath, 'utf8'); // 检查触发标记 if (content.includes('<!-- AI_EXPAND -->')) { // 提取标记后的内容作为Prompt,或者使用最后一段 const lines = content.split('\n'); const prompt = lines[lines.length - 2]; // 假设最后一行是触发标记,倒数第二行是提示 return [{ json: { prompt, originalFilePath: filePath } }]; } // 如果不包含标记,返回空数组,工作流终止 return [];- 注意事项 :Function 节点功能强大,但要小心处理异常。确保文件读取可能失败的情况,否则整个工作流会报错停止。可以在节点设置中开启“永不报错”选项,并在代码中使用 try-catch。
-
AI 调用节点 - “HTTP Request” 节点 :
- 这是连接 Ollama 的核心。配置如下:
- Method :
POST - URL :
http://host.docker.internal:11434/api/generate关键点 :因为 n8n 运行在 Docker 容器内,要访问宿主机的服务,不能使用
localhost,而应使用 Docker 的特殊域名host.docker.internal(Mac/Windows)。Linux 下可能需要使用宿主机的真实 IP 或配置为host网络模式。 - Headers :
Content-Type: application/json - Body (JSON) :
{ "model": "llama3.2:3b", "prompt": "{{$json.prompt}}", "stream": false, "options": { "temperature": 0.7, "top_p": 0.9, "num_predict": 500 } }
- Method :
- 参数详解 :
model: 指定要使用的本地模型名称。prompt: 从上一个节点传来的文本。精心设计 Prompt 是效果好坏的关键。例如,我会使用“你是一位技术作家,请将以下核心观点扩展成一段流畅的论述:{{$json.prompt}}”。stream: 设为false让 Ollama 一次性返回全部结果,便于处理。options: 控制生成质量的核心。temperature(0-1):控制随机性。0.7 是一个平衡值,既有创意又不至于胡言乱语。写技术文档可以调低(如0.3),写创意文案可以调高(如0.9)。num_predict: 最大生成token数,控制生成长度。
- 这是连接 Ollama 的核心。配置如下:
-
结果处理与回写节点 :
- HTTP 请求节点会返回一个 JSON 响应,其中
response字段就是生成的文本。 - 我使用另一个 Function 节点 来格式化这个结果,比如加上分隔线和时间戳,然后将其追加到原始 Markdown 文件的末尾。
const fs = require('fs'); const aiResponse = items[0].json.response; const filePath = items[0].json.originalFilePath; const appendContent = `\n\n---\n**AI 续写 (${new Date().toLocaleString()})**:\n${aiResponse}\n---\n`; fs.appendFileSync(filePath, appendContent); return items; // 将数据传递给下一个节点(如通知节点)- 最后,我可以接一个 “Email” 节点 或 “Telegram” 节点 ,当续写完成时给我发送一个通知。
- HTTP 请求节点会返回一个 JSON 响应,其中
3.2 进阶工作流:邮件自动回复助手
第二个工作流更复杂一些,旨在自动化处理一些常见的咨询邮件。我使用 n8n 的 “Email Trigger (IMAP)” 节点来监听我的某个子邮箱。
-
触发与过滤 :
- 配置 IMAP 节点连接我的邮箱,设置为每隔5分钟检查一次。
- 在节点后接一个 “Filter” 节点 ,只允许发件人为特定地址(如
support-query@mycompany.com)或主题包含“【咨询】”的邮件通过。这避免了所有邮件都触发AI,造成资源浪费和误回复。
-
内容提取与Prompt工程 :
- 使用 “Function” 节点 从邮件中提取主题和正文。需要小心处理HTML邮件,可能需要使用
cheerio库来提取纯文本。 - 构造一个强大的系统Prompt是成功的关键。例如:
你是我公司的技术支持助手。请根据以下用户邮件内容,撰写一封友好、专业、简洁的回复草稿。 回复要求: 1. 感谢用户的来信。 2. 概括用户的核心问题。 3. 提供初步的解决方案或告知后续处理步骤。 4. 语气亲切但保持专业。 用户邮件主题:{{$json.subject}} 用户邮件内容:{{$json.body}} 请直接生成回复邮件的正文: - 使用 “Function” 节点 从邮件中提取主题和正文。需要小心处理HTML邮件,可能需要使用
-
并行调用与择优选择 :
- 为了提升回复质量,我有时会使用 “Split In Batches” 节点 将同一个 Prompt 同时发送给两个不同的模型(如
llama3.2:3b和mistral:7b)。 - 然后使用一个 “Function” 节点 对两个回复进行简单评分或合并,选择更好的一个。例如,可以计算回复的长度(避免过短)、检查是否包含了“感谢”和“解决方案”等关键词。
- 为了提升回复质量,我有时会使用 “Split In Batches” 节点 将同一个 Prompt 同时发送给两个不同的模型(如
-
草稿保存与人工审核 :
- 生成的回复草稿 绝不 直接发送。我配置工作流将草稿保存到 Google Docs 或 Notion 的一个特定数据库,并标记为“待审核”。
- 我每天会花几分钟时间审核这些草稿,稍作修改后发送。这实现了“AI初稿 + 人工精修”的高效模式,既利用了AI的速度,又保证了沟通的质量和可控性。
4. 性能调优、错误处理与安全考量
4.1 提升流水线的响应速度与稳定性
当工作流变得复杂和频繁时,性能与稳定性成为焦点。
Ollama 侧优化:
- 模型选择 :对于实时性要求高的任务(如聊天辅助),使用参数量更小的模型(如
llama3.2:3b或phi3:mini),它们生成速度更快。对于质量要求高的离线任务(如报告生成),再使用更大的模型。 - 参数调整 :减少
num_predict可以显著缩短生成时间。对于续写任务,256-512个token通常足够。将temperature调低也能让模型更快地选择高概率词,减少“思考”时间。 - GPU加速 :如果你的机器有 NVIDIA GPU,确保 Ollama 使用了 GPU 推理。运行
ollama run llama3.2:3b时,观察输出日志是否显示“using GPU”。在 Linux 上,可能需要安装nvidia-container-toolkit并确保 Docker 能访问 GPU。 - 模型常驻内存 :默认情况下,Ollama 会在模型闲置一段时间后卸载它。对于高频使用的流水线,可以在启动 Ollama 服务时,预先用
ollama run加载模型,使其常驻内存,避免每次调用的冷启动开销。
n8n 侧优化:
- 工作流设计 :
- 避免同步长耗时操作 :如果AI生成需要10秒,不要让HTTP Request节点同步等待。可以考虑使用 n8n 的“等待”节点或外部队列(如 Redis)实现异步调用,防止工作流执行线程被阻塞。
- 启用缓存 :对于相同或相似的Prompt,可以使用 n8n 的“缓存”节点存储结果,在一定时间内直接返回缓存,避免重复调用模型。
- 执行模式 :在 n8n 设置中,可以调整“执行进程”的数量。对于I/O密集型(如网络请求)的工作流,可以适当增加进程数。但要注意,过多的并发请求可能会压垮本地的 Ollama 服务。
4.2 构建健壮的错误处理机制
自动化流程必须能妥善处理失败,否则一个小错误可能导致整个流水线瘫痪。
- HTTP Request 节点的重试机制 :
- 在调用 Ollama 的 HTTP Request 节点设置中,配置“重试次数”(如3次)和“重试间隔”。网络抖动或模型加载可能导致临时失败。
- 错误分支路由 :
- 使用 n8n 的 “IF” 节点 或 “Split” 节点 检查上一个节点的执行状态。例如,在 HTTP Request 节点后,检查
$json.error是否存在。 - 如果发生错误,将流程路由到一个专门的处理分支。这个分支可以:
- 记录错误详情到日志文件或数据库。
- 发送警报通知(如 Telegram、Slack)给我。
- 尝试降级方案(例如,调用另一个更轻量级的模型,或返回一个预定义的默认回复)。
- 使用 n8n 的 “IF” 节点 或 “Split” 节点 检查上一个节点的执行状态。例如,在 HTTP Request 节点后,检查
- 数据验证与清理 :
- 在将用户输入(如邮件正文)发送给 AI 前,使用 “Function” 节点 进行清洗和验证,去除过长的内容、恶意代码片段或敏感信息(虽然本地运行,但好习惯要保持)。
- 对 AI 返回的内容也进行基础检查,比如是否为空、是否包含不安全的标记语言等。
4.3 隐私与安全实践
尽管是本地运行,安全思维同样重要。
- 网络隔离 :
- 确保 n8n 和 Ollama 的服务(默认端口 5678 和 11434) 不暴露在公网 。检查路由器设置,确保没有端口转发。在云服务器上部署时,务必配置防火墙(如
ufw)或安全组,只允许本地访问。
- 确保 n8n 和 Ollama 的服务(默认端口 5678 和 11434) 不暴露在公网 。检查路由器设置,确保没有端口转发。在云服务器上部署时,务必配置防火墙(如
- 认证与授权 :
- n8n 必须启用强密码认证,如前文所述。
- Ollama 默认没有认证。虽然它在本地,但如果机器上有其他不受信任的用户或应用,可以考虑通过反向代理(如 Nginx)为 Ollama 的 API 添加基本的 HTTP 认证。
- 数据最小化 :
- 工作流中处理的所有数据(邮件、文件内容)只在内存和日志中短暂存在。我配置 n8n 定期清理执行历史日志。
- 避免在 Prompt 中嵌入高度敏感的个人信息(如身份证号、密码)。虽然数据不出本地,但良好的数据习惯是通用的。
- 模型安全 :
- 从官方渠道(Ollama 库)拉取模型,避免使用来源不明的模型文件,以防后门或恶意代码。
5. 扩展场景与实用技巧
5.1 更多创意应用场景
这个本地AI流水线的范式可以扩展到无数场景:
- 会议纪要整理 :录制会议音频 -> 语音转文本(可用本地Whisper模型) -> n8n获取文本 -> 调用Ollama生成摘要和待办事项 -> 存入Notion或日历。
- 社交媒体内容日历 :n8n定时触发器 -> 调用Ollama根据关键词生成一周的推文或小红书草稿 -> 批量保存到Google Sheets,供我每周审核发布。
- 代码审查助手 :Git Webhook 监听 push 事件 -> n8n 获取diff代码 -> 调用 CodeLlama 模型生成审查意见 -> 将意见发布到GitHub评论或发送给开发者。
- 个人知识库问答 :将我的个人笔记(Markdown文件)通过 embedding 模型向量化后存入本地向量数据库(如Chroma)。n8n 接收我的自然语言问题 -> 检索相关笔记片段 -> 组合成Prompt让Ollama生成答案。
5.2 提升AI生成质量的Prompt技巧
本地小模型的能力相对有限,好的Prompt能极大提升输出质量。
- 角色扮演 :明确告诉AI它应该扮演的角色。“你是一位经验丰富的科技专栏编辑,擅长用生动的比喻解释复杂概念。”
- 结构化输出 :要求AI按特定格式输出,便于后续自动化处理。“请用JSON格式输出,包含‘summary’、‘key_points’(数组)、‘action_items’(数组)三个字段。”
- 分步思考 :对于复杂任务,引导AI一步步思考。“首先,分析这个问题涉及的核心技术点。其次,列举可能的解决方案。最后,给出你的推荐并说明理由。”
- 提供示例 :在Prompt中给出一两个输入输出的例子(Few-shot Learning),能快速让模型理解你的需求。
- 迭代优化 :不要期望一次成功。将 n8n 工作流设计成“生成-评估-再生成”的循环。第一个节点生成初稿,第二个节点(可以是另一个AI调用或规则判断)评估质量,如果不够好,就修改Prompt重新生成。
5.3 监控与维护
一个稳定的自动化系统需要简单的监控。
- n8n 内置监控 :n8n 的“执行列表”页面可以查看所有工作流的运行状态、成功/失败次数和耗时。定期检查失败的执行,分析错误原因。
- 简易健康检查 :可以创建一个独立的工作流,定时(如每小时一次)调用 Ollama 的
/api/tags接口检查模型是否可用,如果失败则发送警报。 - 资源监控 :使用
htop、docker stats等工具监控 CPU、内存和 GPU 的使用情况。如果发现 Ollama 内存占用过高,可能是内存泄漏,需要重启服务。 - 日志聚合 :将 n8n 和 Ollama 的日志导入到本地的一个轻量级日志系统(如
lnav查看多个日志文件,或使用vector收集),方便问题排查。
构建这个本地AI流水线,最大的收获不是技术本身,而是获得了一种“造物主”般的掌控感。我不再受制于外部服务的限速、审查或费用,可以随心所欲地设计AI如何融入我的工作流。它就像在我的电脑里安装了一个不知疲倦、知识渊博且完全忠诚的助手。从最初的简单文件续写,到如今覆盖邮件、代码、创意的多个自动化场景,这个系统在不断进化。过程中最深的体会是: 最好的工具不是功能最多的,而是最能贴合你独特习惯和思维模式的。 通过 n8n 的可视化编排,我能够将模糊的想法快速转化为可运行的逻辑;而 Ollama 则让强大的模型能力变得触手可及。如果你也厌倦了在多个网页和应用间切换,不妨尝试搭建属于自己的本地AI流水线,这可能是提升数字生活自主权和生产力的关键一步。
更多推荐


所有评论(0)