ServiceBot - InnoShop 智能客服插件
基于 Laravel AI SDK 的全功能智能客服系统,支持 AI 自动回复、实时通信、知识库 RAG、工单流转、客服工作台。
功能特性
- 🤖 AI 自动回复 — 基于 Laravel AI SDK,支持 GLM、DeepSeek、OpenAI 等多模型
- 💬 实时通信 — Laravel Reverb WebSocket,消息即时送达
- 📚 知识库 RAG — AI 回复时自动检索知识库,回答更精准
- 🎫 工单系统 — AI 无法解决时自动创建工单转人工
- 👨💼 客服工作台 — 会话管理、接管、转接、内部备注
- ⚡ 快捷回复 — 预设常用回复,提高客服效率
- ⭐ 满意度评价 — 会话结束后客户可评分
- 🌐 前台 Widget — 嵌入式聊天组件,访客无需登录
系统要求
- InnoShop Factory(Laravel 12)
- PHP 8.2+
- Redis(队列驱动)
- Laravel Reverb(WebSocket 服务,可选)
安装
1. 安装插件
# 克隆到插件目录
cd plugins
git clone git@innoshop.work:splugins/ServiceBot.git ServiceBot
2. 运行数据库迁移
php artisan migrate --path=plugins/ServiceBot/Database/migrations
迁移会创建以下数据表:
| 表名 | 说明 |
|---|---|
servicebot_conversations |
会话记录 |
servicebot_messages |
聊天消息 |
servicebot_tickets |
工单 |
servicebot_kb_categories |
知识库分类 |
servicebot_kb_articles |
知识库文章 |
servicebot_quick_replies |
快捷回复 |
servicebot_notes |
内部备注 |
servicebot_ratings |
满意度评价 |
3. 在后台启用插件
进入 后台 → 插件管理,找到 ServiceBot,点击启用。
4. 配置 .env(可选,启用实时通信)
BROADCAST_CONNECTION=reverb
QUEUE_CONNECTION=redis
REVERB_APP_ID=servicebot
REVERB_APP_KEY=your-key
REVERB_APP_SECRET=your-secret
REVERB_HOST=127.0.0.1
REVERB_PORT=8080
REVERB_SCHEME=http
启动 Reverb 服务:
php artisan reverb:start
启动队列Worker:
php artisan queue:work redis --tries=3
使用方法
后台配置
进入 后台 → 客户 → 智能客服:
| 配置项 | 说明 | 默认值 |
|---|---|---|
enabled |
启用插件 | 关闭 |
ai_enabled |
启用 AI 自动回复 | 关闭 |
auto_escalation |
AI 无法回答时自动转人工 | 关闭 |
welcome_message |
客户首次打开聊天的欢迎语 | "Hello! How can I help you today?" |
AI 模型配置
ServiceBot 使用系统默认 AI 配置(不再需要独立 API Key)。在 后台 → 设置 → AI 工具 中配置:
- 选择默认模型(如 GLM、DeepSeek)
- 填入对应 API Key
- ServiceBot 自动使用配置的模型
前台聊天 Widget
插件启用后,前台页面自动注入右下角聊天气泡。访客点击即可开始对话:
- 点击气泡 → 展开聊天窗口
- 访客发送消息 → 创建新会话
- AI 自动回复(需开启
ai_enabled) - AI 无法回答 → 自动创建工单转人工(需开启
auto_escalation)
客服工作台
进入 后台 → 客户 → 智能客服:
- 左侧:会话列表(按未读/时间排序)
- 右侧:聊天区域,可直接回复客户
- 操作:
- 接管:客服认领会话
- 转接:转给其他客服
- 关闭:结束会话
- 备注:添加内部备注(客户不可见)
- 快捷回复:使用预设模板快速回复
知识库管理
进入 后台 → 客户 → 智能客服 → 知识库:
- 创建分类(如"退换货政策"、"物流查询")
- 添加文章,填写标题和内容
- AI 回复时会自动检索相关文章作为上下文
API 接口
前台接口(无需认证)
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/servicebot/chat/conversations |
创建/获取会话 |
| GET | /api/servicebot/chat/conversations/{id} |
获取会话详情 |
| POST | /api/servicebot/chat/messages |
发送消息 |
| GET | /api/servicebot/chat/messages |
获取消息列表 |
| POST | /api/servicebot/chat/ratings |
提交满意度评价 |
后台接口(需管理员认证)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /panel/servicebot/conversations |
会话列表 |
| GET | /panel/servicebot/conversations/{id} |
会话详情 |
| POST | /panel/servicebot/conversations/{id}/claim |
接管会话 |
| POST | /panel/servicebot/conversations/{id}/close |
关闭会话 |
| POST | /panel/servicebot/conversations/{id}/transfer |
转接会话 |
| POST | /panel/servicebot/conversations/{id}/messages |
发送消息 |
| GET | /panel/servicebot/conversations/{id}/notes |
备注列表 |
| POST | /panel/servicebot/conversations/{id}/notes |
添加备注 |
| GET | /panel/servicebot/conversations/quick-replies |
快捷回复列表 |
| POST | /panel/servicebot/conversations/quick-replies |
创建快捷回复 |
| DELETE | /panel/servicebot/conversations/quick-replies/{id} |
删除快捷回复 |
| GET | /panel/servicebot/conversations/stats |
统计数据 |
| GET | /panel/servicebot/conversations/agents |
在线客服列表 |
数据模型
Conversation (会话)
├── hasMany Message (消息)
├── hasMany Ticket (工单)
├── hasMany Note (内部备注)
├── hasOne Rating (满意度评价)
└── belongsTo Customer (客户)
KbCategory (知识库分类)
└── hasMany KbArticle (知识库文章)
QuickReply (快捷回复)
目录结构
ServiceBot/
├── Boot.php # 插件启动引导
├── fields.php # 插件配置定义
├── Controllers/
│ ├── Admin/
│ │ ├── AgentController.php # 客服操作(接管/关闭)
│ │ ├── ConversationController.php# 会话管理
│ │ ├── KbController.php # 知识库管理
│ │ └── TicketController.php # 工单管理
│ └── Frontend/
│ └── ChatController.php # 前台聊天 API
├── Models/
│ ├── Conversation.php
│ ├── Message.php
│ ├── Ticket.php
│ ├── KbCategory.php
│ ├── KbArticle.php
│ ├── QuickReply.php
│ ├── Note.php
│ └── Rating.php
├── Services/
│ ├── AIService.php # AI 调用封装
│ ├── KbService.php # 知识库检索
│ └── TicketService.php # 工单逻辑
├── Jobs/
│ └── AIReplyJob.php # AI 异步回复(Queue Job)
├── Events/
│ ├── NewMessage.php # 新消息广播
│ ├── NewConversation.php # 新会话广播
│ ├── NewTicket.php # 新工单广播
│ ├── ConversationClaimed.php # 会话被接管广播
│ └── ConversationClosed.php # 会话关闭广播
├── Routes/
│ ├── root.php # 前台 API 路由
│ ├── panel.php # 后台管理路由
│ └── channels.php # WebSocket 频道
├── Public/
│ ├── js/
│ │ ├── chat-widget.js # 聊天窗口组件
│ │ ├── servicebot-widget.js # Widget 初始化
│ │ └── websocket.js # WebSocket 连接
│ └── css/
│ └── chat-widget.css # Widget 样式
├── Views/
│ ├── panel/ # 后台页面
│ └── admin/ # 管理页面
├── Database/
│ └── migrations/ # 数据库迁移
└── Resources/
└── lang/ # 多语言
工作流程
访客发送消息
↓
ChatController::sendMessage()
↓
保存 Message 到数据库
↓
┌─ broadcast(NewMessage) → Reverb → 客服后台实时收到
│
└─ dispatch(AIReplyJob) → Queue
↓
AIReplyJob::handle()
↓
┌─ KbService::search() → 检索知识库相关内容
│
└─ CustomerServiceAgent → 调用 AI 生成回复
↓
保存 AI 回复 Message
↓
broadcast(NewMessage) → 前台 + 客服后台收到
↓
如果需要转人工 → 创建 Ticket + broadcast(NewTicket)
开发路线
| Phase | 内容 | 状态 | 进度 |
|---|---|---|---|
| Phase 1 | 实时通信 + 前台 Widget + 客服后台 | ✅ 基本完成 | 95% |
| Phase 2 | AI 回复 + 知识库 RAG + 自动转人工 | ✅ 基本完成 | 90% |
| Phase 3 | 快捷回复 + 会话分配 + 满意度评价 | ✅ 基本完成 | 85% |
| Phase 4 | 数据报表(响应时间、AI 解决率、满意度) | ⬜ 未开始 | 5% |
Phase 1:实时通信 + 前台 Widget + 客服后台(95%)
✅ 已完成:
- 数据模型(8 个):Conversation, Message, Ticket, KbCategory, KbArticle, QuickReply, Rating, Note
- 数据库迁移(10 个):核心表 + 扩展字段(claimed, visitor_ip, user_agent, 全文索引)
- Boot.php:Panel 菜单注册、Broadcasting channels 注册、前台 Widget 自动注入
- 路由:panel.php(客服后台 20+ 路由)、root.php(前台 API 5 条)、channels.php(2 个 Broadcasting 频道)
- ChatController(231 行):前台完整聊天 API(创建会话、发消息、获取消息、Sanctum Token 认证、关闭会话后评价)
- ConversationController(220 行):客服后台完整管理(列表、统计、认领、关闭、转接、释放给 AI、发消息、备注管理)
- AgentController:客服管理
- KbController:知识库分类 + 文章 CRUD
- TicketController:工单管理
- 前台 Widget JS(383 行):完整聊天 UI(marked.js 渲染 Markdown、WebSocket 实时消息、气泡式对话界面)
- 后台视图(6 个):会话管理、知识库(分类+文章)、设置、工单
- 插件设置(fields.php):AI 开关、自动转人工、欢迎语、Widget 颜色、调试日志
- Events(5 个):NewMessage, NewConversation, ConversationClaimed, ConversationClosed, NewTicket
⬜ 待完善:
- Widget 移动端样式优化
- 多语言支持(前台 Widget 目前仅英文)
Phase 2:AI 回复 + 知识库 RAG + 自动转人工(90%)
✅ 已完成:
- AIReplyJob(225 行):完整 AI 回复链路
- 接入 InnoShop AIService + CustomerServiceAgent
- RAG:先查知识库构建上下文,再送 AI
- AI Tools:6 个工具(QueryOrders, QueryShipping, QueryCart, SearchProducts, CheckStock, QueryCoupons)
- 上下文构建:客户订单历史 + 商品列表自动注入
- 队列异步处理,3 次重试,backoff 策略
- 调试日志开关
- KbService:知识库搜索(LIKE + 全文索引支持)+ RAG 上下文构建
- 自动转人工:AI 回复中包含特定关键词时自动创建 Ticket
- 自动升级检测(中英文关键词匹配)
⬜ 待完善:
- 全文索引搜索优化(MySQL FULLTEXT 分词)
- AI 提示词模板管理(后台可编辑)
- 多轮对话上下文窗口优化
Phase 3:快捷回复 + 会话分配 + 满意度评价(85%)
✅ 已完成:
- QuickReply 模型 + 迁移:分类、标题、内容
- ConversationController 快捷回复 CRUD:listQuickReplies, storeQuickReply, deleteQuickReply
- 会话认领(claim)+ 释放回 AI(releaseToAi)+ 转接(transfer)
- 会话备注(Note):addNote, listNotes
- 满意度评价(Rating)模型 + 迁移 + ChatController.submitRating API
- 客服列表 API(listAgents)供转接使用
- stats() 接口:total/active/pending/closed 统计
⬜ 待完善:
- 快捷回复前台 UI 组件(后端 API 已就绪)
- 会话自动分配策略(轮询/最少会话数)
- 满意度评价前台 UI(关闭会话后弹出评价)
- 满意度统计汇总 API
Phase 4:数据报表(5%)
✅ 已完成:
- ConversationController.stats() 基础统计(total/active/pending/closed)
⬜ 待开发:
- 响应时间报表(首次回复时间、平均回复时间)
- AI 解决率统计(会话中 AI 回复后未转人工的比例)
- 满意度报表(评分分布、趋势)
- 客服工作量报表(每个客服的会话数、回复数)
- 会话来源分析(Widget / API / 其他)
- 数据可视化(图表)
- 报表导出(CSV/Excel)
License
OSL-3.0
Copyright (c) Since 2024 InnoShop - All Rights Reserved