N8N实操指南
一、工作流说明以及材料准备
介绍
这是一个基于 n8n 编排的全链路 AIGC 工作流,实现了从“一个创意”到“一篇完整图文笔记”的端到端自动化。
-
极简触发:通过 n8n Form 表单,您只需输入“昵称”和“想要的主题”(如“深圳打卡”),即可一键启动。
-
文案与生图Prompt的生成:调用本地部署的文本大模型(Qwen3-4B),模拟小红书博主语气,生成包含 Emoji、分段清晰、热门标签的爆款文案,并根据文 案内容自动提炼并生成专属于该笔记的中文绘画提示词。
-
生图闭环:自动调用本地生图模型(Z-Image-Turbo),将提示词转化为高分辨率的封面图。
-
数据归档:将生成的标题、正文、图片附件自动回写至飞书多维表格,形成结构化的内容资产库。
涵盖知识点
-
vllm部署文本模型 -Qwen3-4B
-
diffusers部署生图模型 - Z-Image-Turbo
-
api调用云端模型的模型
-
利用N8N编排文本模型和生图模型制作小红书笔记
材料准备
本案例所需的材料
-
显卡型号:
沐曦 C500 - 64G -
镜像:
N8N/vllm:0.10.2/Python 3.10 /maca 3.2.1.7 -
飞书表格所需应用凭证ID,如果您想使用自己的飞书表格请参考 飞书开发者配置:
-
ID:
cli_a9baf2386f79dcb2 -
Secret:
rYBEyhUOudKrC17FYTICZgAoYIeL7n5U
- N8N工作流节点文件:小红书图文笔记-n8n.json
若您选择使用我们提供的飞书应用凭证id和secret,最后可以在该互联网公开的飞书多维表格中查看您执行工作流后得到的结果: 自动化生成小红书图文案例,也可以选择自行创建飞书企业自建应用和多维表格,在工作流中使用您自己的凭证,将执行结果写回您的飞书多维表格中

工作流中调用的大模型,可根据您的喜好切换,教程中只演示了Qwen3-4B和Z-Image-Turbo,但您可发挥创意,自行在算力容器内部署大模型并完成调用,制造你的专属工作流
二、详细教程演示
1. 选择算力租用
文档中的演示均在曦云C500 64G卡中进行,镜像选择N8N/vllm:0.10.2/Python 3.10 /maca 3.2.1.7


2. 进入容器
- 回到工作台点击JupyterLab,进入到容器

3. 运行N8N
- 新开一个终端窗口

- 运行N8N(N8N端口已默认设置为8188)

- 运行成功后,请不要关闭该终端。

4. vllm 部署Qwen3-4B
- 新开一个终端窗口,使用 vllm 部署Qwen3-4B

- 在终端命令行运行以下代码
# 计算逻辑:我们希望 vLLM 占用约 12GB 显存。
# 12GB / 64GB ≈ 0.19,所以我们将利用率设为 0.2 (20%)
# --max-model-len 4096 限制上下文长度,防止长文案撑爆显存
# vllm部署Qwen3-4B
vllm serve /mnt/moark-models/Qwen3-4B \
--port 8001 \
--dtype bfloat16 \
--gpu-memory-utilization 0.2 \
--max-model-len 4096 \
--trust-remote-code
- 运行成功后,请不要关闭该终端。

5. Diffusers + Fastapi 部署 Z-Image-Turbo
💡首先:在环境中安装依赖:
pip install fastapi uvicorn transformers torch pillow accelerate diffusers
下载完后:执行该命令:sed -i '71 s/from flash_attn.flash_attn_interface import _wrapped_flash_attn_backward, _wrapped_flash_attn_forward/from flash_attn.flash_attn_interface import _flash_attn_backward as _wrapped_flash_attn_backward, _flash_attn_forward as _wrapped_flash_attn_forward/' /opt/conda/lib/python3.10/site-packages/diffusers/models/attention_dispatch.py
解决flash_attn 版本兼容问题,让 diffusers 能适配新版 flash_attn,避免「导入不存在的函数」报错
其次,新建一个python 文件:
- 在jupyter文件目录处,点击右键,选择"New Python File"创建一个新的python文件,并重命名为main.py,然后进入到文件中


- 将以下代码写入到 main.py 文件中,进行保存
import io
import sys
import torch
import uvicorn
from fastapi import FastAPI, HTTPException
from fastapi.responses import Response
from pydantic import BaseModel
from typing import Optional
from diffusers import ZImagePipeline
app = FastAPI(title="Z-Image-Turbo Generation API")
MODEL_PATH = "/mnt/moark-models/Z-Image-Turbo"
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
pipe = None
# 定义宽高比映射
ASPECT_RATIOS = {
"1:1": (1024, 1024),
"16:9": (1280, 720),
"9:16": (720, 1280),
"4:3": (1152, 864),
"3:4": (864, 1152),
}
@app.on_event("startup")
def load_model():
global pipe
try:
print(f"正在加载模型: {MODEL_PATH} ...")
pipe = ZImagePipeline.from_pretrained(
MODEL_PATH,
torch_dtype=torch.bfloat16 if DEVICE == "cuda" else torch.float32,
low_cpu_mem_usage=False,
)
pipe.to(DEVICE)
print("✅ 模型加载成功!")
except Exception as e:
print(f"❌ 模型加载失败: {e}")
sys.exit(1)
class GenerateRequest(BaseModel):
prompt: str
ratio: Optional[str] = None
width: Optional[int] = None
height: Optional[int] = None
steps: int = 9 # Z-Image-Turbo 推荐 4-10 步
cfg: float = 0.0 # Z-Image-Turbo 必须很低
seed: int = 42
@app.post("/generate")
def generate(req: GenerateRequest):
global pipe
if pipe is None:
raise HTTPException(status_code=500, detail="Model not loaded")
try:
# 1. 处理分辨率逻辑:优先看有没有 ratio,没有再看 width/height
final_width = 1024
final_height = 1024
if req.ratio and req.ratio in ASPECT_RATIOS:
final_width, final_height = ASPECT_RATIOS[req.ratio]
print(f"使用宽高比预设: {req.ratio} -> {final_width}x{final_height}")
elif req.width and req.height:
final_width = req.width
final_height = req.height
real_cfg = 0.0 # 强制优化:Turbo 模型推荐 0 CFG
# Turbo 模型一般 9 步就收敛了。这里我们尊重用户输入,但你可以根据效果自行裁剪。
print(f"生成请求: {req.prompt[:30]}... | {final_width}x{final_height} | Steps: {req.steps}")
generator = torch.Generator(device=DEVICE).manual_seed(req.seed)
image = pipe(
prompt=req.prompt,
height=final_height,
width=final_width,
num_inference_steps=req.steps,
guidance_scale=real_cfg, # 这强制改成 0
generator=generator,
).images[0]
img_byte_arr = io.BytesIO()
image.save(img_byte_arr, format='PNG')
img_bytes = img_byte_arr.getvalue()
torch.cuda.empty_cache()
return Response(content=img_bytes, media_type="image/png")
except Exception as e:
print(f"❌ 生成出错: {e}")
import traceback
traceback.print_exc()
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
- 新开一个终端窗口,运行main.py文件


运行成功后,请不要关闭该终端。
这段代码不要在jupyter notebook中直接运行,会导致Asyncio 事件循环冲突,将代码保存为一个py文件,在终端中使用python命令运行即可
6. 在本地访问云端部署的N8N服务
执行隧道代理
- 访问云端的web服务,首先需要进行隧道代理,具体流程请参考建立隧道代理
隧道代理命令可在此复制:

- 代理成功后,本地浏览器访问: http://localhost:8188
配置N8N的工作流信息
创建账号并导入工作流节点
- 创建账号:

- 创建新的工作流

- 直接复制文件中的json内容然后在画布中粘贴小红书图文笔记-n8n.json