1. 项目概述:为什么需要一个本地的AI写作流水线

作为一名长期与文字打交道的创作者,我每天都要处理大量的草稿撰写、内容润色和邮件沟通。过去,我依赖各种云端AI服务,它们确实强大,但问题也随之而来:一是成本,频繁调用API的账单积少成多;二是延迟,网络请求总有不稳定的时候;三是隐私,将未成形的想法和内部文档发送到第三方服务器,心里总有些不踏实。直到我发现了将 n8n Ollama 组合起来的可能性,一个念头变得清晰:是时候搭建一个完全在本地运行、自主可控的AI写作流水线了。

这个项目的核心,就是利用 n8n 这款强大的开源工作流自动化工具作为“大脑”和“调度中心”,指挥本地运行的 Ollama 大语言模型进行具体的文本生成任务。最终实现的效果是,我可以通过一个简单的触发方式(比如收到特定邮件、在笔记软件中新增一个条目,或者直接点击一个Webhook链接),自动启动一套预设的写作流程。例如,将一个粗略的要点列表扩展成结构完整的文章草稿,或者将一段生硬的技术描述改写成通俗易懂的博客语言。整个过程数据不出本地,响应速度极快,且完全免费(不考虑硬件电费)。这不仅仅是工具的替换,更是一种工作范式的转变,将AI从需要“主动拜访”的服务,变成了一个随时待命、按我规则行事的“数字助理”。

2. 技术栈选型与架构设计思路

2.1 为什么是 n8n + Ollama?

在决定技术栈时,我评估了几个关键维度:可控性、灵活性、易用性和生态。最终锁定 n8n 和 Ollama,是它们各自优势互补的结果。

Ollama 作为本地AI引擎 :它的核心价值在于简化了本地大语言模型的部署与管理。相比直接操作复杂的模型框架(如 llama.cpp 或 Text Generation WebUI),Ollama 通过简单的命令行工具和统一的API接口,让我可以像安装软件包一样轻松获取和运行各种开源模型(如 Llama 3、Mistral、Gemma 等)。它负责最重的计算负载——文本生成,并提供标准的 OpenAI API 兼容端点,这使得任何能调用 OpenAI 的工具都能无缝对接 Ollama,极大降低了集成复杂度。

n8n 作为自动化中枢 :如果说 Ollama 是“肌肉”,n8n 就是“神经”和“骨架”。它是一个基于节点的可视化工作流编辑器,每个节点代表一个操作(如读取文件、判断条件、发送HTTP请求等)。我需要的是将写作任务自动化、流程化,而不仅仅是有一个能对话的模型。n8n 允许我以拖拽的方式设计复杂的逻辑:例如,先触发流程,然后从我的笔记软件(如 Obsidian)中获取素材,接着调用 Ollama 进行扩写,再将结果格式化后发布到我的博客草稿库,并最后发送一条通知到 Telegram。这一切都可以在图形界面中完成,无需编写复杂的胶水代码,调试和修改也异常直观。

架构设计 :整体架构非常清晰。我的笔记本电脑(配备了一块消费级显卡)同时运行两个服务。Ollama 作为后台服务,在本地 11434 端口提供 API。n8n 则通过其内置的 “HTTP Request” 节点,向 http://localhost:11434/api/generate /api/chat 发送请求,与 Ollama 交互。数据流完全在本地回路中,不存在任何外部网络传输。这种设计也便于扩展,未来我可以将 Ollama 部署在家庭服务器上,n8n 通过局域网IP调用,实现计算资源的分离。

注意 :选择模型时需权衡能力与硬件。例如,参数量70亿的模型在16GB内存的电脑上尚可运行,但若想使用更大的模型(如 340亿参数),则需要更强的GPU显存支持。起步阶段建议从较小的模型开始,如 llama3.2:1b mistral:7b ,它们对硬件友好且响应速度更快。

2.2 备选方案与取舍

在搭建过程中,我也考虑过其他路径。比如,直接使用 LangChain 这类框架来编排流程,它功能强大但需要更多的代码开发,对于快速构建和迭代一个以“写作”为核心、逻辑相对固定的流水线来说,显得有些“重”了。而像 Zapier 或 Make 这样的云端自动化平台,虽然易用,但无法解决我的核心诉求——数据本地化和零持续成本。因此,n8n(可自托管) + Ollama(纯本地)的组合,在控制力、隐私保护和长期成本上达到了最佳平衡。

3. 环境准备与核心组件部署

3.1 Ollama 的安装与模型配置

Ollama 的安装过程简单到令人惊讶。根据你的操作系统,从官网下载安装包或使用一行脚本命令即可完成。安装后,你就可以在终端里与它交互了。

第一步:基础安装与验证 在 Linux/macOS 终端或 Windows PowerShell 中,安装后运行 ollama run llama3.2:1b 。这个命令会做两件事:如果本地没有 llama3.2:1b 这个模型,它会自动从镜像站下载;下载完成后,会进入一个交互式聊天界面。这证明 Ollama 服务已经成功运行在后台。

第二步:服务化与API访问 默认情况下, ollama run 是以交互模式运行一个模型。但对于自动化流水线,我们需要它作为常驻服务。更常用的方式是直接启动 Ollama 服务(安装程序通常已将其设置为系统服务),然后通过其 REST API 来调用。服务启动后,你可以在浏览器中访问 http://localhost:11434 ,会看到一个简单的 Ollama 版本信息页,这证明 API 服务正在运行。

第三步:关键模型管理 Ollama 的核心命令非常直观:

  • ollama list :查看本地已下载的模型列表。
  • ollama pull <model-name> :拉取新模型,如 ollama pull mistral:7b
  • ollama run <model-name> :运行指定模型并进入交互模式。
  • ollama rm <model-name> :删除本地模型。

对于写作流水线,我推荐从 llama3.2:3b mistral:7b 开始。它们在语言理解、指令跟随和创造性写作上取得了很好的平衡,并且对硬件要求适中。你可以根据任务类型准备多个模型,比如一个小模型用于快速的头脑风暴和摘要,一个大模型用于重要的稿件润色。

3.2 n8n 的本地部署与基础配置

n8n 提供了多种部署方式,包括 Docker、npm 和直接可执行文件。为了最大化控制权和简化依赖,我选择了使用其提供的独立可执行文件(n8n binary)。

部署步骤:

  1. 从 n8n 官方 GitHub Release 页面下载对应你操作系统的最新版本可执行文件。
  2. 将其放在一个专门的目录下,例如 ~/n8n
  3. 在终端中导航到该目录,运行 ./n8n (Linux/macOS)或 n8n.exe (Windows)。首次运行会完成初始化。
  4. 根据终端输出的信息,通常是在浏览器中打开 http://localhost:5678 ,即可进入 n8n 的 Web 编辑器界面。

初始安全设置: 首次访问,n8n 会要求你创建一个管理员用户。请务必使用强密码。为了开发方便,你可以在启动命令中设置环境变量来跳过某些安全检查,但对于长期运行的服务,建议配置好加密密钥、数据库(默认使用 SQLite,生产环境可换 PostgreSQL)和反向代理(如 Nginx)以启用 HTTPS。

一个重要的目录结构习惯 :我习惯在 n8n 目录下创建子文件夹,如 workflows/ 用于存放导出的工作流 JSON 文件, credentials/ (注意安全)用于记录一些配置心得。这样便于备份和迁移。

4. 构建核心写作自动化工作流

4.1 工作流设计蓝图与触发机制

我的核心写作流水线目标明确:将“灵感输入”自动转化为“结构化草稿”。为此,我设计了如下触发场景:

  1. 剪贴板触发 :当我复制了一段文本(可能是一个想法、一个链接或一段引用),运行一个快捷键脚本,将内容发送到 n8n 的 Webhook。
  2. 笔记软件触发 :我在 Obsidian 中创建一个以“草稿:”开头的笔记,n8n 通过定时扫描或 Obsidian 的插件(如 obsidian-advanced-uri )触发流程。
  3. 邮件触发 :我向一个特定邮箱发送一封邮件,邮件内容作为写作指令。

这里以最通用的 Webhook 触发 为例进行构建。在 n8n 中,Webhook 节点是一个完美的起点,它提供一个唯一的 URL,当向这个 URL 发送 HTTP 请求(携带数据)时,工作流就会被触发。

实操步骤:

  1. 在 n8n 编辑器中,从节点库中拖入一个 Webhook 节点。
  2. 点击节点配置,选择 “Webhook” 类型为 “POST”。保存节点后,n8n 会生成一个类似 https://your-n8n-domain.com/webhook/unique-id 的 URL。在本地测试时,这个地址就是 http://localhost:5678/webhook/unique-id
  3. 这个 URL 就是流水线的“入口”。任何能发送 HTTP POST 请求的工具(如 curl、浏览器插件、Python 脚本、Alfred 工作流)都可以触发它。

4.2 与 Ollama 的集成:HTTP Request 节点详解

这是整个工作流的核心技术环节。我们需要让 n8n 与本地运行的 Ollama API 进行对话。

配置 HTTP Request 节点:

  1. 在 Webhook 节点后,添加一个 HTTP Request 节点。
  2. 方法 :选择 “POST”。
  3. URL :填写 Ollama 的生成接口 http://localhost:11434/api/generate 。如果你需要多轮对话上下文,可以使用 /api/chat 接口。
  4. Headers :添加一个 Content-Type 头,值为 application/json
  5. Body Parameters :选择 “JSON”,这是最关键的部分。你需要构造一个符合 Ollama API 格式的 JSON 请求体。

一个最基础的请求体如下:

{
  "model": "llama3.2:3b",
  "prompt": "{{$json.body.prompt}}",
  "stream": false
}
  • model : 指定你要使用的本地模型名称,必须与 ollama list 中的一致。
  • prompt : 这是给模型的指令。 {{$json.body.prompt}} 是 n8n 的表达式,表示从上游 Webhook 节点传来的 JSON 数据中,提取 body 对象下的 prompt 字段。这意味着触发 Webhook 时,POST 的数据需要包含 {"prompt": "你的写作指令"}
  • stream : 设为 false 让 Ollama 一次性返回完整结果,更适合自动化处理。设为 true 则会流式传输,适用于需要实时显示的场景。

高级参数配置 : 为了获得更稳定、更符合预期的输出,我通常会调整更多参数:

{
  "model": "mistral:7b",
  "prompt": "你是一位专业的科技博客作者。请将以下要点扩展成一篇博客的开头段落:\n{{$json.body.key_points}}",
  "stream": false,
  "options": {
    "temperature": 0.7,
    "top_p": 0.9,
    "num_predict": 512
  }
}
  • temperature (温度):控制输出的随机性。值越低(如0.2),输出越确定、保守;值越高(如0.8),输出越有创造性、不可预测。对于技术性写作,我通常设在 0.5-0.7 之间。
  • top_p (核采样):与温度配合,控制从概率分布中选词的范围。0.9 是一个常用值。
  • num_predict :生成的最大令牌数,控制输出长度。512 对于一段落或简短草稿通常足够。

实操心得 prompt 工程是成败关键。给模型清晰的角色设定、具体的任务描述和格式要求,能极大提升输出质量。例如,明确写出“以列表形式输出”、“用口语化的风格”、“字数控制在300字以内”。把这些要求都放在 prompt 里。

4.3 数据处理与输出编排

Ollama 节点返回的结果需要被提取和处理。HTTP Request 节点成功后会输出一个 JSON,其中包含 response 字段,里面就是模型生成的文本。

  1. 添加 Function 节点或 Set 节点 :在 HTTP Request 节点后,我通常会加一个 Function 节点(用 JavaScript 代码处理数据)或 Set 节点(更直观地映射字段)来清洗数据。
  2. 提取内容 :在 Function 节点中,代码可能很简单:
    const rawResponse = $input.first().json;
    // Ollama API返回的结构是 { model: ‘...‘, response: ‘...‘ }
    const draftContent = rawResponse.response;
    // 你可以在这里进行进一步处理,比如去除多余空行,添加特定标记
    const cleanedContent = draftContent.trim();
    return { draft: cleanedContent };
    
  3. 多路输出与分支逻辑 :利用 n8n 的 IF 节点,可以根据内容质量或主题进行分支。例如,判断生成的草稿是否包含某个关键词,如果包含,则走一条路径(如保存到技术博客草稿文件夹),否则走另一条路径(如保存到个人随笔文件夹)。
  4. 结果落地 :最后,将处理好的文本发送到目的地。常用的节点包括:
    • Write to File 节点:直接写入本地磁盘的指定文件。
    • Email Send 节点:将草稿作为邮件正文发送给自己审核。
    • Telegram 节点:将摘要发送到 Telegram 机器人,实现手机端即时通知。
    • Webhook 节点(作为发送方):将结果回调到另一个系统,比如我的笔记软件或内容管理系统。

5. 实战案例:从想法到博客草稿的全自动流水线

让我用一个完整的工作流实例,展示如何将零散的想法自动转化为一篇博客草稿。

场景 :我在阅读时,用笔记软件记录了几个关于“如何提高命令行效率”的要点。我希望通过一个快捷键,自动将这些要点扩展成一篇博客的引言部分,并保存到指定位置。

工作流步骤分解:

  1. 触发 :我在笔记软件中选中要点文本,按下预设快捷键(通过 Alfred/Keyboard Maestro/AutoHotkey 实现)。脚本执行,将选中的文本作为 {“key_points”: “选中的文本”} ,POST 到 n8n 的 Webhook URL。
  2. n8n 工作流内部
    • Webhook 节点 :接收数据。
    • Set 节点 :我在这里构造一个更精细的 prompt 。表达式如下:
      角色:你是一位经验丰富的软件开发者和技术博主。
      任务:将用户提供的核心要点,扩展成一个吸引人、有洞察力的博客文章开头段落。段落应自然引出主题,激发读者兴趣。
      要点:
      {{$json.body.key_points}}
      
      要求:
      1. 风格:专业但亲切,避免过于学术化。
      2. 字数:大约200-300字。
      3. 输出:只输出扩展后的段落,不要有任何额外的解释或标记。
      
    • HTTP Request 节点 :调用 Ollama ( mistral:7b ),使用上述构造的 prompt temperature=0.65
    • Function 节点 :提取 response ,并添加元数据,如生成日期、使用的模型。
      const ollamaResult = $input.first().json;
      const finalDraft = `# 草稿生成于 ${new Date().toLocaleString()}
      使用模型:${ollamaResult.model}
      
      ${ollamaResult.response.trim()}
      `;
      return { finalDraft };
      
    • Write to File 节点 :将 finalDraft 写入我的博客项目目录下的 drafts/ 文件夹,文件名按日期时间自动生成,如 cmd-efficiency-draft-20240515.md
    • Telegram 节点 :同时,将生成完成的提示和博客标题(可以从要点中提取)发送到我的 Telegram,让我第一时间知晓。

整个过程从触发到收到通知,在本地环境下通常只需 5-15 秒,视模型大小和生成长度而定。我无需打开任何AI聊天界面,也无需复制粘贴,想法直接变成了结构化的草稿文件。

6. 性能调优、错误处理与安全考量

6.1 提升流水线的稳定性和效率

并发与队列 :默认情况下,n8n 的工作流执行是同步的。如果上一个 Ollama 请求还在处理(生成文本可能需要数十秒),下一个触发请求会被阻塞。对于写作辅助,这通常可以接受。但如果想并行处理多个简单任务,可以在 n8n 的配置文件中调整 execution.process 相关的并发设置。更常见的做法是,对于非紧急任务,可以利用 n8n 的“队列”功能,让工作流按顺序处理,避免本地 GPU 内存过载。

Ollama 模型加载策略 :Ollama 默认在收到第一个请求时加载模型,这会导致首次请求延迟很高(几十秒)。对于经常使用的写作流水线,我建议在服务器启动后,预先运行 ollama run <model-name> 一次,让模型常驻内存。虽然这会占用资源,但换来了后续每次请求的极速响应(通常在1-3秒内)。

Prompt 缓存 :对于某些固定格式的写作任务(如周报生成、邮件模板填充),其 prompt 主体部分是固定的,只有变量部分变化。我通常在 n8n 中使用 Set 节点来组合固定模板和动态变量,而不是每次从头构造整个 prompt 字符串。

6.2 错误处理与日志记录

自动化流程必须健壮,能够妥善处理失败。

  1. HTTP Request 节点的重试与超时 :在 HTTP Request 节点配置中,务必设置合理的“超时时间”(例如 120000 毫秒,即2分钟),因为大模型生成长文本可能较慢。同时,可以启用“重试”功能,设置重试次数和重试间隔,以应对 Ollama 服务偶尔的波动。
  2. 错误处理分支 :使用 IF 节点判断 HTTP Request 节点的执行状态。在 n8n 中,节点连接线有“成功”(绿色)和“错误”(红色)之分。将红色的错误线连接到一个新的分支,这个分支可以:
    • 发送错误告警(通过 Email 或 Telegram 节点)。
    • 将失败的请求参数和错误信息记录到一个文件或数据库中,便于事后分析。
    • 尝试降级方案,例如换用另一个更小、更快的模型重新请求。
  3. 结构化日志 :在关键节点后添加 Set 节点,将时间戳、节点名、关键数据(如 prompt 的前50个字符)写入一个上下文变量。在工作流末尾,用一个 Write to File 节点将这些日志信息以 JSON 格式追加到日志文件中。这比查看 n8n 的界面执行历史更便于脚本分析和长期追踪。

6.3 本地环境下的安全实践

尽管数据不出本地,但安全习惯仍需保持。

  1. n8n 访问控制 :切勿将运行 n8n 的服务器(即使是本机)直接暴露在公网而不设密码。务必使用强密码,并考虑配置 Nginx 反向代理,启用 HTTPS(使用自签名证书或 Let‘s Encrypt 的证书)。如果只在本地使用,绑定到 127.0.0.1 而不是 0.0.0.0
  2. Webhook 安全性 :Webhook URL 如果泄露,任何人都可以触发你的工作流。n8n 的 Webhook 节点支持设置“认证”方式,如添加 Header 认证(设置一个密钥)或 Query 认证(在 URL 中加入令牌)。在触发脚本中携带这个密钥,可以防止未授权调用。
  3. 模型安全 :仅从 Ollama 官方库或信任的来源拉取模型。模型文件本质上是程序,恶意模型可能带来风险。定期更新 Ollama 和模型版本,以获取安全修复和改进。
  4. 工作流备份 :定期通过 n8n 的界面导出你的工作流 JSON 文件,并存储在安全的地方(如加密的云盘或版本控制系统如 Git)。这些工作流包含了你的核心自动化逻辑,是宝贵的数字资产。

7. 进阶应用与扩展思路

基础写作流水线搭建完成后,你可以探索更多可能性,让它真正成为你的创作副脑。

多模型协作流水线 :不是所有任务都需要同一个模型。你可以设计这样的工作流:先用一个快速的小模型(如 tinyllama )对输入进行理解和任务分类;如果是创意写作,则路由到 mixtral 这样的混合专家模型;如果是代码生成,则路由到 codellama ;最后,再用一个专门的模型进行语法和风格检查。在 n8n 中,这可以通过多个并行的 HTTP Request 节点或条件路由来实现。

与知识库结合(RAG) :单纯的生成模型缺乏你的个人知识和历史文档信息。你可以引入一个本地向量数据库(如 Chroma、LanceDB 或 Qdrant)。工作流可以这样设计:首先,将你的个人笔记、过往博客、收藏的文章进行嵌入(embedding)并存入向量库。当触发写作任务时,先根据 prompt 从向量库中检索最相关的几条知识片段,然后将这些片段作为上下文和 prompt 一起发送给 Ollama。这样生成的草稿就更具个人特色,也更准确。

复杂内容的结构化生成 :对于技术教程、产品评测等有固定结构的内容,可以设计多步生成流水线。第一步,根据主题生成大纲(使用一个专门优化用于生成大纲的 prompt )。第二步,将大纲的每个部分拆解,并发或顺序地让模型生成详细内容。第三步,用一个“编辑”节点将所有部分组合,并统一润色风格。n8n 的循环和分支功能非常适合编排这种多阶段任务。

反馈闭环与迭代优化 :将生成的内容保存后,可以添加一个“人工审核”环节。例如,将草稿发送到 Telegram 时,附带两个内联按钮:“👍 采用”和“👎 重写”。点击按钮会触发另一个 Webhook,携带草稿 ID 和评价结果回到 n8n。n8n 可以记录这些反馈,用于未来调整对应主题的 prompt 或模型参数,实现流水线的自我优化。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐