2026-09-26 · 原文发布日
工地事故照片自动分级:先鉴伪再让Gemini出评估
工人经n8n表单提交物业、问题描述和现场照片;系统生成事故编号和证据记录,先把图送Walterwrites检测AI生成概率,可疑的立刻发Slack要求人工复核;随后Gemini(带结构化输出约束)基于照片可见内容输出类目、严重度、紧急度、摘要和下一步建议的JSON;格式化的事故消息连同风险和真伪指标发Slack,并写入或更新Google Sheets事故日志。表单字段和可传文件类型可配置。模板免费。
原文要点
原作者iamvaar在n8n.io发布的免费工作流(workflow 19962,可免费获取模板文件):n8n表单触发器收集物业选项、问题描述和现场照片;提取图片元数据并生成带唯一事故编号的证据记录;把图片发往Walterwrites.ai图片检测API算出AI生成概率与真伪状态;可疑图片触发Slack人工复核提醒;随后照片与问题描述交给Google Gemini(配合structured output parser)只基于画面可见内容输出含类目、严重度、紧急度、摘要、下一步建议的JSON;格式化后的事故消息连同风险与真伪指标发Slack,并追加或更新Google Sheets事故日志。表单的物业选项和可传文件类型可配置。作者另附YouTube演示视频。
这次做成什么
在本站还原一条可照着搭的n8n流水线:表单收事故照片→AI鉴伪分支→Gemini结构化评估→Slack通报+Sheets台账。练习用一条合成测试数据走通全流程,不连接真实工地。
准备什么
- n8n实例(Cloud或自托管)并能发布表单触发器
- Walterwrites.ai账号及其HTTP Header Auth凭据
- Google Gemini(PaLM)API凭据
- Slack OAuth凭据和一个可发帖频道
- Google Sheets服务账号凭据及一张已共享的事故日志表
- 一张本站合成的练习用现场照片,不含真人隐私信息
具体怎么做
建表单触发器并生成事故编号
在工作流顶部放n8n Form Trigger节点,字段设为property(下拉:A座/B座/地下车库)、description(多行文本)、photo(文件上传,限制jpg/png,上限10MB)。发布表单拿到URL。后接一个Code节点:取当前时间戳加随机四位生成incidentId如INC-20260926-4831,把表单字段与图片二进制名一起放入evidence对象。
鉴伪请求与可疑分支
加HTTP Request节点,方法POST到Walterwrites.ai图片检测端点,认证方式选预先配置的Header Auth,把照片二进制作为请求体上传。解析返回的AI生成概率score。接一个IF节点:score大于等于你设定的阈值(练习用0.6)走true分支,发Slack消息『照片INC-xxxx疑似AI生成,请人工复核』;false分支直接继续。
Gemini结构化评估
加Google Gemini Chat Model节点,接入带schema约束的Structured Output Parser,schema限定字段category、severity、urgency、summary、nextAction。提示词明确要求只描述照片可见内容、不得推测画面外事实,把description作为申报人陈述一并传入但标注其未经核实。输出为纯JSON。
汇总发Slack并写Sheets
用Set或Code节点把incidentId、Gemini评估JSON、鉴伪score和真伪状态拼成Slack消息文本,Slack节点发到事故频道。Google Sheets节点选Append or Update:以incidentId为匹配键,列映射为编号/物业/描述/类目/严重度/紧急度/摘要/建议/AI概率/状态/提交时间,重复编号更新而非追加。
可直接复制的材料
Gemini结构化评估提示词(本站独立撰写)
本站独立编写示例,severity/urgency分级词可换成你司制度用语;需在Gemini节点的output parser中同步定义同名schema。
你是工地事故初评助手。输入包含两部分:一张现场照片,以及申报人填写的问题描述(该描述未经核实,仅作参考)。
请只依据照片中肉眼可见的内容进行判断,不要推测画面之外的原因、责任或损失。若照片无法支持某项判断,在该字段写明"照片无法确认"。
仅输出以下JSON,不要输出任何其他文字:
{"category":"从 高处坠落/机械伤害/用电安全/消防隐患/物料堆放/其他 中选一个","severity":"轻微/一般/严重/危急","urgency":"无需立即处理/24小时内/立即停工处理","summary":"不超过80字的可见情况概述","nextAction":"建议的下一步处置,不超过60字"}
申报人描述:{{$json.description}}合成测试数据(表单提交模拟)
本站合成的练习输入,照片用任意不含人脸的测试图片即可;不要在练习表里写真实业主或工人信息。
{"property":"地下车库","description":"B2层配电箱附近地面有积水,电缆从水中穿过,担心漏电。","photoFileName":"test-cable-water.jpg","submittedAt":"2026-09-26T10:15:00+08:00"}Slack事故通报消息模板
本站独立编写的Slack文本示例,字段名需与你Code节点的实际输出对齐。
🚨 事故通报 {{$json.incidentId}}
物业:{{$json.property}}
类目:{{$json.assessment.category}} 严重度:{{$json.assessment.severity}} 紧急度:{{$json.assessment.urgency}}
摘要:{{$json.assessment.summary}}
建议:{{$json.assessment.nextAction}}
照片AI生成概率:{{$json.aiScore}}({{$json.authenticity}})
申报描述:{{$json.description}}输入与输出示例
本站虚构演示,输入输出字段一一对应,未实际调用任何API,不代表原作者运行结果。
输入
合成表单提交:property=地下车库,description=配电箱旁积水且电缆泡水,附一张测试照片test-cable-water.jpg对应输出
Sheets新增一行:INC-20260926-4831 | 地下车库 | 用电安全 | 严重 | 立即停工处理 | 照片可见地面积水,电缆从中穿过 | 断电并围蔽该区域,联系电工排查 | AI概率0.04 | 正常 | 2026-09-26 10:15做完检查这些
- 表单发布后能用测试数据提交并触发整条流程,Code节点输出含INC-开头的唯一编号
- 鉴伪score高于阈值时只发复核提醒不中断,低于阈值时流程继续到Gemini节点
- Gemini返回严格匹配schema的JSON,五个字段齐全且无额外文字
- Sheets中同一incidentId重复提交时更新原行而不是新增重复行
- Slack消息中同时出现评估结果和AI生成概率两项信息
容易卡住的地方
- Walterwrites端点与鉴伪阈值为外部服务行为,0.6只是本站练习设定,正式使用需在原文模板与服务商文档核对
- Gemini若未接structured output parser约束,可能输出带多余文字的文本导致下游解析失败
- Google Sheets服务账号必须把事故日志表共享给服务账号邮箱,否则写入报权限错误
- 表单文件类型与大小限制要在Form Trigger中显式配置,超大图片可能导致鉴伪或Gemini请求超时
- 作者称流程简便等表述仅归因于作者,本站不设通过时限
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Triage construction incident photos with Gemini, Slack, and Google Sheets
- 原作者
- iamvaar
- 原始发布日期
- 2026-09-26T13:36:13.355Z
- 来源
- https://n8n.io/workflows/19962