当前位置: 首页 > news >正文

python创建智能问答机器人

背景

  1. 最近一直都在忙做文本机器人的事情,所以就很少发公众号文章了。
  2. 目前机器人的代码,已经全部发布在github上了。
  3. 做机器人的目的:一方面是为了锻炼自己的代码能力,一方面也是因为自己想做一些有趣的时候。
  4. 这个项目足够优雅,只需要python环境即可,就算是没有显卡也都行。而且即开即用,我也不喜欢安装太多的依赖包。

下面就是完整的介绍了。效果的话,也不介绍了,反正有点意思,这里放几个截图:

这里因为使用的是一个“怼人的知识库”导致返回的答案就很气人。
其实这里也可以换成别的知识库,都是可以的。都是通用的。

仓库地址:https://github.com/yuanzhoulvpi2017/questionAnswerSystem

介绍

本项目是在不借助数据库的情况下:

  1. 基于pandas、numpy、pytorch实现数据的curd的(替代数据库的)
  2. 基于transformers、sentence-transformers实现文本转向量的
  3. 基于fastapi对外暴露接口的
  4. 问答机器人。

目的

  1. 实现一个问答机器人(基于sbert来做)其实是想做搜索,其实我感觉nlp和搜索也都差不多,都是策略问题。
  2. 不依赖数据库,实现数据管理的crud。
  3. 希望依靠numpy、fastapi能做一个拥有redis功能的数据库(听起来很可笑,我自己也觉得肯定是不可能的,我就是想试一试,提高代码能力)。
  4. 在实现的过程中,我希望把整个nlp问答机器人的数据流都打通。数据流打通,至于用什么数据库之类的,都是小事情。

实现的功能有什么

  1. crud中的R功能,也就是Read。或者干脆就叫搜索吧。起码要有搜索功能
  2. crud中的c功能,也就是Create。对应到一个完整的问答机器人,也就是:创建知识条目
  3. crud中的u功能,也就是update。对应到这个项目里面,也就是:更新知识条目的答案更新知识条目中相似问法
  4. crud中的d功能,也就是delete。对应到这个项目里面,也就是: 删除知识条目删除相似问法
  5. 其实还有转换功能,实现文本转向量功能。
  6. 还有计算相似度功能,主要是基于cos距离
  7. 还有分组统计的功能,主要是使用mrr来计算。

缺点

  1. 没有考虑并发,但其实一般1秒处理100条,基本上不是问题。
  2. 应该有很多缺点,大家可以提issue给我。

数据结构

一个完整的知识库中的条目,起码要有这三个部分:

  1. 标题:这个知识库的标题是什么。一般来说都是文本。
  2. 答案:这个是要返回的结果,或者叫答案。一般是文本,有的是接口,我这里不管了,都是文本。
  3. 相似问法:相似问法是对标题的补充,尽可能覆盖用户会提问的语句内容。
  4. 其实还有别的,比如条目类型、创建时间等,我这里有的就省略了。

我这里采用标题和相似问法剥离的处理方式。把他们分为两个表:

程序上的中间表

1. 标题表(pandas保存)

维度有:

  1. 标题:title
  2. 答案:answer
  3. 创建时间:create_time
  4. 修改时间:modify_time
  5. rep_id:和相似问法表关联
  6. 状态:status_question: 0代表关闭,1代表激活

2. 相似问法表(pandas保存)

维度有:

  1. rep_id:和标题表问法关联
  2. 相似问法:similarity
  3. 创建时间:create_time
  4. 修改时间:modify_time
  5. 状态: status_similar: 0代表关闭,1代表激活
  6. 索引:sim_index

还有两个表:

  1. 相似问法的向量:对相似问法做encoding,保存为numpy向量
  2. 标题的向量:对标题做encoding,保存为numpy向量

硬件要求。

这个对硬件要求不高。唯一要求就是,起码内存要16G以上。

常规版本:

我的MacBook pro 16寸的(内存16G,无cuda)

高配版本:

  1. cpu:12700
  2. 内存:64G
  3. 显卡:nvidia-3090
  4. ubuntu-22.04

运行

step0 安装包

按照requirements.txt的指导,安装对应的包。基本上都是nlp开发者经常用到的包,不需要特别注意

step1 开启向量引擎后台

backend_new.py是整个问答机器人的核心。这个能运行即可。需要等待一段时间,有加载模型数据和初始化知识库的步骤。

细节部分:

  1. 对外端口是8010。想要切换的话,直接在代码最后面修改即可。用的就是fastapi,熟悉fastapi的用户,随便怎么改都可以。
  2. 等全部的都加载完全之后,在浏览器里面打开:http://0.0.0.0:8010/docs 就能看到所以的暴露接口了。

step2 如何查询

如何把这个向量搜索引擎用起来呢?可以看看front_search.ipynb文件,这里会教你如何查询一个文本,并且提取结果。

step3 如何管理知识库

在文件front_admin.ipynb里面,你可以看到这些内容:

  1. 如何创建知识条目
  2. 如何删除条目
  3. 如何删除相似问法
  4. 如何更新答案
  5. 如何增加相似问法

知识库如何导出

因为你的一切修改,都是在内存里面,如果你的程序结束,那么所有的内容都会消失。比如你维护的知识条目。这个也考虑到了。在http://0.0.0.0:8010/docs
你可以看到一个叫saved2f接口,运行一下,就会把你的条目放在文件夹QADIR里面,一个是相似问法的表,一个是标题的表。

如何做微信机器人

  1. 目前还在开发微信机器人,就是类似于在群里面聊天的,等后面整理好代码,都会分享出来~

相关文章:

  • MyBatis的简介和核心的组件(映射器、执行器、SqlSession及其工厂)
  • 《计算几何》学习笔记
  • 干货分享:Docker 容器应用示例
  • 闭包的定义,原理,应用场景,优点,缺点
  • js控制台输出佛祖保佑图形图案/彩色图形图案实例代码
  • 黑客进行攻击中最重要的环节“信息收集”
  • Vue(6)
  • JSON 数据类型转换工具
  • CSP-J 2019 入门级 第一轮 第17题
  • 小程序map组件一——使用腾讯地图个性化地图组件、腾讯云可视化大屏展示
  • 【项目实战】高并发内存池
  • go语言|数据结构:二叉树可视化(svg树形图改进版)
  • JVM - 垃圾回收方式性能研究
  • flink笔记2(Flink 快速上手)
  • k8s部署服务+日志收集+监控系统+CICD自动化
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • angular2 简述
  • gcc介绍及安装
  • Hexo+码云+git快速搭建免费的静态Blog
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • LeetCode29.两数相除 JavaScript
  • MySQL的数据类型
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Odoo domain写法及运用
  • springboot_database项目介绍
  • yii2权限控制rbac之rule详细讲解
  • 读懂package.json -- 依赖管理
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 每天一个设计模式之命令模式
  • 责任链模式的两种实现
  • 正则与JS中的正则
  • 智能合约开发环境搭建及Hello World合约
  • 函数计算新功能-----支持C#函数
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​如何在iOS手机上查看应用日志
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (06)Hive——正则表达式
  • (2)STM32单片机上位机
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (day6) 319. 灯泡开关
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (三)uboot源码分析
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET委托:一个关于C#的睡前故事
  • .net下简单快捷的数值高低位切换
  • .ui文件相关