知识库问答 · 在线人工客服

AI 超级客服

一套开箱即用的智能客服系统。知识库提前导入向量库,顾客一提问就直接做向量检索, 只有真的检索到资料才调用大模型组织回答;AI 答不上来时顾客可以一键转人工, 后台真人客服实时接待、来消息自动响铃提醒。

PHP 8 原生 · 零框架 SQLite 零配置 Qdrant 向量检索 任意 OpenAI 兼容模型 SSE 流式回答 可嵌入任意网站
6
知识库文档(已就绪 6 篇)
16
向量分块
3
客服渠道
39
累计会话(314 条消息)
以上为当前部署的实时数据。系统运行正常,可正常接待。
Overview

三句话讲清它怎么工作

传统客服机器人是「把资料全塞进提示词里让大模型自己找」,资料一多就贵、就慢、还会答歪。 这套系统把「找」和「说」拆成两步,各用最合适的模型。

1. 资料提前入库

把退换货政策、物流说明、产品参数等资料导入后台,系统自动切块、向量化,写进 Qdrant。

一次性动作

2. 提问直接检索

顾客一问,问题先变成向量,直接去 Qdrant 找最相关的几段资料——不做全表扫描,资料再多也快。

毫秒级

3. 命中才写答案

找到资料才交给大模型组织成通顺回答;没找到就直接回兜底话术并引导转人工,不浪费模型调用。

省 token
Features

功能一览

从知识库入库、问答、到人工接待与数据回看,一条链路都在后台里闭环。

智能问答

  • 回答逐字流式输出,不用干等
  • 每条回答附引用来源与匹配度
  • 支持多轮追问,保留上下文
  • 顾客可点赞 / 点踩反馈

在线人工客服

  • AI 答不上来 / 顾客主动 → 一键转人工
  • 后台工作台实时收发,顾客不跳页面
  • 快捷回复一点即发,可随时编辑
  • 同一会话不允许两人同时接待

全局消息提醒

  • 后台任意页面开着就会响铃
  • 左侧「人工客服」整项变红并呼吸闪动
  • 标签页标题带未读数角标
  • 提示音可一键静音,跨页面生效

多渠道客服链接

  • 一条链接 = 一个独立渠道
  • 可分别配欢迎语、推荐问题、主题色
  • 可限定知识库分类与嵌入域名
  • 每访客每日提问上限,防刷

三种嵌入方式

  • 悬浮气泡组件(推荐,一行 script)
  • iframe 直接嵌进页面
  • 普通链接跳转
  • 位置、颜色、标题都可调

知识库与数据回看

  • 文档增删改、批量导入、进度可见
  • 内置检索测试,改完立刻验证
  • 命令行批量导入,上千篇也稳
  • 会话记录:问答配对、来源、评价
How it works

顾客问一句话,系统做了什么

整个过程在一次请求里完成,前端通过 SSE 边收边显示。

顾客发出提问

聊天页或嵌入组件提交问题,落到 /api/chat.php

校验客服渠道

是否启用、域名是否在白名单、当日提问是否超限

问题向量化

交给向量模型,把问题变成一串数字

在 Qdrant 里检索

按渠道设定的知识库分类过滤,取回最相关的几个分块

分数太低 → 直接兜底

回一句「没找到准确答案」并引导转人工,不调用大模型

命中 → 组装提示词生成

把资料和问题拼成提示词,流式调用对话模型

边生成边推给顾客

SSE 流式输出,回答完连同来源一起落库

省钱的开关
第 5 步是最关键的设计:检索不到就直接兜底,不花对话模型的钱。 想进一步压成本,把「每次带几段资料」调小最有效。
自动降级,服务不中断
向量库或向量模型临时不可用时,检索会自动切换到本地关键词兜底, 回答里标注「降级模式」;对准确率要求极高可以设为「仅向量」,宁可报错也不给不准的答案。
相似度阈值必须标定
不同向量模型的分数基线差别很大。系统提供标定工具,拿你的文档自动测出真实分布并给出建议值。 换成「抄别人的阈值」,结果要么什么都搜不到,要么什么都命中。
Interfaces

顾客看到什么,客服看到什么

两边是同一套数据的两面,顾客在同一个窗口里从 AI 平滑过渡到真人,不需要跳转。

顾客端

对外

一个聊天窗口,或者右下角的悬浮气泡。

  • 流式回答:文字逐字出现,带引用来源和点赞按钮
  • 推荐问题:开场的常见问题一键点选
  • 命中兜底时自动弹出「让真人接手」的卡片
  • 转人工后顶部横幅提示 → 客服接入变绿色,标题换成客服昵称
  • 客服消息用专属绿色气泡与头像,一眼看出是真人
  • 手机浏览器打开同样可用
打开顾客端 查看 widget.js

管理后台

内部

六个页面,覆盖从入库到接待的全过程。

  • 概览看板:知识库、渠道、会话与各项服务状态
  • 知识库:文档增删改、导入向量库、内置检索测试
  • 人工客服:实时工作台,队列 / 未读 / 快捷回复 / 接入与结束
  • 客服链接:建渠道、配欢迎语与分类、生成嵌入代码
  • 会话记录:问答配对、引用来源、顾客评价
  • 系统设置:模型、向量库、检索、分块、人工客服、安全
进入管理后台

会话状态机

人工接待

一个会话在任何时刻只处于一种状态,顾客再开口时状态会自动流转,不需要人工干预。

AI 智能应答 → 等待接入 已排队 → 人工中 真人接待 → 已结束 再开口自动回到 AI
实时性说明:客服端与顾客端都用短轮询(2.5 秒 / 3 秒),不是 WebSocket。 因为 PHP 内置服务器是单进程,一条常驻连接会把整个服务卡死;短轮询每次都是独立小请求,单进程也扛得住。 代价是最长 3 秒延迟,日常沟通感觉不到。
Stack

技术栈与架构

纯原生实现,没有框架、没有构建步骤、没有 Composer 依赖 —— 丢到任何支持 PHP 8 的空间就能跑。

层次技术选型说明
前端 原生 HTML / CSS / JavaScript 无框架、无打包。顾客端聊天页 + 可嵌入任意网站的悬浮组件
后端 PHP 8 原生,App\ 命名空间自动加载 分层清晰:数据层 / 客户端 / 检索 / 生成 / 鉴权,各管一件事
业务数据 SQLite(PDO) 零配置、免运维。文档、分块、渠道、会话、配置全在这里
向量库 Qdrant(REST API) 知识库分块的向量与其原文都存这里,提问时直接检索
模型 任意 OpenAI 兼容接口 向量模型与对话模型可分别配不同厂商,互不影响
流式输出 SSE(Server-Sent Events) 回答边生成边推送;部署时需关闭 nginx 缓冲,否则会「转圈半天然后整段出现」
安全 密钥加密 / CSRF / 同源校验 / 上传校验 API 密钥以 AES-256-CBC 加密入库;后台写操作校验 CSRF 与来源
为什么是两个模型? 向量模型只做一件事:把文字变成数字,用来判断「两句话像不像」; 对话模型负责组织语言。前者不会说话,后者不知道你的知识库,所以两边缺一不可,必须分别配置。
Deploy

运行要求与部署要点

本地跑起来只需两条命令;正式上线有四个容易踩的点,列在最前面。

环境要求

  • PHP 8.0+(已在 8.2 实测)
  • 扩展:pdo_sqlite、sqlite3、curl、openssl、mbstring
  • 可写目录:data/、logs/、public/uploads/
  • 一个可用的 Qdrant(本机 Docker 或云服务均可)
  • 一个 OpenAI 兼容的对话接口 + 一个向量接口

上线四个关键点

  • 站点根目录指向 public/,不要指向项目根目录
  • nginx 要关掉缓冲(fastcgi_buffering off;),否则流式回答会变成整段弹出
  • 禁止 data/ logs/ config/ src/ 被直接访问,上传目录禁止执行脚本
  • 改掉默认后台密码,并把客服渠道的「嵌入域名白名单」填成自己的域名
两个容易被忽略的坑:① 项目路径尽量用纯英文,Windows + 中文路径在部分 PHP 环境下会路径解析异常; ② 服务器上残留的 http_proxy 环境变量会让「访问本机向量库」的请求被强行送进代理,表现为「配置全对但连不上」—— 系统默认直连并把这一点做成了设置项。
Quick start

快速上手

以下命令在项目根目录执行(示例中的 PHP 路径请换成你自己的)。

本地跑起来
# 1) 初始化数据库(加 --demo 会灌一份演示知识库)
php cli/init.php --demo

# 2) 启动服务(默认监听本机;加 --lan 允许局域网访问)
php cli/serve.php 8080
php cli/serve.php --lan

# 3) 打开后台 → 系统设置,填向量库地址与两个模型,点「测试」确认连通
#    后台: http://127.0.0.1:8080/admin/
知识库导入与阈值标定
# 连通性自检(向量库 / 向量模型 / 对话模型)
php cli/ingest.php --check

# 导入待处理文档(大库推荐走命令行,比后台点按钮快得多)
php cli/ingest.php --all

# 从文件或目录批量导入
php cli/ingest.php --file=资料.md --title="退换货政策" --category=售后
php cli/ingest.php --dir=./docs

# 换了模型或知识库后:全量重建 + 重新标定阈值(两步都要做)
php cli/ingest.php --rebuild
php cli/calibrate.php --apply
嵌入到你的网站
<!-- 右下角悬浮客服气泡,一行搞定 -->
<script src="https://ai.36ysk.com/widget.js" data-aikefu="6be0e77c1e8f" data-color="#2563eb" async></script>
推荐的上线顺序:填配置并测通 → 导入知识库 → 跑一次阈值标定 → 用「检索测试」压几个真实问题 → 建客服渠道并把域名白名单填上 → 拿嵌入代码贴到网站。
FAQ

常见问题

?为什么答不上来 / 总是回「没找到准确答案」?

最常见的原因是相似度阈值没标定。不同向量模型的分数基线差别很大,阈值定太高就会把正常提问也判成「查不到」。

到「知识库」页用内置的检索测试压一个真实问题,看它给的匹配度;再跑一次阈值标定工具按你的数据算一次建议值。

另外确认资料已经导入完成(文档状态为「已就绪」)——只上传不导入,是搜不到的。

?问一句回答出现两遍?

这是流式输出与短轮询并发导致的重复渲染,已经修复(前端按消息 id 去重)。如果还遇到,先 Ctrl+F5 强制刷新,清掉浏览器缓存的旧脚本。

?后台按钮点不到、页面显示不全或右边被切掉?

先 Ctrl+F5 强刷(样式表有缓存时改动不会生效)。仍不对就说明是布局问题,系统带了一个布局体检脚本,会用多种窗口尺寸逐个检查横向溢出与遮挡,并直接指出是哪个元素出问题。

?客服端提示音不响?

浏览器规定「用户没有交互过的页面不许播放声音」,这是安全策略绕不过去。点一下页面任意位置(比如点某个会话)就会解锁,之后一直正常。

其次检查右上角是不是被自己点成静音了;再检查标签页有没有被浏览器静音(右键标签页可看)。

?顾客说没人回他 / 客服说收不到消息?

① 确认后台「人工客服」页是开着的(任意后台页面开着都算在线);② 检查「系统设置 → 人工客服」的总开关; ③ 检查该客服渠道的「转人工方式」是不是设成了「只跳外部链接」。

?正式使用会消耗模型费用吗?

会,但很少。导入知识库时消耗向量模型;顾客提问时每次都消耗向量模型,但只有检索到资料才调用对话模型 —— 答不上来的时候直接走兜底话术,不产生对话费用。顾客在跟真人客服聊天时,两个模型都不调用。

想进一步压成本,把「每次带几段资料」调小最有效。

?换一批资料 / 换了向量模型之后要做什么?

三件事:全量重建索引(按新模型的维度重建集合并重新导入)→ 重新标定阈值(分数基线变了)→ 拿几个真实问题在「检索测试」里验证一遍。本地文档与分块都保留,重建不会丢数据。

?手机能用吗?局域网怎么访问?

能用。启动时加 --lan 让服务监听所有网卡,启动器会列出可访问的局域网地址。

务必用局域网地址登录后台:客服链接与嵌入代码是按「你当前访问用的域名」生成的,用本机地址登录会生成打不开的链接。

?数据存在哪里?会不会丢?

业务数据都在 SQLite 数据库里,向量在 Qdrant。备份只需复制数据库文件与密钥文件即可; 向量可以随时用一条命令从本地文档重新生成,所以只要数据库在手,知识库就能完整重建。