2026-10-10 · 原文发布日
n8n模板:WhatsApp AI客服,支持语音图片PDF与对话记忆
该n8n模板把WhatsApp Cloud API接入AI客服:收到消息后去重并写入Data Tables留档,语音、图片、PDF先下载转成文字,再连同对话历史交给OpenAI,结合FAQ数据表生成回复并分段发回。同一客户连发多条只合并回一次,出错时给客户兜底消息并向Telegram报警,全程不需要Redis或向量库。
原文要点
n8n官方模板库免费工作流20729。它用WhatsApp Cloud API Trigger收消息,过滤送达/已读回执,把webhook规范化为每条客户消息一个item,用Data Tables按消息ID去重并留档;语音、图片、PDF立即下载(链接会过期),经OpenAI转写/识图/PDF文本抽取变成文字;短暂等待合并同一客户的连发消息,加载该号码的历史对话,由带「Business FAQ」Data Table工具的OpenAI代理生成回复,按WhatsApp长度限制分段发回;出错时给客户兜底消息并用Telegram报警。全程不用Redis、Postgres或向量库,记忆按手机号存在Data Table里。原文所列模型为gpt-5.4-mini(回复)、gpt-4.1-mini(识图)与Whisper(语音)。
这次做成什么
照着做出一条「WhatsApp多模态进件→转文字→带记忆与FAQ的AI回复→失败兜底报警」的客服流。原模板未附可导入文件,本页给出独立复刻的节点链路、字段映射与一条合成测试数据,先在测试号码上走通再接真实业务。
准备什么
- Meta开发者账号下建好的WhatsApp Cloud API应用与测试/正式手机号(App ID与App Secret)
- 永久System User访问令牌(用于调用WhatsApp API发消息与下载媒体)
- OpenAI API密钥(聊天、语音转写与图片理解均使用)
- 支持Data Tables的n8n版本;可选:Telegram机器人token与chat ID用于报警
具体怎么做
初始化两张表并配置触发器
建whatsapp_agent_messages(列:phone_number、message_id、role、content、media_type、status、created_at)与whatsapp_agent_faq(列:question、answer)。加WhatsApp Trigger凭据(App ID+App Secret),在Meta应用后台订阅messages webhook字段;Trigger后用Filter丢弃statuses回执与超过15分钟的旧消息。
规范化、去重、留档
Code节点把payload拍平成每客户消息一item,字段映射:from→phone_number、id→message_id、type→media_type、text.body→content。用messages表按message_id查重,命中即终止;未命中则写入原始消息行。
多媒体转文字
Switch按media_type分流:audio/image/document时用WhatsApp API凭据先GET媒体URL再下载二进制;audio走OpenAI语音转写,image走带图聊天模型描述内容,document走PDF文本抽取节点;超过maxFileSizeMB或不支持的类型不写报错,而是把「文件过大/不支持」的说明文字当作content继续走流程。
缓冲合并与加载记忆
Wait节点等待bufferSeconds(本站练习设8秒);随后查messages表取该phone_number最近memoryMessages条(练习设10条),若期间同号来了更新的消息则本run终止、由最新run统一作答——这就是连发多条只回一次的机制。把本次消息标记status=answered。
AI生成并分段回复
AI Agent节点挂OpenAI Chat Model,系统提示词写入店名与业务信息(见材料),工具挂Data Table查询whatsapp_agent_faq。产出后Code节点按约1000字符在句号处切分,循环用WhatsApp节点发回该号码,assistant回复也写入messages表(role=assistant)。
错误兜底与报警
在Agent与发送节点启用错误分支:任一失败时给客户发固定兜底语,并把phone_number、错误信息、时间用Telegram节点发给店主的telegramChatId。
可直接复制的材料
AI客服系统提示词(粘进Agent节点System Message)
本站独立撰写,店名与营业信息为虚构示例,换成你自己的Configuration业务信息。
你是「晨曦烘焙坊」的WhatsApp客服。规则:1) 只回答与门店业务相关的问题,优先使用FAQ工具查到的内容,查不到就如实说不确定并请客户留电话由专人回电;2) 语气亲切简短,单条回复不超过300字,可用换行分点,少用emoji;3) 结合对话历史理解指代(例如「那明天呢」指上文日期);4) 不承诺历史与FAQ之外的折扣、退款或库存;5) 客户发火时先安抚再给解决方案。营业信息:周一至周六9:00-19:00,周日公休。Configuration节点示例值
本站设定的练习值;telegramChatId换成你自己的,bufferSeconds/记忆条数/文件上限按环境调整。
{
"businessName": "晨曦烘焙坊",
"businessInfo": "手工面包与蛋糕预订,台北市大安区,可自取或外送",
"bufferSeconds": 8,
"memoryMessages": 10,
"maxFileSizeMB": 15,
"maxDocumentCharacters": 4000,
"telegramChatId": "123456789",
"fallbackMessage": "抱歉,系统暂时忙碌,我们稍后会尽快回复您。"
}whatsapp_agent_faq合成练习数据(CSV)
本站虚构FAQ,仅用于练习工具检索与回复生成。
question,answer
生日蛋糕要提前多久预订,生日蛋糕需提前2天预订,门店自取或3公里内可外送。
有無麩質麵包嗎,目前提供無麩質糙米麵包,每日限量,建議上午預訂。
可以开发票吗,可開立電子發票,結帳時提供統編即可。
外送范围与运费,3公里内滿500元免運,未滿收60元運費。输入与输出示例
本站虚构演示,未实际运行;回复文案为示意,不代表你的模型输出。
输入
测试号码+886912000001在3秒内连发两条文字「你好,请问生日蛋糕要提前多久订?」「另外可以送货到内湖吗」,随后发一条语音。对应输出
第一条消息的run在Wait期间发现第二条更新而终止;第二个run合并输入为「你好,请问生日蛋糕要提前多久订?
另外可以送货到内湖吗」,FAQ工具命中「生日蛋糕要提前多久预订」,回复(分段示意):「您好!生日蛋糕需提前2天预订哦~
外送范围为门店3公里内,内湖部分区域可达,建议提供地址帮您确认。满500元免运费。」语音消息单独一run,经Whisper转写为「请问周日有营业吗」,回复「周日是公休日,周一至周六9:00-19:00为您服务!」。做完检查这些
- 向webhook投递重复的同一message_id,第二次执行在去重处终止,messages表不新增行
- 连发两条文字后只收到一条合并回复,且messages表中两条incoming均为answered
- 发送语音消息,messages表该行的content为转写文字、media_type为audio
- 发送超过maxFileSizeMB的PDF,客户收到「文件过大」的说明回复而非报错
- 把OpenAI密钥改错制造失败,客户收到兜底语且Telegram收到含号码与错误信息的报警
容易卡住的地方
- WhatsApp媒体链接会过期,模板设计为进件后立即下载,不要在流程后段才下载
- 本流程按手机号存记忆,依赖Data Tables而非Redis/向量库;n8n版本太旧没有Data Tables就无法运行
- 投递/已读回执已在Trigger过滤,若你自己改了过滤条件会白白触发执行
- 停机后超过15分钟的旧消息被忽略,别指望补回
- 免费/临时令牌会过期,原文建议用永久System User令牌
- OpenAI与Meta按各自规则计费,模板本身免费但模型与API调用不免
- 回复长度受WhatsApp限制,分段逻辑必须在句号处切,硬切会切断词语
- 原文所列模型名(gpt-5.4-mini等)以模板页面为准,节点内可换成其他聊天模型但需自行验证
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Handle WhatsApp customer chats with OpenAI and Data Tables
- 原作者
- Anna Cole
- 原始发布日期
- 2026-10-10T07:36:56.773Z
- 来源
- https://n8n.io/workflows/20729