【收藏必备】从零开始构建AI饮食助手:n8n低代码平台开发实战,终结选择困难症
发布时间:2026/10/2 12:57:09来源:尧图网络
1. 为什么我要用 n8n 搭一个 AI 饮食助手每天中午十一点半我盯着外卖软件划了十分钟最后还是点了那家吃过八遍的黄焖鸡。这不是选择困难这是决策疲劳——大脑在吃什么这件事上消耗的算力本可以留给更重要的代码。AI 饮食助手要解决的就是这个它知道你昨天中午吃了什么、前天晚上点了什么外卖、冰箱里还剩什么菜然后直接告诉你今天中午吃番茄牛腩配米饭。不是给你十个选项让你继续纠结而是给一个带理由的推荐。n8n 低代码平台在这里的价值在于你不需要从零写一个后端服务。工作流编排、定时触发、HTTP 请求、数据库连接这些在 n8n 里都是拖拽节点的事。真正需要你动脑的只有三件事——提示词怎么写、MCP 工具怎么接、模型怎么调。我试过用纯代码写类似的 Agent光是处理对话上下文和工具调用的循环就写了三百多行。换成 n8n 之后AI Agent 节点自带 Chat Model、Memory、Tool 三件套你只需要把 MCP Client Tool 挂上去剩下的交给工作流引擎。这篇文章面向的是会用 Docker 但不想写太多代码的开发者、想给家里人做个饮食记录工具的产品经理、以及任何想跑通LLM MCP 数据库闭环的人。最终你会得到一个能自动推荐三餐、记录饮食、发周报的 Agent部署在云服务器上 24 小时运行。整个链路的核心检索词是 n8n 低代码平台搭建 AI 饮食助手 Agent涉及 MCP 工具接入和模型调用。下面从环境搭建开始每一步都有可复制的配置。2. 前置准备TaoToken 模型接入与 n8n 环境搭建2.1 为什么模型调用层要单独处理n8n 的 AI Agent 节点需要一个 Chat Model 来驱动。你可以直接填 DeepSeek 或 OpenAI 的 API Key但如果你同时想用 Claude 做复杂推理、用 Qwen 做中文菜谱理解每个平台单独管理 Key 和 Base URL 会很乱。TaoToken 在这里的角色是统一模型接入层一个 API Key 对应多个模型Base URL 统一为https://taotoken.net/api兼容 OpenAI 的/v1/chat/completions格式。n8n 里的 OpenAI Chat Model 节点可以直接指向它不需要额外写适配代码。具体操作访问 https://taotoken.net/api-keys 创建一个 API Key然后在模型对话页面确认你要用的模型 ID比如claude-sonnet-4-20250514或gpt-4o。这个 Key 后面会填到 n8n 的 Credential 里。2.2 n8n 的 Docker 安装n8n 官方推荐 Docker 部署一条命令启动docker volume create n8n_data docker run -it --rm \ --name n8n \ -p 5678:5678 \ -v n8n_data:/home/node/.n8n \ -e N8N_SECURE_COOKIEfalse \ docker.n8n.io/n8nio/n8n启动后访问http://localhost:5678用邮箱注册社区版。n8n 的 Fair-Code License 对个人自托管完全免费不需要付费。如果你在本地开发Docker Desktop 要先启动。如果是在 Linux 服务器上把-it --rm换成-d让它后台运行再加--restart unless-stopped保证开机自启。2.3 数据库准备MySQL 存菜谱和饮食记录饮食助手需要两张表candidate_food存候选菜谱my_dietary_record存每日饮食记录。建表 SQLCREATE DATABASE IF NOT EXISTS eat_what_today DEFAULT CHARSET utf8mb4; USE eat_what_today; CREATE TABLE candidate_food ( id INT AUTO_INCREMENT PRIMARY KEY, food_name VARCHAR(100) NOT NULL, category VARCHAR(50), tags VARCHAR(200) ); CREATE TABLE my_dietary_record ( id INT AUTO_INCREMENT PRIMARY KEY, food_name VARCHAR(100) NOT NULL, lunch_or_dinner VARCHAR(10), date DATE NOT NULL );插入几条测试数据INSERT INTO candidate_food (food_name, category, tags) VALUES (番茄牛腩, 荤菜, 牛肉,番茄,炖菜), (清炒时蔬, 素菜, 青菜,低脂), (三文鱼刺身, 生食, 海鲜,生食), (黄焖鸡, 荤菜, 鸡肉,外卖); INSERT INTO my_dietary_record (food_name, lunch_or_dinner, date) VALUES (黄焖鸡, 午餐, CURDATE() - INTERVAL 1 DAY), (清炒时蔬, 晚餐, CURDATE() - INTERVAL 1 DAY);注意candidate_food里我故意放了三文鱼刺身因为提示词里会设置忌口后面验证 Agent 是否会正确排除。2.4 DBHub MCP Server 启动DBHub 是一个实现了 MCP 协议的数据库网关让 Agent 能通过标准协议查询数据库。用 Docker 启动docker run -d \ --name dbhub \ -p 8080:8080 \ --add-hosthost.docker.internal:host-gateway \ bytebase/dbhub \ --transport http \ --dsn mysql://root:yourpasswordhost.docker.internal:3306/eat_what_today启动成功后会打印一个 ASCII 图案和监听地址。记下http://host.docker.internal:8080/mcp这是后面填到 n8n MCP Client Tool 的 Endpoint。--add-hosthost.docker.internal:host-gateway这行很关键n8n 和 DBHub 都在 Docker 里它们访问宿主机的 MySQL 不能用localhost必须用host.docker.internal。Linux 下 Docker 默认不解析这个域名所以要手动加 host 映射。3. n8n 工作流配置Agent 节点与 MCP Client Tool 对接3.1 新建工作流与 AI Agent 节点在 n8n 工作台新建一个空白 workflow点击添加节点搜索AI Agent。这个节点包含三个子组件Chat Model驱动对话的 LLMMemory对话上下文存储ToolAgent 可调用的外部能力先配 Chat Model。点击 Chat Model 下方的选择OpenAI Chat Model因为 TaoToken 兼容 OpenAI 格式。在 Credential 里新建一个 OpenAI 类型的凭据{ name: TaoToken, type: openAiApi, data: { apiKey: sk-你的TaoToken密钥, baseUrl: https://taotoken.net/api/v1 } }Model ID 填你在 TaoToken 模型对话页面确认的模型名比如claude-sonnet-4-20250514。Base URL 末尾的/v1不能省n8n 的 OpenAI 节点会自动拼接/chat/completions。3.2 Memory 配置PostgreSQL 持久化对话n8n 内置的 Simple Memory 重启就丢我选择存到 PostgreSQL。在 Memory 下拉里选PostgreSQL Chat Memory连接配置{ host: host.docker.internal, port: 5432, database: n8n_memory, user: postgres, password: yourpassword }首次运行后会自动建表n8n_chat_histories字段为id、session_id、message。你可以在数据库里直接看到每轮对话的 JSON 结构。如果你不想额外装 PostgreSQL用 Simple Memory 也能跑通只是每次重启 n8n 后上下文会清空。3.3 MCP Client Tool 接入 DBHub这是整个工作流最核心的一步。在 Agent 节点的 Tool 区域点击选择MCP Client Tool。配置如下{ endpoint: http://host.docker.internal:8080/mcp, transport: http, name: DBHub }保存后在 Chat 界面问 Agent你能调用哪些工具如果配置正确它会返回 DBHub 暴露的工具列表包括execute_sql、resource__schemas、resource__tables_in_schema等。这里有个坑n8n 的 MCP Client Tool 在询问工具列表时有时只返回 Tools 类别不返回 Resources 和 Prompts。这不影响核心功能因为execute_sql已经够用了。如果你需要完整的工具列表可以在 Dify 里配同样的 DBHub MCP 对比一下。3.4 添加 Date Time 工具LLM 本身不知道现在几点所以必须给它一个时间工具。在 Tool 区域再添加一个Date Time Tool不需要额外配置挂上就行。这个工具在后面的定时推荐场景里很关键Agent 需要根据当前时间判断是推荐午餐还是晚餐。3.5 Chat Trigger 配置添加一个Chat Trigger节点连接到 AI Agent。在 Chat Trigger 的设置里Make Chat Publicly Available打开后可以通过 URL 公开访问Initial Message设置欢迎语比如今天想吃什么我帮你决定点击Open Chat按钮可以直接在 n8n 里测试对话。如果 Agent 能正常回复说明模型调用链路通了。4. 提示词编写与本地验证从食材识别到菜谱推荐4.1 System Message 设计在 AI Agent 节点的 Options 里添加 System Message。这段提示词决定了 Agent 的行为边界你是一个 AI 饮食助手根据用户的候选菜谱和每日饮食记录科学地推荐今日适合吃什么。 你需要遵循以下原则 1. 不要推荐用户在当天已经吃过的食物 2. 尽量确保食物多样性不要和近期内已经吃过的重复 3. 可以适当推荐同类型的其他蔬菜或肉类组合成炒菜 4. 外卖或外出就餐可以适当推荐但推荐权重不超过 50% 5. 尽量不要在晚餐推荐炒面因为不易消化 6. 用户有忌口三文鱼等生食、动物内脏。不要推荐这些 你具备 MCP Client 中的所有工具其中 - execute_sql 工具用于通过 SQL 查询数据库 - candidate_food 表存储候选菜品 - my_dietary_record 表存储每日菜谱字段id/food_name/lunch_or_dinner/date 你需要从这两个表中查询相关数据然后按照上述要求进行食物推荐。这段提示词的关键在于明确告诉 Agent 有哪些表、字段是什么、查询后要做什么。LLM 不会自己去猜数据库结构你写得越具体工具调用的成功率越高。4.2 验证 MCP 工具调用在 Chat 界面输入帮我推荐今天中午吃什么观察 Agent 的执行过程。正常情况下它会调用execute_sql查询my_dietary_record里今天的记录调用execute_sql查询candidate_food里的候选菜品根据忌口和多样性原则筛选返回推荐结果如果 Agent 返回了三文鱼刺身说明忌口规则没生效需要检查提示词里的忌口描述是否足够明确。如果报错Cannot read properties of undefined (reading nodeName)这是 n8n AI Agent 节点 v3 的一个已知问题。解决办法把工作流导出为 JSON找到 AI Agent 节点的typeVersion改成2.2再重新导入。4.3 验证数据库写入在 Chat 里说我今天中午吃的番茄牛腩帮我记录一下。Agent 应该调用execute_sql执行 INSERT。但这里有个安全考虑DBHub 的execute_sql默认只允许 SELECT不允许 INSERT/UPDATE/DELETE。所以你需要单独提供一个 HTTP 接口来做数据写入。用 Flask 写一个简单的写入服务from flask import Flask, request, jsonify import pymysql app Flask(__name__) app.route(/save_food, methods[POST]) def save_food(): data request.json conn pymysql.connect( hosthost.docker.internal, userroot, passwordyourpassword, databaseeat_what_today ) cursor conn.cursor() cursor.execute( INSERT INTO my_dietary_record (food_name, lunch_or_dinner, date) VALUES (%s, %s, CURDATE()), (data[food_name], data[lunch_or_dinner]) ) conn.commit() conn.close() return jsonify({status: ok}) if __name__ __main__: app.run(host0.0.0.0, port5000)然后在 n8n 的 Agent Tool 里添加一个 HTTP Request 工具命名为Save the foodURL 填http://host.docker.internal:5000/save_foodMethod 选 POSTBody 用 JSON{ food_name: {{ $fromAI(food_name, 食物名称) }}, lunch_or_dinner: {{ $fromAI(lunch_or_dinner, 午餐或晚餐) }} }$fromAI是 n8n 的动态表达式它让 LLM 根据上下文自动填充参数值。你不需要在上下文里预先定义food_name只需要告诉 LLM 这个位置要填什么。4.4 验证消息推送用 pushplus 做微信推送。在 pushplus 官网获取 token 后在 n8n 里添加 HTTP Request 工具{ url: https://www.pushplus.plus/send, method: POST, body: { token: 你的pushplus_token, title: 今日饮食推荐, content: {{ $fromAI(content, 推荐内容) }} } }在 System Message 里补充当你计算出适合推荐的食物后调用 Send notice to user 工具告知用户。测试时在 Chat 里问推荐今天晚饭并通知我。如果微信收到推送说明整条链路通了。5. 常见报错排查401、local proxy failed 与 OAuth 问题5.1 401 Unauthorized现象Agent 节点报错401 Unauthorized模型无法调用。原因TaoToken 的 API Key 填错或者 Base URL 少了/v1。排查在 n8n 的 Credential 里检查baseUrl是否为https://taotoken.net/api/v1。注意末尾不要多斜杠。用 curl 直接测试curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的密钥 \ -H Content-Type: application/json \ -d {model:claude-sonnet-4-20250514,messages:[{role:user,content:hi}]}如果 curl 返回 200说明 Key 没问题问题在 n8n 的 Credential 配置。5.2 local proxy failed现象MCP Client Tool 报错local proxy failed或ECONNREFUSED。原因n8n 容器无法访问 DBHub 的地址。排查确认 DBHub 容器在运行docker ps | grep dbhub。确认 n8n 容器启动时加了--add-hosthost.docker.internal:host-gateway。如果 DBHub 和 n8n 在同一个 Docker 网络里可以直接用容器名http://dbhub:8080/mcp作为 Endpoint。5.3 reading choices 报错现象Agent 返回Cannot read properties of undefined (reading choices)。原因模型返回的响应格式不符合 OpenAI 规范或者模型 ID 填错了。排查确认 Model ID 在 TaoToken 模型对话页面存在。有些模型不支持tools参数而 AI Agent 节点默认会传 tools导致模型返回错误格式。换一个支持 function calling 的模型试试。5.4 OAuth 相关报错现象Chat Trigger 公开访问时要求 OAuth 登录。原因n8n 的 Chat Trigger 默认需要认证。排查在 Chat Trigger 节点设置里把 Authentication 改为 None或者开启 Make Chat Publicly Available。如果是在线上环境确保N8N_EDITOR_BASE_URL环境变量设置正确environment: - N8N_EDITOR_BASE_URLhttps://your.n8n.domain5.5 时区问题现象Date Time 工具返回的时间不是北京时间。解决在 Workflow Settings 里把 Timezone 改为Asia/Shanghai。5.6 JSON 解析错误现象HTTP Request 工具报Invalid JSON format。原因$fromAI动态表达式解析出的内容包含双引号破坏了 JSON 结构。解决把 Specify Body 从Using JSON改成Using Fields Below逐个字段填写 key 和 value。n8n 会自动做 URLEncode避免特殊字符问题。缺点是只支持一层 JSON 结构。6. 定时任务与线上部署让 Agent 自动运行6.1 Schedule Trigger 配置在 workflow 里添加两个 Schedule Trigger 节点上午 10:00 触发推荐午餐下午 17:00 触发推荐晚餐在 User Message 里配置如果当前时间在中午 12 点之前推荐午饭。 如果在晚上 7 点之前推荐晚饭。 将推荐结果直接发通知给我不需要确认。 如果当前时间是周日晚上 10 点发送本周饮食周报。Agent 会调用 Date Time 工具获取当前时间然后根据提示词做分支判断。6.2 线上部署注意事项定时任务需要 n8n 持续运行所以必须部署到云服务器。用 docker-compose 管理version: 3 services: n8n: image: docker.n8n.io/n8nio/n8n restart: unless-stopped ports: - 5678:5678 environment: - N8N_EDITOR_BASE_URLhttps://your.n8n.domain - GENERIC_TIMEZONEAsia/Shanghai extra_hosts: - host.docker.internal:host-gateway volumes: - n8n_data:/home/node/.n8n dbhub: image: bytebase/dbhub restart: unless-stopped ports: - 8080:8080 extra_hosts: - host.docker.internal:host-gateway command: --transport http --dsn mysql://root:passwordhost.docker.internal:3306/eat_what_today volumes: n8n_data:Nginx 反向代理配置location / { proxy_pass http://127.0.0.1:5678/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host your.n8n.domain; proxy_set_header Origin https://your.n8n.domain; }Upgrade和Connection头是必须的否则 n8n 工作台会报Connection Lost。6.3 工作流迁移本地调试好的 workflow 导出为 JSON在服务器上导入。注意API Key 等 Credential 信息不会随 JSON 导出需要在服务器上重新配置。Chat Trigger 的 Public URL 可以在手机上打开添加到桌面图标用起来跟原生 App 差不多。6.4 长期运行建议如果你打算长期跑这个 Agent建议把模型调用层统一走 TaoToken 的 Coding Plan避免多个平台 Key 过期后逐个排查。Coding Plan 的接入文档在 https://taotoken.net/doc 有详细说明支持 Claude Code、Cline 等工具的配置方式可以直接复用到 n8n 的 OpenAI 节点。整个工作流跑通后你得到的是一个每天自动推荐三餐、记录饮食、周日发周报的 Agent。它不需要你写复杂的调度代码n8n 的 Schedule Trigger 和 MCP 工具链已经覆盖了大部分场景。真正需要你反复调优的只有提示词——把忌口、偏好、时间规则写清楚Agent 的推荐质量会明显提升。
网站建设高端定制企业官网