基于Node.js与GPT构建WhatsApp智能客服:Wassenger API集成与函数调用实战
1. 项目概述:将你的WhatsApp号码变成AI客服
如果你正在寻找一种方法,将你的WhatsApp个人号或商业号变成一个能自动回复、能理解图片语音、还能根据你的业务知识进行深度对话的智能客服,那么你来对地方了。这个基于Node.js的开源项目,通过整合Wassenger API和OpenAI的GPT模型,让你能在几分钟内搭建起一个功能强大的WhatsApp AI聊天机器人。它不仅仅是一个简单的问答脚本,而是一个具备多模态理解能力、可定制行为、并能通过函数调用(Function Calling)集成外部数据(如CRM、数据库)的虚拟助手。
这个方案的核心价值在于,它极大地降低了企业或个人利用WhatsApp这一全球高活跃度平台进行自动化客户服务、营销或互动的技术门槛。你不需要从零开始研究WhatsApp Business API复杂的审核流程和Webhook机制,Wassenger API充当了中间层,处理了与WhatsApp官方的复杂连接和消息收发。而你只需要专注于定义AI机器人的“大脑”——即它的对话逻辑、知识库和业务规则。
接下来,我将以一个资深全栈开发者的视角,带你从零开始,一步步拆解这个项目的部署、配置、定制化以及背后的核心原理。无论你是想为小型电商搭建一个7x24小时的订单查询机器人,还是想为知识付费社群创建一个智能答疑助手,这篇文章都能给你提供可直接落地的方案和避坑指南。
2. 核心架构与工作原理拆解
在动手写代码之前,理解整个系统是如何协同工作的至关重要。这能帮助你在出现问题时快速定位,也能让你明白每个配置项的意义,从而进行更有效的定制。
2.1 技术栈与数据流全景图
整个系统可以看作由四个核心部分组成:
- 用户端 (User): 即普通的WhatsApp用户,他们向你的机器人号码发送消息(文本、图片、语音)。
- 通信桥梁 (Wassenger API): 这是项目的关键。Wassenger作为一个云服务,已经获得了与WhatsApp官方对接的许可。你的机器人程序并不直接连接WhatsApp服务器,而是连接Wassenger的API。Wassenger负责将用户发送到你的绑定号码的消息,通过Webhook转发给你的机器人服务器,同时将你机器人生成的回复,通过其API发送回用户。
- AI大脑 (OpenAI API + 你的服务器): 这是机器人的智能核心。你的服务器(可以是本地电脑或云服务器)运行着这个Node.js项目。它接收来自Wassenger的Webhook消息,提取内容(文本、或处理后的图片/语音转录文本),然后构造一个包含对话历史、自定义指令的提示词(Prompt),发送给OpenAI的Chat Completions API(例如GPT-4o)。OpenAI返回AI生成的回复文本,你的服务器再将其通过Wassenger API发回。
- 增强模块 (Function Calling / RAG): 这是让机器人变得“专业”的部分。通过在提示词中声明一系列“工具函数”,AI在认为需要时(例如用户问“我的订单到哪了?”),会主动要求调用某个函数(如
getOrderStatus)。你的服务器执行这个函数,可能是去查询内部数据库或调用第三方API,获取实时数据后,再将结果喂给AI,由AI组织成自然语言回复给用户。这就是检索增强生成(RAG)的简单实现。
整个数据流是一个闭环:用户消息 -> WhatsApp -> Wassenger -> 你的Bot服务器 -> OpenAI -> 你的Bot服务器 -> Wassenger -> WhatsApp -> 用户。
2.2 为什么选择Wassenger + OpenAI这个组合?
你可能会问,为什么不直接用WhatsApp Business API,或者用其他机器人框架?
- 绕过官方API的复杂性: WhatsApp Business API的申请、审核、合规要求对于个人或小团队来说门槛较高。Wassenger作为中间件,提供了一个更友好的开发者入口,快速上手。
- 稳定性与维护: Wassenger负责维护与WhatsApp底层协议的连接,包括处理重连、消息队列等,让你的机器人更稳定。你自己只需要维护AI逻辑部分。
- OpenAI的能力泛化性: 使用GPT这类大语言模型,意味着你不需要为每一个可能的用户问题编写硬编码的回复规则。AI能够理解自然语言的多样性,并通过微调指令(Prompt Engineering)来塑造其行为,灵活性远超传统的规则引擎。
- 成本与可控性: 相比一些全托管的SaaS聊天机器人服务,这个自部署方案让你对数据、逻辑和成本有完全的控制权。OpenAI的API调用按Token计费,对于中等规模的咨询量,成本是相对透明和可控的。
注意:使用此方案,你的消息数据会经过Wassenger和OpenAI的服务器。如果你处理的是高度敏感的用户数据,需要仔细阅读两方的隐私政策和服务条款,并考虑是否需要在此基础上增加数据加密或匿名化处理。
3. 环境准备与项目初始化
理论清晰后,我们开始动手。这部分会详细到每一个命令和可能遇到的坑。
3.1 前置条件清单
在克隆代码之前,请确保你已准备好以下所有账户和密钥,这能让你后续的配置过程一气呵成。
- Node.js环境: 确保你的电脑或服务器上安装了Node.js 16或更高版本。在终端输入
node -v检查。 - 一个可用的WhatsApp号码: 个人号或商业号均可。这个号码将作为你的机器人对外展示的号码。重要提示:用于注册Wassenger的WhatsApp号码,在绑定期间,其手机上的WhatsApp客户端可能会被登出。这是正常现象,因为Wassenger接管了该号码的会话。绑定完成后,你不能再使用官方WhatsApp App登录这个号,所有消息将通过你的机器人程序处理。
- OpenAI API密钥:
- 访问 OpenAI平台 注册/登录。
- 在左侧菜单进入“API Keys”页面,点击“Create new secret key”生成一个密钥。立即复制并妥善保存,关闭页面后将无法再次查看完整密钥。
- 支付设置(关键步骤): 新注册的OpenAI账户通常有免费额度,但可能已过期或不足以支持长期使用。你需要进入“Billing” -> “Payment methods”添加支付方式(如信用卡),并充值至少5-10美元的余额。这是API能够正常调用的前提,否则你会收到“Insufficient credits”错误。
- Wassenger账户与API密钥:
- 访问 Wassenger官网 注册免费账户。
- 登录后,在左侧菜单找到“Developers” -> “API Keys”,点击“Generate API Key”创建一个新的密钥。同样,请保存好。
- 连接你的WhatsApp号码: 在Wassenger控制台,通常会有明显的“Add Device”或“Connect WhatsApp”按钮。按照指引,用你的手机WhatsApp扫描弹出的二维码,即可完成绑定。
- Ngrok账户与令牌(仅本地开发需要):
- 如果你在本地电脑(如Mac或Windows)上运行机器人,你的本地服务器(
localhost:8080)没有公网IP,Wassenger无法将消息发送过来。Ngrok可以为你创建一个临时的公网网址,并将流量隧道到你的本地端口。 - 访问 Ngrok官网 注册免费账户。
- 登录后,在“Your Authtoken”页面找到你的令牌,形如
2AbCdEf...。
- 如果你在本地电脑(如Mac或Windows)上运行机器人,你的本地服务器(
3.2 项目获取与依赖安装
打开你的终端(Terminal, CMD, PowerShell等),执行以下命令:
# 1. 克隆项目代码到本地 git clone https://github.com/wassengerhq/whatsapp-chatgpt-bot.git # 2. 进入项目目录 cd whatsapp-chatgpt-bot # 3. 安装项目依赖(Node.js包) npm install如果git命令失败,你可以直接点击项目GitHub页面的“Code” -> “Download ZIP”,下载后解压,并在解压后的目录中打开终端执行npm install。
npm install这个过程会读取package.json文件,自动下载所有必需的库,比如用于HTTP服务器的express,用于调用OpenAI API的官方库openai,以及用于连接Wassenger API的客户端库等。如果网络较慢,请耐心等待。
3.3 核心配置文件详解
项目根目录下的config.js文件是整个机器人的大脑配置文件。用你喜欢的代码编辑器(如VS Code)打开它。我们逐部分进行配置。
第一部分:API密钥设置
找到文件开头的相关配置项,将之前准备好的密钥填入。强烈建议使用环境变量,而不是直接硬编码在文件里,这更安全,也便于在不同环境(开发/生产)切换。
// 从环境变量读取,如果不存在则使用默认值(需修改) const apiKey = process.env.API_KEY || 'ENTER_API_KEY_HERE'; // 替换为你的Wassenger API Key const openaiKey = process.env.OPENAI_API_KEY || 'ENTER_OPENAI_API_KEY_HERE'; // 替换为你的OpenAI API Key const ngrokToken = process.env.NGROK_TOKEN || 'ENTER_NGROK_TOKEN_HERE'; // 仅本地开发需要实操心得:在本地开发时,可以在项目根目录创建一个.env文件(注意文件名以点开头),内容如下:
API_KEY=你的Wassenger密钥 OPENAI_API_KEY=你的OpenAI密钥 NGROK_TOKEN=你的Ngrok令牌然后安装dotenv包 (npm install dotenv),并在config.js最顶部添加require('dotenv').config();。这样代码就能自动读取.env文件中的变量了。记得将.env添加到.gitignore中,避免密钥泄露。
第二部分:机器人行为定制
这是塑造你机器人“性格”和“能力”的核心部分。
botInstructions:这是最重要的指令。用清晰、明确的英文(GPT对英文指令理解通常更精准)描述机器人的角色、职责和边界。例如:const botInstructions = `你是一个名为“小智”的智能客服,服务于“星辰科技”公司。你专门处理产品咨询、订单状态查询和预约演示。你友好、耐心且专业。如果用户的问题超出你的知识范围(例如询问其他公司的产品、政治、暴力等内容),你应当礼貌地表示无法回答,并引导用户回到业务相关话题或转接人工。你的知识截止日期是2023年10月。对于未来的事件或实时信息,你需要调用相应的工具函数来获取。`;features: 控制机器人的功能开关。audioInput: 设为true,机器人才能接收并转录语音消息。audioOutput: 设为true,机器人才能回复语音消息。audioOnly: 谨慎开启。如果设为true,机器人将只回复语音,不回复文字。适合打造纯语音交互体验。voice和voiceSpeed: 选择语音合成的声音和语速。OpenAI提供了几种声音选项,如alloy,echo,nova等,可以逐一试听选择。imageInput: 设为true,机器人才能分析用户发送的图片。注意:图片处理会消耗更多的OpenAI Token,增加成本。
limits: 设置各种限制以防止滥用或成本失控。maxOutputTokens: 控制AI回复的最大长度。1000个Token大约对应700-750个英文单词或500个左右汉字。根据你的需要调整,太短可能回答不完整,太长则成本高且回复可能啰嗦。chatHistoryLimit: 对话历史记录条数。AI会根据这些历史记录来理解上下文。设为10-20是一个平衡点,既能保持对话连贯性,又不会因为历史过长而支付过多Token费用(OpenAI收费是按输入+输出的总Token数计算的)。maxMessagesPerChat: 单个对话的最大消息数限制。达到后,机器人会自动将会话转给人工客服(如果配置了的话),或停止回复。这是防止用户恶意刷消息的关键设置。
4. 核心功能实现与深度定制
配置好基础设置后,你的机器人已经可以运行了。但要让其真正融入你的业务,必须进行深度定制。
4.1 启动机器人并验证
在项目目录下,运行以下命令启动机器人:
# 方式一:直接运行 node main.js # 方式二:使用npm脚本(如果package.json中定义了) npm start如果一切正常,终端会输出类似以下信息:
Server is running on port 8080 Tunnel is created: https://abc123.ngrok.io -> http://localhost:8080 Webhook registered successfully: https://abc123.ngrok.io/webhook Bot is ready and listening for messages...这表示:
- 本地服务器已在8080端口启动。
- Ngrok成功创建了一个隧道,公网地址是
https://abc123.ngrok.io。 - 该地址的
/webhook路径已成功注册到Wassenger,任何发送到你绑定号码的消息都会转发到这个地址。 - 机器人开始监听消息。
现在,用另一个WhatsApp号码(不能是绑定的机器人号码本身)向你的机器人号码发送“Hello”。你应该能在几秒内收到AI的回复。
常见问题排查:
- 错误:
Error: listen EADDRINUSE: address already in use :::8080:端口8080被占用。你可以通过PORT=3000 node main.js指定另一个端口,并记得在Ngrok命令或WEBHOOK_URL中对应修改。 - 错误:
Invalid API Key:检查Wassenger或OpenAI的API密钥是否填写正确,前后是否有空格。 - 机器人无响应:检查终端是否有报错。查看Ngrok隧道状态是否正常(终端会显示)。在Wassenger控制台的“Webhooks”设置里,确认Webhook URL是否正确,并且状态是“Verified”或“Active”。
4.2 实现业务逻辑:函数调用(Function Calling)实战
这是本项目的精华所在。通过函数调用,你的机器人不再是“一本静态的说明书”,而是一个能查询实时数据、执行具体操作的“业务员”。
让我们修改config.js中的functions数组,实现一个真实的场景:查询用户订单状态。
假设你有一个简单的订单查询API,地址是https://your-internal-api.com/orders?phone={phoneNumber},它接收用户手机号,返回JSON格式的订单列表。
- 定义函数工具:在
functions数组中添加一个新对象。
const functions = [ // ... 其他已有函数 ... { name: 'getUserOrders', description: '根据用户的手机号码查询其最近的订单状态和物流信息。当用户询问“我的订单到哪了”、“查一下我的订单”时使用此功能。', parameters: { type: 'object', properties: { // 虽然AI可以从对话上下文中推断出手机号,但这里我们明确定义参数,让AI学会主动询问。 // 实际上,我们可以从Wassenger的webhook数据中直接拿到用户号码,所以这个参数在run函数里可能用不上,但定义它有助于AI理解。 phoneNumber: { type: 'string', description: '用户的手机号码,用于唯一标识用户并查询其订单。' } }, // required: ['phoneNumber'] // 这里我们不强制要求,因为我们可以从data对象中获取 }, run: async ({ parameters, response, data, device, messages }) => { // data对象包含了完整的webhook信息,其中就有发送者的号码 const userPhone = data?.contact?.phone; // 从Wassenger事件中提取用户号码 if (!userPhone) { return '无法获取您的手机号码信息,请确保您是通过WhatsApp正常会话发送消息。'; } try { // 调用你内部的订单查询API const apiResponse = await fetch(`https://your-internal-api.com/orders?phone=${encodeURIComponent(userPhone)}`); const orders = await apiResponse.json(); if (!orders || orders.length === 0) { return `您好,根据号码 ${userPhone} 查询,目前没有找到您的有效订单。`; } // 将API返回的JSON数据,组织成一段对AI友好的自然语言描述 let orderSummary = `为您查询到 ${orders.length} 个订单:\n`; orders.forEach((order, index) => { orderSummary += `\n${index + 1}. 订单号:${order.id},商品:${order.productName},状态:${order.status},物流单号:${order.trackingNumber || '暂无'}。`; }); orderSummary += `\n\n以上是您的订单概览,您可以针对某个订单号进行更详细的询问。`; return orderSummary; } catch (error) { console.error('查询订单API失败:', error); return '抱歉,订单查询系统暂时无法访问,请稍后再试或联系人工客服。'; } } } ];- AI如何工作:
- 当用户问:“我昨天买的手机发货了吗?”
- AI会根据你的
botInstructions知道自己是客服,并看到你定义了getUserOrders这个工具。 - AI判断这个问题需要查询订单数据,于是它决定调用
getUserOrders函数。它可能会尝试构造参数,比如{phoneNumber: “用户的号码”},但在这个例子中,phoneNumber不是必填项。 - 你的
run函数被执行。它从data.contact.phone拿到用户WhatsApp号码,去调用你的内部API。 - API返回数据后,
run函数返回一段文本描述。 - AI收到这段文本描述,将其作为新的上下文信息,生成最终回复:“您好,查询到您有一个订单(订单号#12345),购买的是XX手机,目前状态为‘已发货’,物流单号是YT123456789,正在运输中。”
实操心得:函数描述 (description) 至关重要。要用清晰的语言告诉AI“在什么情况下调用这个函数”。参数定义 (parameters) 要尽可能详细,这能帮助AI更准确地生成调用请求。在run函数内部,一定要做好错误处理(try-catch),并返回对AI友好的文本信息,避免返回复杂的原始JSON。
4.3 高级定制:处理黑白名单与对话状态
config.js中提供了精细化的控制选项,让你能管理哪些对话由机器人处理。
numbersBlacklist: 黑名单号码数组。列入此列表的号码发来的消息,机器人将完全忽略。numbersWhitelist: 白名单号码数组。如果设置了白名单,则只有白名单中的号码会被机器人处理,其他号码一律忽略。黑名单优先级高于白名单。skipChatWithLabels: 忽略带有特定标签的对话。你可以在Wassenger网页版或通过API给某个对话打上标签(例如“human-handover”)。被打上这些标签的对话,机器人将不再自动回复,方便人工客服介入后永久接管。
这个机制非常适合这样的工作流:机器人先处理常规咨询,当遇到复杂问题或用户明确要求“转人工”时,在你的botInstructions中指示AI回复类似“正在为您转接人工客服,请稍候”,同时你的代码(或通过Wassenger API)给该对话打上“needs-human”标签。之后,该用户的新消息就会被机器人跳过,等待你的团队在Wassenger收件箱中处理。
5. 部署到生产环境
在本地测试无误后,你需要将机器人部署到一台7x24小时运行的云服务器上,并配置一个固定的公网域名。
5.1 服务器部署指南(以Ubuntu + PM2为例)
假设你有一台云服务器(如AWS EC2, DigitalOcean Droplet, 或腾讯云CVM),系统为Ubuntu 20.04。
服务器基础准备:
# 登录服务器,更新系统 ssh your_username@your_server_ip sudo apt update && sudo apt upgrade -y # 安装 Node.js 和 npm (使用NodeSource仓库安装较新版本) curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt install -y nodejs git # 验证安装 node -v npm -v部署项目代码:
# 克隆你的项目代码(如果使用Git) git clone https://github.com/your-username/whatsapp-chatgpt-bot.git cd whatsapp-chatgpt-bot npm install --production # 只安装生产依赖 # 或者,如果你已经在本地开发完成,可以使用scp或rsync上传 # scp -r ./whatsapp-chatgpt-bot your_username@your_server_ip:/path/to/project配置环境变量:在服务器上,最安全的方式是使用系统服务或进程管理器的环境配置。我们使用PM2。
# 全局安装PM2进程管理器 sudo npm install -g pm2 # 在项目根目录创建 ecosystem.config.js 文件 module.exports = { apps: [{ name: 'whatsapp-ai-bot', script: 'main.js', instances: 1, // 根据CPU核心数调整 autorestart: true, watch: false, max_memory_restart: '500M', env: { NODE_ENV: 'production', PORT: 8080, // 你的应用监听端口 API_KEY: '你的Wassenger生产环境API_KEY', OPENAI_API_KEY: '你的OpenAI生产环境API_KEY', WEBHOOK_URL: 'https://your-domain.com/webhook' // 你的服务器公网域名 } }] };配置域名与SSL:你需要一个域名(例如
bot.yourcompany.com)并解析到你的服务器IP。然后使用Nginx作为反向代理,并配置SSL证书(使用Let‘s Encrypt免费证书)。- 安装Nginx和Certbot:
sudo apt install -y nginx certbot python3-certbot-nginx - 配置Nginx站点:
写入以下内容(替换sudo nano /etc/nginx/sites-available/whatsapp-botyour-domain.com):server { listen 80; server_name your-domain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name your-domain.com; ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; location / { proxy_pass http://localhost:8080; # 指向你的Node.js应用 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade; } } - 启用站点并获取SSL证书:
sudo ln -s /etc/nginx/sites-available/whatsapp-bot /etc/nginx/sites-enabled/ sudo nginx -t # 测试配置 sudo systemctl reload nginx sudo certbot --nginx -d your-domain.com # 按照提示操作获取并安装证书
- 安装Nginx和Certbot:
启动应用并设置开机自启:
cd /path/to/your/project pm2 start ecosystem.config.js pm2 save # 保存当前进程列表 pm2 startup # 生成开机自启动脚本,按提示执行命令更新Wassenger Webhook:现在你的服务器有了固定的HTTPS地址
https://your-domain.com。你需要将Wassenger的Webhook地址更新为此地址加上/webhook路径。这可以通过Wassenger的开发者API或(如果支持)其控制台设置来完成。由于本项目在启动时会自动注册Webhook,你只需确保config.js中的webhookUrl配置项(或通过环境变量WEBHOOK_URL)正确设置为https://your-domain.com/webhook,然后重启PM2进程即可。
5.2 监控与日志
部署上线后,监控至关重要。
- 查看日志:
pm2 logs whatsapp-ai-bot # 查看实时日志 pm2 logs whatsapp-ai-bot --lines 100 # 查看最近100行 tail -f ~/.pm2/logs/whatsapp-ai-bot-out.log # 查看标准输出日志 tail -f ~/.pm2/logs/whatsapp-ai-bot-error.log # 查看错误日志 - 监控进程状态:
pm2 status或pm2 monit。 - 设置告警:可以配置PM2在应用崩溃时自动重启,并结合服务器监控(如云服务商监控、UptimeRobot等)对HTTP端点进行健康检查。
6. 成本优化与性能调优
项目运行起来后,你需要关注两个主要成本:Wassenger的服务费和OpenAI的API调用费。
6.1 OpenAI API成本控制
成本 = (输入Token数 + 输出Token数) × 单价。GPT-4o比GPT-3.5-Turbo贵,但能力更强。
- 优化提示词(Prompt):
botInstructions要精炼。避免冗长的、重复的指令。在limits中合理设置maxOutputTokens,避免AI生成过于冗长的回复。 - 管理对话历史:
chatHistoryLimit是关键。对于大多数客服场景,保留最近10-15条消息足以维持上下文连贯性。更早的历史可以被安全地丢弃,这能显著减少每次API调用消耗的输入Token。 - 选择性启用多模态:如果业务不需要,将
features.imageInput设为false。图片上传和描述会消耗大量Token。 - 使用更经济的模型:在
config.js中查找model配置项(如果项目支持)。对于文本对话,可以尝试使用gpt-3.5-turbo而不是gpt-4o,成本会低一个数量级,但推理能力会下降。你需要根据业务需求权衡。 - 实施速率限制和缓存:可以在代码层面增加逻辑,对同一个用户在一定时间内的请求频率进行限制。对于常见问题,可以构建一个简单的内存或Redis缓存,将AI的回复缓存一段时间,对于相同的问题直接返回缓存答案。
6.2 Wassenger成本与消息管理
Wassenger通常根据发送的消息条数或联系人数量计费。
- 合理使用会话分配:利用好
skipChatWithLabels和自动转人工逻辑。一旦对话被人工接管,就不要再让机器人回复,避免产生不必要的消息费用。 - 监控消息队列:定期在Wassenger控制台查看消息日志,检查是否有异常的大量消息发送,防止因程序BUG或恶意用户导致的费用激增。
- 利用免费额度:了解Wassenger免费套餐的限制,在初期测试和小规模使用阶段充分利用。
6.3 性能与稳定性
- 错误处理与重试:在调用OpenAI API和Wassenger API时,代码必须有完善的错误处理(try-catch)。对于网络超时等临时错误,应实现指数退避重试机制。
- 异步处理与队列:如果消息量很大,可以考虑引入消息队列(如Bull,基于Redis)。当Webhook收到消息后,立即响应Wassenger“已接收”(返回200状态码),然后将消息推入队列,由后台工作进程异步处理AI调用和回复。这能避免因AI响应慢导致Webhook超时。
- 数据库持久化:项目默认使用内存存储对话历史。服务器重启后历史会丢失。对于生产环境,你应该将会话历史存储到数据库(如MongoDB, PostgreSQL)中。这需要修改
store.js或相关逻辑。
7. 常见问题与故障排除实录
在实际部署和运行中,你几乎一定会遇到下面这些问题。这里记录了我踩过的坑和解决方案。
问题1:机器人收不到消息,终端无任何日志输出。
- 排查步骤:
- 检查Wassenger设备状态:登录Wassenger控制台,确认你的WhatsApp设备(Device)状态是“Connected”而不是“Disconnected”。有时WhatsApp会话会过期,需要重新扫码连接。
- 检查Webhook配置:在Wassenger控制台的“Webhooks”或“Developers”部分,查看注册的Webhook URL是否正确,状态是否是“Verified”。可以尝试手动发送一条测试消息,看Wassenger的日志里是否有尝试向你的Webhook URL发送请求的记录。
- 检查服务器可达性:在浏览器或使用
curl命令访问你的https://your-domain.com/webhook。如果部署在本地并使用Ngrok,访问Ngrok提供的地址。你应该能看到一个简单的页面或收到一个“Cannot GET /webhook”的错误(这正常,因为这是POST端点)。如果完全无法访问,检查防火墙(如云服务器的安全组)是否开放了80/443端口,以及Nginx/Node.js服务是否在运行。 - 检查PM2/Nginx日志:查看应用错误日志和Nginx错误日志 (
sudo tail -f /var/log/nginx/error.log),寻找线索。
问题2:机器人能收到消息,但回复失败,终端报错OpenAI Error: 429 Too Many Requests。
- 原因与解决:这是触发了OpenAI的速率限制。免费用户和不同付费等级的API调用都有每分钟/每天的请求数(RPM)和Token数(TPM)限制。
- 短期:立即停止发送消息,等待一段时间(通常是1分钟)再试。
- 长期:在代码中实现请求排队和速率限制。可以使用
p-limit、bottleneck这类库来控制向OpenAI发送请求的频率。例如,限制为每秒不超过2-3个请求。同时,检查你的limits.maxOutputTokens是否设置过高,导致单次请求消耗Token过多。
问题3:用户发送图片或长语音后,机器人回复很慢,甚至超时。
- 原因:图片和语音需要先进行处理。语音需要调用OpenAI的Whisper API进行转录,图片需要编码后发送给GPT-4o Vision模型识别。这些操作都比纯文本处理耗时更长,且消耗更多Token。
- 解决:
- 优化配置:在
limits中设置maxAudioDuration和maxImageSize,过滤掉过长的音频和过大的图片。 - 异步处理:如前所述,引入消息队列。Webhook接收消息后立即返回成功,在后台异步处理多媒体内容,处理完成后再通过Wassenger API发送回复。这能避免Webhook请求超时(Wassenger可能有30秒左右的超时限制)。
- 成本考量:评估是否真的需要多媒体支持。如果大部分是文本咨询,可以考虑关闭
imageInput。
- 优化配置:在
问题4:AI的回复不符合预期,比如回答了无关话题或语气不对。
- 解决:这是提示词工程(Prompt Engineering)问题。仔细打磨你的
botInstructions。- 角色扮演要明确:“你是一个专注于XX业务的客服助手,你的名字叫XX。”
- 划定清晰边界:“你只能回答与[你的产品/服务]相关的问题。对于其他任何话题,包括但不限于政治、宗教、暴力、其他公司产品等,你都必须礼貌地拒绝回答,并引导用户回到业务咨询。”
- 提供示例:在指令中提供几个“好的回答”和“坏的回答”的例子,让AI更好地理解你的期望。
- 使用系统级指令:在OpenAI的对话API中,
system角色的消息对模型行为影响最大。确保你的核心指令是通过system消息传递的。
问题5:如何让机器人在特定条件下自动转人工?
- 实现思路:这需要结合函数调用和Wassenger的API。
- 在
botInstructions中告诉AI:“当用户明确要求‘转人工’、‘找真人客服’,或者你无法解决用户的问题时,请调用requestHumanAgent函数。” - 在
functions数组中实现这个函数。在这个函数的run方法里,调用Wassenger的API(需要你查阅Wassenger API文档),将当前对话分配给某个客服组或特定客服。同时,可以给对话打上“human-handover”标签。 - 在
config.js的skipChatWithLabels中加入“human-handover”。这样,一旦对话被打上这个标签,机器人就会自动跳过,后续消息直接进入人工客服的Wassenger收件箱。
- 在
这个项目的魅力在于它提供了一个强大且灵活的基础框架。你可以在此基础上无限扩展,集成你的CRM、订单系统、知识库,打造出一个真正理解你业务、能7x24小时服务的智能数字员工。从简单的自动问答开始,逐步迭代,你会发现人机协作的效率和客户体验的提升是实实在在的。
