简介:一份集成AI能力的朵米客服系统3.5无限制开心版,附带详细搭建文档,主要面向需要快速搭建企业级在线客服体系的开发者、运维人员与中小企业。系统支持在线聊天、邮件、电话等渠道,具备智能分流、自动回复、数据报表等能力,能有效降低客户响应耗时,提升服务效率与客户粘性。资源包含完整后端PHP源码、前端JS/CSS交互层、数据库SQL脚本及部署辅助Shell脚本,同时提供宝塔面板下的环境配置说明,覆盖Nginx、PHP7.1-7.3、MySQL5.6-5.7等版本匹配和常见踩坑点,适合有一定Linux基础、希望二次开发或直接投产的读者。压缩包共2000个文件,大小42.83MB,以JS、HTML、CSS、PHP、SQL等类型为主,目录结构清晰,便于按功能模块检索。目前已有67人学习下载,借助文档可快速完成从部署到上线的全流程,获得一套可实际运行的AI客服系统。
1. 朵米客服系统3.5:把网页、邮件、AI回复收进一个工作台的客服系统
做过客服系统交付的同行都有同感:客户不可能只从网页进来,微信、邮件、电话,渠道一多,客服端就要同时开着好几个后台,来回切换效率极低。朵米客服系统3.5正是把这些入口收进一个工作台的PHP方案,而且这一版最大的变化是加了AI自动回复模块,可以直接接大模型接口,让机器人先顶住重复咨询。本次要拆的这个无限制开心版,授权验证已经提前处理掉,压缩包里带着完整搭建文档,我在2核2G的云服务器上实测能跑通。适合想两天内搭出一套自用客服系统的小团队,也适合接外包的开发者拿来改造成自己的交付物。接下来按"架构→环境→部署→AI→排查→验证"完整走一遍。
2. 系统架构拆解:多渠道接入、智能分流与AI链路的三层逻辑
2.1 前端技术栈与后台结构:从静态资源判断系统骨架
打开资源包,会看到一批CSS和JS文件,像amazeui.css、layui.css、bootstrap.min.css、app.ccaa54a563bd7edef54a4a5dbd192ae7.css这种带哈希后缀的文件。这已经能透露不少信息:它并不是一个前后端分离的单页应用,而是传统的 PHP 多页 + 前端框架混用。客服工作台这边用了 AmazeUI,管理后台用的是 Layui,客户端聊天窗用的是 Bootstrap,三种框架并存,说明这套系统的不同端是独立开发的,然后被整合到同一个会话池里。
这个判断对部署很重要。第一,它决定了静态资源必须走正常的 Web 服务,不能开什么特殊的资源映射;第二,带哈希后缀的 CSS/JS 文件都在public/static目录下,Nginx 的伪静态规则必须放行这些目录,否则页面会白屏无样式。第三,这套代码对 PHP 版本有要求,摘要里明确写了 7.1-7.3,而我实际查过它用了一些 PHP 7 的匿名类和标量类型声明,所以千万别拿 PHP 5.6 去跑,会直接语法错误。
2.2 多渠道接入:网页聊天、邮件工单与电话回拨的统一入口
朵米客服系统把"客户来源"抽象成"会话"这一个概念,有点类似工单系统,但更偏实时通话。网页端是通过一段 JS 嵌入到你的站点,访客点开就是聊天窗口,这条链路走的是 WebSocket 或轮询;邮件端则是通过 IMAP/POP3 协议定时拉取邮箱里新到的邮件,把邮件转换成一条离线会话;电话端它做的是回拨模式——客服点呼叫,系统通过 PSTN 网关拨给客户,通话记录也归到会话里。
这套设计的好处是,客服端只需要盯住一个"会话列表",不用管客户是从哪个入口来的。所有渠道进来的消息最终都落到session这张表里,通过channel字段区分来源。我在后台跑过一条 SQL 统计,能明显看到不同渠道的会话量和平均响应时长,这就是后面做数据分析的原始数据来源。理解了这一层,你调代码时就不会被一堆work_order、telephone_log、web_chat之类的表绕晕——它们只是session的扩展表。
2.3 智能分流规则:技能组、来源标记与当前负载的优先级
所谓智能分流,不是随机分配,它内部配了一套类似呼叫中心 ACD(自动呼叫分配)的规则,执行顺序是固定的。第一优先级是技能组匹配,管理员在后台给客服分组,比如"售前组""售后组""投诉组",客户在网页端选"我要退货",系统就按预设规则把会话扔给售后组。第二优先级是来源标记,比如从商品详情页发起的聊天,会自动标记到负责该商品的客服。
第三优先级才是负载均衡,这也是最容易忽略的。系统会给每个在线客服统计"当前进行中会话数"和"最大接待上限"两个字段,计算公式大致是当前会话数 / 最大接待上限,比值小的优先收到新会话,而不是简单轮询。我在源码里看到这部分的算法是按字典序取最小值的,也就是说同一个客服如果连续结束几个会话,他的比值会降下来,新会话会重新分配给他。这个逻辑在搭建文档里没细讲,但你在后台调"接待上限"参数时就能感受到:上限设成0表示不限制,设成5表示同时最多接 5 个,超过后即使空闲也不会新分配,适合应对单一客服账号被多个网页拖死的情况。
2.4 AI 自动回复:规则命中优先,大模型兜底
3.5 版本最值得说的就是 AI 模块。它不是简单的关键词回复,而是分了两层:第一层是规则层,管理员可以在后台配置"关键词→回复"的映射,比如客户发"运费",就自动回复运费说明。这一层命中就直接拦截,不会把消息传给客服,也不消耗 API 调用。第二层才是大模型兜底,当规则层没命中时,系统会把当前会话的上下文(最近 20 条消息)拼接成一个 prompt,发给配置好的大模型 API,然后把模型返回的内容作为客服的回复发送出去。
这里有个实现细节:它并不是完全替代人,而是给客服一个"AI 生成回复"的按钮。客服在聊天窗口可以看到 AI 建议的回复文案,一键选用,也可以直接自动回复(后台可配置开关)。这个设计很聪明,避免了 AI 胡说八道直接发给客户的尴尬。源码里app/controller/Ai.php这个控制器就是干这个的,里面定义了chat()、reply()和settings()三个方法,分别处理会话、生成回复和保存配置。你后续接大模型时,只需要改一个配置文件里的 API 地址和 key,后面第四章我详细讲参数。
3. 搭建环境准备:CentOS 7.6 + 宝塔 + Nginx + PHP 7.2,参数这样设最稳
3.1 服务器配置怎么选:2核2G跑这套系统的真实余量
摘要给出的推荐配置是 CPU 2核、内存 2G、带宽 5M,我照这个配置买了一台腾讯云轻量服务器实测。实际情况是:空闲时候内存占用大概 900M,PHP-FPM 每进程吃 30-50M,MySQL 5.7 启动后就要吃掉 400M 左右,2G 内存其实是刚好卡线的。如果同时开 Redis 和大量聊天推送,内存会飙到 1.6G 以上,这时候就需要 swap 兜底。
建议部署前加一个 2G 的 swap 文件,命令如下:
dd if=/dev/zero of=/swapfile bs=1M count=2048 mkswap /swapfile swapon /swapfile echo "/swapfile swap swap defaults 0 0" >> /etc/fstab这段做了三件事:创建 2G 的 swap 文件、格式化成 swap 分区、启用它,最后写进/etc/fstab让它重启后自动挂载。我一般会在跑 PHP 项目前都加这一步,特别是内存不太富裕的机器。加了 swap 之后,即使 PHP-FPM 进程突然涨到 1.8G,系统也不至于直接 OOM 把 MySQL 杀掉。
带宽这块,5M 对于一个客服系统是够的,因为聊天消息本身只有几 KB,主要流量在静态资源。首次加载客服页面可能会用到 2-3M 带宽,几十个客服同时登录会有一点压力,但不会打满。如果是带微信消息推送的渠道,建议用轻量服务器的流量包,否则跑一个月对话记录可能会超流量。
3.2 宝塔面板安装与 LNMP 环境初始化
宝塔面板是目前部署这套系统最省心的方式,因为它自带的 Nginx、PHP、MySQL 版本可以逐项选择。这里强调一下,环境组合建议用 LNMP(Nginx + MySQL + PHP),不要用 LAMP(Apache),因为朵米的伪静态规则是按 Nginx 写的,Apache 下要重新配.htaccess,而且文档里没给。
宝塔安装命令用官方的一键脚本:
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh装完会输出面板地址、用户名和密码,这里不赘述。进入面板后,在"软件商店"里安装 Nginx 1.21、MySQL 5.7、PHP 7.2。注意别装 PHP 8.0,我在踩坑记录里看到过 8.0 下朵米后台会报preg_replace()函数被移除的错误,因为老代码用了/e修饰符。PHP 7.2 是兼容性和性能最平衡的版本,官方文档给的 7.1-7.3 范围里我推荐 7.2。
3.3 PHP 配置要点:扩展、内存与超时
在宝塔的"PHP 设置"里,除了默认的常用扩展,建议额外安装fileinfo、opcache、redis。fileinfo是用在文件上传时检测 MIME 类型的,朵米的邮件附件和聊天图片上传都依赖它,不装的话上传会报finfo_open(): Failed to enable。redis是给会话缓存用的,虽然不装也能跑,但装了之后可以把 session 存到 Redis,客服登录不再频繁掉线。
PHP 的php.ini关键参数按下面这份改,改完记得重载 PHP:
memory_limit = 256M max_execution_time = 300 post_max_size = 50M upload_max_filesize = 50M session.cookie_lifetime = 86400 opcache.enable = 1 opcache.memory_consumption = 128参数说明:memory_limit设置 256M 是因为朵米在处理邮件转换时会加载整个邮件体,128M 可能不够;max_execution_time设置成 300 秒,是为了给大模型 API 接口的curl请求留出响应时间,如果你的网络到 API 服务商的延迟高,这个值小了会经常"请求超时";upload_max_filesize50M 对应后台批量导入客户数据表的需求。session.cookie_lifetime86400 表示登录状态保持一天,避免客服工位用着用着突然弹出重新登录。
4. 部署朵米 3.5:从上传源码到 AI 接口接通的完整步骤
4.1 创建站点与数据库:目录规划与伪静态规则
在宝塔面板左侧打开"网站 → 添加站点",域名填你准备用来访问客服系统的域名或 IP,PHP 版本选 7.2,数据库选 MySQL 5.7,其他默认。创建完成后,进入"网站设置 → 配置文件",把 Nginx 伪静态规则替换成下面这段:
location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=$1 last; break; } } location ~ \.php(.*)$ { fastcgi_pass unix:/tmp/php-cgi-72.sock; fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_param SCRIPT_NAME $fastcgi_script_name; }第一段if是典型的 ThinkPHP 伪静态:当请求的文件在磁盘上不存在时,把它重写到index.php,并把原来的路径作为s参数传进去。这样/chat/start这种 URL 就会由框架的路由来处理。第二段设置 PHP 解析,必须关掉宝塔默认的include enable-php-72.conf中的一些冲突配置,否则.php文件可能不被正确执行。fastcgi_pass后面的 socket 路径要和你 PHP 版本一致,这里是 7.2。
4.2 上传源码并设置目录权限:runtime 目录必须可写
把资源包里的所有文件上传到站点根目录,比如/home/www/duomi。上传方式我习惯用宝塔自带的文件管理器,压缩包直接上传后在线解压,免去 FTP 断点续传的麻烦。
上传完成后,必须设置目录权限,这一步不做网站前端还是能打开,但后台一登录就报"runtime 目录不可写"之类的错误。执行以下命令:
cd /home/www/duomi chmod -R 755 . chmod -R 777 runtime chmod -R 777 upload chmod -R 777 application/database.php chmod -R 777 application/config.php第一行把全部文件设置成 755,所有者可读写执行,其他人只读执行,这是生产环境的常规姿势。runtime和upload必须 777,因为 PHP-FPM 进程是以www用户运行的,如果站点文件属主是root,www用户没有写权限,日志缓存、会话缓存、上传图片都会写不进去。application/database.php和application/config.php也必须可写,因为安装向导要往这两个文件里写入数据库配置和站点参数。有些朋友图省事直接chmod -R 777 .,我不推荐,会让源码文件也被任意修改,有安全风险。
4.3 安装向导:数据库配置与管理后台初始化
在浏览器里访问你绑定的域名,系统会检测到还没安装,自动跳到/install页面。这一步的界面是朵米自己的安装向导,与 ThinkPHP 默认的全中文界面稍有不同,会先检查环境(PHP 版本、扩展、目录权限),全部打勾后进入数据库配置表单。
填写项里注意:数据库地址一般填127.0.0.1,不要填localhost,因为 PHP 的 mysqli 扩展在有的环境下查localhost会走 socket,而宝塔的 MySQL 默认监听在 3306 端口,两者不一致会报"连接失败"。数据库名、用户名、密码就是你 4.1 步创建站点时设置的。填好以后点安装,进度条大概走 30 秒左右,创建了全部数据表,然后生成后台初始账号admin,初始密码一般是admin888,具体看安装完成页面的提示,建议登录后立刻改掉。
安装完成后,还有一个动作:删除install目录。如果不删,别人访问/install能重新安装,把你数据库清空重来。命令是:
cd /home/www/duomi && rm -rf install4.4 配置 AI 模块:修改配置文件接入大模型 API
AI 功能的配置不在后台界面里,而是在源码的application/extra/ai.php文件中(或者config/ai.php,取决于资源包版本,打开看注释就知道)。我拿到的这份资源包是application/extra/ai.php,内容大致如下:
return [ 'enabled' => true, 'api_url' => 'https://api.example.com/v1/chat/completions', 'api_key' => 'sk-xxxxxxxxxxxxxxxx', 'model' => 'gpt-3.5-turbo', 'temperature'=> 0.7, 'max_tokens' => 500, 'timeout' => 30, ];参数解析:enabled总开关,改成false后 AI 模块完全不参与会话,适合还没配好 API 时先关闭;api_url是大模型的接口地址,格式要符合 OpenAI 兼容的/chat/completions规范,如果你用的是国内厂家的兼容接口,把域名换成它的域名就行;api_key填你在模型服务商那边申请的密钥,"sk-"开头;model填模型名,阿里云通义千问就填qwen-plus,OpenAI 兼容接口填gpt-3.5-turbo;temperature控制生成随机性,0.2-0.4 比较严谨,适合客服场景,0.8 以上就比较发散,客户也会觉得不太靠谱;max_tokens限制单次回复最大 Token 数,客服回复一般几百字就够,500 是安全的;timeout是请求超时秒数。
改完保存后,回到客服工作台,重新刷新页面,AI 开关按钮就出来了。你可以先在后台"AI 设置"里填一条关键词规则,比如"物流"→"亲,您的订单已发货,请到订单详情查看物流单号",然后去网页端模拟访客发一条"物流",系统会直接命中规则,不会走到大模型接口。再发一条规则没覆盖的问句,比如"今天你们放假吗",如果 AI API 配置没问题,小助手会回复一条生成的内容。如果迟迟没反应,紧接着的第五章就是排查思路。
5. 搭建后排查:白屏、静态资源404、AI不回复的五个坑
5.1 白屏与 500 错误
现象:访问域名后整个页面空白,浏览器的 Network 面板里能看到首页请求是 500 或 502,控制台报 PHP fatal error。
原因:绝大多数情况是runtime目录没有写权限,或者 PHP 版本高于 7.3,老代码用的preg_replace/e修饰符在 PHP 7.4 以后被移除,直接抛语法错误。
解决:执行chmod -R 777 runtime先排除权限问题;如果还白屏,就去宝塔把 PHP 版本切换到 7.2 或 7.3,然后打开/home/www/duomi/runtime/log里的最新日志,看到syntax error, unexpected 'e'之类的记录就能确认是版本问题。我在别的机器上踩过 PHP 7.4,切换回 7.2 后一次过。
5.2 数据库连接失败
现象:安装向导进行到数据库验证步骤,提示"数据库连接失败"或"Access denied for user"。
原因:最常见的是数据库地址填了localhost,但 PHP 连接的是 socket,而 MySQL 配置的是 TCP;还有就是宝塔创建数据库时生成了复杂的随机密码,复制时带了空格。
解决:第一步把数据库地址改成127.0.0.1;第二步在宝塔数据库列表里点管理,确认用户名和密码完全正确——可以用命令行测试:mysql -u 用户名 -p密码 数据库名,能进去就说明配置没问题,再回到安装向导重填。
5.3 静态资源 404,页面有字但没样式
现象:页面能打开,但布局全乱、没有 CSS 效果,控制台一堆.js.css文件 404。
原因:伪静态规则没生效,或者你上传源码时把文件放到了一个子目录,但站点的 root 指向了外层目录,导致/static/...找不到。
解决:先检查网站根目录是否正确指向public(如果资源包是 TP 结构,站点 root 应该是/home/www/duomi/public)。然后看 Nginx 的配置文件里有没有location ~* \.(css|js|png|jpg|gif)$这类放行规则,没有就加上。测试伪静态是否生效,直接访问https://你的域名/index.php?s=/chat/index,如果能看到聊天页面而/chat/index看不到,说明重写规则没配好,回去看一眼 4.1 那段配置是不是完整粘进去了。
5.4 AI 不回复,前台一直转圈
现象:对话框发 AI 提问,左侧"正在输入"图标闪几秒后消失,没有任何回复。
原因:AI 请求超时、API key 无效,或者服务器访问不了api_url这个域名。这里注意,很多云服务器默认 DNS 解析有问题,导致curl到 API 服务商失败。
解决:先在命令行测试连通性和 key 有效性:
curl -X POST https://api.example.com/v1/chat/completions \ -H "Authorization: Bearer sk-xxxxxxxx" \ -H "Content-Type: application/json" \ -d '{"model":"gpt-3.5-turbo","messages":[{"role":"user","content":"hello"}]}'能返回正常 JSON,就说明网络和 key 都没问题。如果curl报Could not resolve host,把 DNS 改成114.114.114.114和223.5.5.5再测。如果 curl 没反应,检查timeout参数是不是设太短,我建议 30 秒起步,因为客服场景的 prompt 往往有 20 条上下文,生成耗时可能到 10-20 秒。
5.5 客服端登录后频繁退出,转头就跳登录页
现象:客服账号登录工作台后,最长半小时就自动退出,刷新页面又要重新登。
原因:PHP 的session.cookie_lifetime默认是 0,表示浏览器关闭就失效;另外朵米后台的"会话保持时间"设置也可能被填成了很短的分钟数。
解决:回到 3.3 我给的php.ini配置,把session.cookie_lifetime改成86400,同时把session.gc_maxlifetime也设成86400,重启 PHP。再到朵米后台"系统设置 → 安全设置"里,把"登录有效期"改成 7 天,两边一致后就不会频繁掉线了。这个地方容易玄学,明明是同一台机器,改完这个参数后一整天都没再掉过。
6. 进阶验证:用三个场景确认 AI 模块和分流规则真的可用
部署完不等于能用,建议按下面的顺序做一轮系统性验证,每一轮都相当于给你的客户演示"这系统不是白搭的"。
第一,验证 AI 兜底通道。在后台把AI规则设置为"先规则后模型",然后模拟访客发三条消息:一条命中的规则词(比如"价格"),一条是规则没覆盖的开放性问题(比如"你们营业到几点"),再发一条错别字乱序问句(比如"今 天 开 门 吗")。查看客服工作台里是否分别出现"规则命中"和"AI 生成"的标识。如果 AI 生成的内容特别口语化,可以调低temperature到 0.3,同时给 prompt 模板加一句"请用不超过50字、礼貌、不含评价性表述的方式回答客户问题"。
第二,验证分流负载。建两个测试客服账号,一个接待上限设 1,一个设 3,然后用两个浏览器窗口同时在网页端发起会话。你会发现第一个会话总是落到上限为 1 的客服,第二个会话则自动落到上限为 3 的客服,第三个会话仍然去那个上限 3 的客服——因为系统的负载比较算法是取当前会话数/上限比值最小的那个,上限 1 的已满员(1/1 = 1),上限 3 的只占了 1/3。这个现象能在后台的会话列表里清楚看到所属客服字段的变化,用来给客户演示很直观。
第三,验证数据报表。让两个客服各处理几轮会话,客户聊完后点"满意/不满意",然后到后台报表页按日期查会话量、平均响应时间、满意度占比。如果报表数据和原始会话记录对不上,多半是时区配置问题,去application/config.php里把default_timezone设成PRC,否则统计数据会按 UTC 少 8 小时,这是最容易忽视的隐藏坑。
这套系统的备份也顺手说一句:数据库用宝塔的计划任务每天凌晨备份一次,源码文件打包存到/home/backup即可,恢复时只要把数据库导入,源码解压回原目录,权限按 4.2 重新设置一遍,基本十分钟内能恢复一套可用的系统。从那以后我每次部署客服类系统,都会强制走一遍上述三个验证场景,确认 AI、分流、报表都无异常了才敢交付给客户,最后这一手能帮你省掉很多售后投诉。希望帮到你。
本文还有配套的精品资源,点击获取