通过Sphinx和WebSocket搭建聊天机器人

作者 Gavin 日期 2015-10-14
通过Sphinx和WebSocket搭建聊天机器人

昨天晚上突然心血来潮想做一个聊天机器人,正好想温习下Sphinx和WebSocket,于是就打算用WebSocket负责通信,Sphinx负责关键词检索来完成。由于阿里云主机上还没有安装Sphinx,首先下载了sphinx-for-chinese-2.1.0,编译安装就不赘述了。

地址:Robot

基本的流程如下:

  • 预处理Sphinx索引:对已有词库通过xml方式创建索引
  • 前台通过H5的WebSocket链接:ws://robot.guojianxiang.com/chat
  • Nginx对location做了反向代理,代理到php脚本监听的端口
  • php脚本处理socket请求

详细说明:

  • 预处理Sphinx全量索引:通过php脚本读取词库文件,将数据放到xml里,由于词库数据量比较大,我将每1000个词库数据存储到一个xml文件里

  • 前台通过H5的WebSocket链接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var ws = new WebSocket("ws://robot.guojianxiang.com/chat");
ws.onopen = function(){
console.log("握手成功");
/* ws.send("客官来了..."); */
};
ws.onclose = function(event) {
//WebSocket Status:: Socket Closed
alert("链接即将断开,页面重新载入中...");
document.location.reload() ;
};
ws.onmessage = function(e){
console.log("message:" + e.data);
//做一些页面上的处理:如展示返回结果等
};
ws.onerror = function(){
console.log("error");
};
  • Nginx对location做反向代理:

    1. 首先对Nginx事件设置为epoll处理:

      1
      2
      3
      4
      events {
      use epoll;
      worker_connections 1024;
      }
    2. 对来自 /chat 的请求代理到 php脚本监听的端口

  • php脚本处理socket请求

    1. 通过守护进程运行php脚本,监听服务器端口,对到访的socket请求进行处理

    2. 从Sphinx里的索引检索出要回复的内容,再通过socket返回到客户端

迭代版本计划:

  1. 优化词库(现有词库不太完美)
  2. 优化搜索结果,加入权重
  3. 自动学习功能(暂时还没想好怎么做呢,大家有好的思路互相交流下~)
  4. 想想怎么把所有的代码和系统配置开源