设计并实现一个面向特色咖啡馆的智能客服问答系统。该系统旨在通过自然语言处理技术,自动响应顾客在线咨询,涵盖咖啡品种介绍、菜单查询、营业时间、位置指引、优惠活动、预订服务等常见问题,以及提供个性化的咖啡推荐。系统应能够对顾客的自然语言提问进行准确的分类,并给出及时、准确、友好的回复,提升顾客体验,减轻人工客服压力。
基本要求:
序号 | 问题 | 类别 | 回答 |
1 | 你们店几点开门啊 | 营业时间 | 我们的营业时间是13点~20点哦 |
2 | 老板,你们几点上班? | 营业时间 | 我们的营业时间是13点~20点哦 |
... | ... | ||
50 | 能不能推荐一下咖啡?没喝过 | 招牌 | 我们的招牌咖啡是荔枝冰美式,欢迎品尝 |
51 | 最好喝的是什么? | 招牌 | 我们的招牌咖啡是荔枝冰美式,欢迎品尝 |
... | ... | ||
150 | 今天过去有折扣吗? | 优惠 | 今天我们全场所有咖啡买一送一,可以带朋友过来品尝 |
... | ... |
收集至少200条与咖啡馆服务相关的问答对作为训练数据,包括但不限于咖啡种类、店铺位置、营业时间、特色推荐等,确保数据覆盖各种常见场景。数据集可以参考如下形式进行设计:
(数据示例,仅作参考)
- 基于收集的数据,开发一个基于检索式的客服问答模型。顾客发送问题后,模型需能对顾客的意图进行分类,并进行标准回答。
- 在测试集上验证模型性能,确保至少80%的准确率。如出现跟所有类别匹配度低的问题,也能够给顾客较为满意的回答,使系统具有一定的健壮性。
扩展要求:
- 使用网络爬虫技术自动抓取数据集,或大量扩充问答对数据集,每个分类下的样本数量显著增加。
- 开发一个Web应用,前端提供友好的用户对话界面
具体设计如下:
一、需求分析
1.背景和意义
在现代社会中,咖啡馆不仅是享受咖啡的地方,更成为了人们社交、工作和放松的重要场所。随着技术的发展,特色咖啡馆智能客服问答系统应运而生,旨在通过高效、智能的服务方式,提升顾客体验,强化咖啡馆的品牌形象。这一系统集合了先进的人工智能技术,能够实时响应顾客的各种查询,从菜单推荐到订单处理,再到解答咖啡文化相关的问题,无所不能。借助于此系统,咖啡馆能够以更加个性化的服务吸引顾客,同时减轻员工的工作负担,提高工作效率。在提升顾客满意度的同时,也为咖啡馆探索新的运营模式和增长点提供了可能。特色咖啡馆智能客服问答系统,不仅代表了咖啡馆业务数字化、智能化的趋势,更是咖啡文化与科技创新完美结合的典范。
2.开发环境需求
1) 硬件环境
CPU:11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz
系统类型:64 位操作系统
2) 软件环境
在 Windown10 系统下,主要是html,在Visual Studio Code编译器开发。
二、程序概要设计
1.实现功能
- 实现了Web应用,提供友好的用户对话界面
- 实现了模型的开发
- 实现了后端的开发
- 实现了一个面向特色咖啡馆的智能客服问答系
2.未实现功能
- 没有使用网络爬虫技术自动抓取数据集
3.程序流程
图1 流程图
用户在前端页面输入对应的问题,前端链接到后端,把对应的问题发送给后端,后端把问题输入模型,模型判断对应的类型,根据类型输出到具体的答案给前端
三、程序详细设计
1、前端设计
用HTML页面实现了一个简单的聊天界面,模拟了一个客户和咖啡厅智能客服之间的互动。页面主要由HTML、CSS和JavaScript组成。
(1)功能的实现方法描述:
页面布局和样式:使用HTML和CSS定义了页面的结构和样式。页面主要包括一个标题、一个显示消息的聊天框、一个输入框以及一个发送按钮。通过CSS设置了页面的背景、字体、颜色和布局等,使页面具有良好的视觉效果。
消息的显示:通过JavaScript动态地在聊天框中添加消息。用户输入的消息和系统回复的消息分别以不同的样式显示。
与后端服务交互:使用axios库向后端服务发送请求,获取智能客服的回复,并将回复显示在聊天框中。
(2)关键代码分析
①消息显示的实现:
图2 消息显示
这段代码定义了一个addMessage函数,用于在聊天框中添加一条消息。函数接受三个参数:消息类型(用户或系统)、消息文本和头像URL。根据消息类型,会以不同的样式显示消息。这段代码利用了DOM操作,动态创建了消息元素并设置了相应的样式。
②发送消息和接收回复:
图3 内容的交换
sendMessage函数首先获取用户输入的消息,然后清空输入框,并将用户的消息显示在聊天框中。之后,使用axios向后端服务发送POST请求,包含用户的消息。当收到回复时,函数将系统的回复也显示在聊天框中。如果请求失败,则显示错误消息。
③事件绑定:
图4 事件绑定
这段代码为发送按钮和输入框绑定了事件监听器。点击发送按钮或在输入框按下回车键时,会调用sendMessage函数发送消息。
通过这些关键代码,实现了一个简单的聊天界面,用户可以与智能客服进行交互。
2、模型设计
本模型的构建基本依托于sklearn和jieba这两个重要的Python模块。首先,为了处理和净化导入的文本数据,我们借助Python的sub方法,去除文本中不必要的内容。接下来,jieba模块的引入是为了实施分词操作,即将整个句子细分成若干单词。
进一步,我们使用gensim库下的word2vec模型,将分词后的结果转换为词向量。简而言之,这个过程涉及到将每个词语映射为一组数字,这组数字代表了该词在多维空间中的坐标。如果两个词的关联性较强,它们在空间中的坐标会比较接近;反之,若关联性弱,则坐标相距较远。
最后,我们采用了stacking技术进行分类。值得注意的是,stacking并非一个单一的模型,而是一种综合利用多种模型进行预测的方法。具体来说,我们采用了逻辑回归、随机森林和支持向量机等模型进行初步预测,然后通过另一个随机森林模型综合这些初步结果,从而得到一个可能更优的预测模型。
3、后端设计
(1)Flask应用和CORS设置
使用Flask初始化应用并通过CORS(app)启用跨域资源共享,确保前端应用能够从不同的源地址请求数据。
设置app.config['JSON_AS_ASCII'] = False以确保JSON响应支持UTF-8编码,防止中文字符乱码。
(2)模型和数据的加载
在init()函数中,通过pickle和joblib加载事先训练好的模型和数据,包括停用词列表(stop)、word2vec模型(wd)、标签列表(label_list)和分类模型(model)。
(3)文本预处理和分词
toVec()函数接收用户的问题(ss),首先使用jieba.lcut进行分词,然后去除停用词,最终将处理后的文本转换为词向量。
(4)词向量生成
在embedding_sentence()函数中,为每个词生成词向量。如果词存在于word2vec模型的词汇中,则使用模型提供的词向量;否则,使用全零向量代替。
(5)模型预测
toPre()函数使用加载的分类模型(model)对处理后的词向量进行预测,并根据label_list将数字标签转换成对应的类别名。
(6)Flask路由和请求处理
通过装饰器@app.route()设置路由。对于/robot端点,定义了robot()函数来处理POST请求。函数中首先检查请求方法,对于OPTIONS请求,返回允许跨域的响应头;对于POST请求,解析JSON格式的请求体,获取问题文本,进行预处理和模型预测,并返回预测结果。
(7)服务器启动
在if __name__ == '__main__':代码块中,调用init()函数加载模型和数据,然后使用app.run()启动Flask服务器。
四、程序测试
图5 前端页面展示
在图5中,展示了用户使用问答页面时的景象,首先映入眼帘的便是位于对话栏上方的咖啡厅名称——本例中为“紫轩咖啡厅”,这一名称并非固定不变,而是可根据用户的不同需求进行灵活更换。紧随其后的是对话栏本身,一个专为用户问题与机器人回答设计的互动空间,此时可以看见机器人已经跟用户进行“打招呼”,其内容为“欢迎光临,请问我有什么能帮到你的?”。用户可在文本框内输入自己的疑问,随后通过点击发送按钮或敲击回车键的方式,将问题提交至对话栏中。问题一经提出,系统便会根据其性质迅速作出回应,并将该回答同样展示在对话栏内,为用户提供所需的解答。
此外,我们设计的页面上还巧妙地展示了用户与机器人的头像,增添了一份亲切感与互动的趣味性。通过这样的设计,问答页面不仅仅是一个简单的交流平台,更是一个充满人性化考量和细节关怀的互动空间,旨在提供一个既直观又友好的用户体验。图便展现了一个既美观又实用的问答界面,使得每一位踏入其中的用户都能享受到流畅无阻的交流体验。
图6 后端运行
当Flask应用程序启动时,如果看到提示“Debug mode: on”,这意味着调试模式已经激活。在调试模式下,Flask会提供更为详尽的错误信息,并且具备自动重载的功能,这些都极大地便利了开发和调试过程。关于服务器的运行信息,它会显示两个访问端口:一个是应用在本地主机(localhost)上通过端口5000提供服务的信息,另一个则是应用在本地网络中,具体IP地址为192.168.123.157,同样通过端口5000提供服务的信息。这样的设置使得应用既可以在开发机器上被访问,也可以在同一局域网内的其他设备上通过指定的IP地址访问。
图7 模型正确率
通过使用三种不同的模型进行训练,观察到单独应用任一模型时,最高的正确率为85%。然而,通过采用Stacking方法将这三个模型整合在一起后,模型的正确率提升至87%。在这三个模型中,逻辑回归在本次实验中展现出了最高的正确率。但值得注意的是,这只是一次实验结果。在不同的实验条件下,可能会有不同的表现,例如有时随机森林可能会展现出更优的效果。在应用Stacking方法后,如果随机森林对最终结果的贡献增加,这也是可能的。这表明Stacking方法能够在一定程度上整合多个模型的优势,从而达到更好的效果。
图8 模型测试
在PyCharm中模拟后端使用模型的效果显示在图8上。从结果观察到,模型能够有效地进行分词处理,并且根据数据集对提出的问题给出了相对正确的回答。这表明模型确实在一定程度上掌握了基于数据集的应答能力。
然而,值得注意的是,这个模型的性能上限受到了所使用数据集质量的限制。鉴于网络上缺乏现成的数据集,我们通过搜集信息自行构建了数据集,而数据集的质量直接影响到了模型的泛化能力。因此,如果遇到与数据集中信息差异较大的现实问题,模型可能无法提供准确的回答。这一点是在使用过程中需要特别注意的,也是未来改进工作的一个重要方向。