N8n!AI工作流自动化平台

第 1 节 概述

n8n 是一个非常强大的开源 AI 工作流自动化平台,能够通过拖拽的方式,让各个 AI 工具相互配合,构建复杂的自动化流程,高效处理我们日常遇到的问题。

与 n8n 相关的网址包括:n8n 的官网官方文档Github 页面

第 2 节 软件部署

部署方式包括 Node 部署和 Docker 部署两种,因为 n8n 主要通过调用 AI 工具的 API 来工作(也可以调用本地的 AI 模型),所以本身对于机器性能的要求并不高,即便是 NAS 这种性能比较一般的机器也可以轻松部署。

n8n 默认情况下使用SQLite作为数据库,也可以使用PostgreSQL替换默认的SQLite数据库,本文中使用PostgreSQL数据库来构建,构建前需要自行创建一个名为n8n的数据库。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
docker run -itd --name n8n --restart always \
 -e GENERIC_TIMEZONE="Asia/Shanghai" \
 -e TZ="Asia/Shanghai" \
 -e N8N_SECURE_COOKIE=false \
 -e DB_TYPE=postgresdb \
 -e DB_POSTGRESDB_DATABASE=n8n \
 -e DB_POSTGRESDB_HOST=「HOST」 \
 -e DB_POSTGRESDB_PORT=「PORT」 \
 -e DB_POSTGRESDB_USER=「USER」 \
 -e DB_POSTGRESDB_PASSWORD=「PASSWORD」 \
 -p 5678:5678 \
 -v 「PATH_N8N」:/home/node/.n8n \
 n8nio/n8n:latest
信息

容器内的/home/node/.n8n保存了配置文件,但是镜像没有并非以root用户登录,因为权限问题无法将文件直接写入,导致加上-v 「PATH_N8N」:/home/node/.n8n 后会无法正常运行,可以先构建容器,将里面的文件复制出来,在加上这句话就可以正常运行了。

信息

默认 n8n 使用http协议访问时只能运行在localhost,而使用https协议时不受限,通过设置N8N_SECURE_COOKIE=false可以不遵守这一限制。n8n 放在内网使用时,可以避免在内网进行反向代理,比较方便,也相对安全。而在公网使用时,这样设置容易导致密码和 API Key 的泄露,还是应当申请证书进行反向代理。

第 3 节 工作流节点

工作流由一个个节点组成,前一个工作流输出的结果传到下一个工作流中作为输入,构成了复杂的自动化流程。

3.1 触发器节点

工作流的第一个节点是触发器节点,触发器节点定义了工作流在何种情况下被触发,主要触发方式有以下几种:

https://img.papergate.top:5000/i/2025/06/6861167a83df7.webp

触发方式大致上就是手动触发、定时触发、事件触发这三种。

3.2 工作节点

工作节点主要是一些获取数据和对数据进行处理的节点。

HTTP 节点

HTTP 节点可以进行 HTTP 请求,可以将前一个节点的输出作为Header或者params中的一部分,自身的response也可以作为下一个节点的输入来使用。

比如,在这样一个逻辑链条中:

https://img.papergate.top:5000/i/2025/07/68631cb27e7dd.webp

上一个节点的输入是JSON数据:

https://img.papergate.top:5000/i/2025/07/68631d2fbb230.webp

我们可以在请求中将其作为参数传入,比如放在body中:

https://img.papergate.top:5000/i/2025/07/68631d62ce880.webp

Field 节点

可以从杂乱无章的JSON数据中提取出我们想要的数据,比如,在这样一个逻辑链条中:

https://img.papergate.top:5000/i/2025/07/68631e1f8fd2c.webp

输入数据的格式比较凌乱:

https://img.papergate.top:5000/i/2025/07/68631e750d23b.webp

我们可以对数据进行处理:

https://img.papergate.top:5000/i/2025/07/68631e96c62f3.webp

得到简洁的输出数据:

https://img.papergate.top:5000/i/2025/07/68631ebca55c0.webp

Merge 节点

Merge节点将左侧的输入按照顺序放到一个列表中,传到右侧,如图:

https://img.papergate.top:5000/i/2025/07/68631f2abeaa4.webp

两个输入,经过Merge以后,变成了单输出,输出上写着2个项目

https://img.papergate.top:5000/i/2025/07/68632003c38ee.webp

信息

2个项目的意思就是,Merge节点右侧接有运算时,左侧之前传入的参数会分2次分别传入到右侧,在右侧进行2次计算,并得到2个结果。

Aggregate 节点

上面提到,Merge节点右侧接有运算时会计算多次,有时候当我们想要将其作为一个整体传到右侧进行计算时,就需要用到Aggregate节点。

信息

输入是json数据,当最外层是列表时,列表的每个元素会计算一次,Aggregate节点就是在列表外套一个对象,将列表中的所有元素放到一个对象中,这样就只计算一次。

Split 节点

Split 节点和上面讲的正好相反,比如当我们左侧的输入是一个当做整体的列表时,右侧有一个「新增单位」的运算,如图:

https://img.papergate.top:5000/i/2025/07/686321d314943.webp

我们的想法是,列表中的每一个值都要新增,这时候我们就需要用到Split节点。Split节点就是把对象展开成列表。

Code 节点

Code节点上可以运行JS程序或者python程序,因为python程序还在测试阶段,使用体验不是很好,本人建议还是直接写JS程序。

https://img.papergate.top:5000/i/2025/07/686322f1afd6e.webp

Code节点有2Mode,分别是Run Once for All ItemsRun Once for Each Item,前面那种模式,可以省略掉一个Aggregate节点,因为不管前面有几个项目,都会被当做一个整体一次处理,而后面那种模式会将每个项目单独处理。

https://img.papergate.top:5000/i/2025/07/686322e1a6051.webp

两种模式下的语法也有些微不同。

AI 节点

AI 节点是一个很伟大的东西,它提供了一个非常强大的功能,把非结构化、结构未知的数据转成结构化的数据。

https://img.papergate.top:5000/i/2025/07/686324ca12c68.webp

左侧传入的是一段食谱文本和一些类别信息:

https://img.papergate.top:5000/i/2025/07/6863252ba4b6f.webp

我们在 AI 节点上写上一些提示词:

1
2
3
4
5
阅读以下食谱文本
{{ $json.data[0].body.text }}
需要对这一食谱进行分类,类别可以有一个或者多个,优先从以下类别中选择
{{ $json.data[1].category }}
如果上述类别不足以描述该食谱,可以使用新的类别,返回一个严格的 JSON 数组。

连接DeepSeek模型和Structured Output Parser,指定输出格式如下:

https://img.papergate.top:5000/i/2025/07/686325fd8eda5.webp

这样 AI 模型经过运算,就会以我们想要的格式将结果输出。

第 4 节 实例

举一个实例来说明,在之前的文章中,我们知晓了Mealie是一款功能强大的食谱管理系统,但是维护其繁杂的数据库是一件辛苦的事情,实在是非常的劝退。

所以,很容易想到,如果使用n8n这样一个自动化平台,若是只需要将食谱的文字部分一股脑的传入进去,平台会调用AI功能自动为我们将文字解析成结构化的数据,并调用 API 接口传入 Mealie,那岂不是非常令人振奋吗!

经过我的不懈努力,最终也是成功实现了这一功能!

4.1 常规参数

一些常规数据,类型为字符串或者数字,使用DeepSeek直接识别。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
解析以下食谱文本并提取关键信息:

{{ $json.body.text }}

请以JSON格式返回以下字段:
1. name:菜名
2. recipe_servings:几人份(纯数字)
3. recipe_yield_quantity:几人份(纯数字)
4. prep_time:准备时间(如1 小时,数字和中文之间有1个空格)
5. perform_time:烹饪时间(如30 分钟,数字和中文之间有1个空格)
6. total_time:总时间(如30 分钟,数字和中文之间有1个空格)
7. description:菜品描述(1-2句话)

4.2 营养参数

营养参数让DeepSeek根据食谱的配料自己估算。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
分析以下食谱文本并精确估算营养数据:

{{ $json.body.text }}

要求:
1. 输出标准JSON格式的营养信息
2. 所有数值必须为具体数字(整数或小数),禁止使用范围
3. 基于常见食材营养数据估算,保持合理比例
4. 单位严格按以下要求:
   - 能量:千卡(kcal)
   - 重量:克(g)
   - 钠/胆固醇:毫克(mg)
注意:
1. 所有字段必须存在,无数据时填0
2. 数值需符合膳食常识(如蛋白质≈总热量15-20%)
3. 脂肪类总和不超过fat_content
4. 优先考虑主要食材的营养贡献

4.3 烹制方法

让 AI 自动分析文本,总结归纳。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
阅读并分析以下食谱文本:

{{ $json.body.text }}

提取烹饪步骤并以JSON格式输出,要求:
1. 使用数组表示步骤,每个步骤包含:
   - text:步骤详细说明
   - summary:步骤简要概括
   - title:仅当几个相似步骤的第一个显示概括标题,其余留空
   - ingredient_references:保持空数组
2. 对连续相似步骤进行分组,只在第一个步骤设置title
3. 保持输出简洁规范

4.4 效果

其他部分涉及到了许多的逻辑运算和JS脚本,处理方式相对比较传统,按照调用各种 API 的逻辑顺序依次调用,即可实现。

https://img.papergate.top:5000/i/2025/07/68631a83b3138.webp