Python创建自己的聊天机器人

人工智能76

聊天机器人是NLP(自然语言处理)上的一个重要研究和实际落地的方向,它们可以用于智能客服、生活助手,当然也可以用于自动聊天和回复。

现在如果我们想创建一个属于自己的聊天机器人,可以不用自己动手训练,网上有很多聊天机器人的API接口。本文就给大家介绍一些用Python调用这些API实现聊天机器人的方法。

一、图灵机器人

图灵机器人开放平台是北京光年无限科技旗下的智能聊天机器人开放平台。

图灵机器人-智能好用的聊天机器人 (turingapi.com)Python创建自己的聊天机器人http://www.turingapi.com/;如果要实现更好的聊天效果,可以按照自己的需求购买一些功能。

在这里介绍一下它的免费API接口,但缺点是每天的使用次数有限。实际操作过程中,我们可以通过更换KEY的方式增加调用的次数,这里我提供了4个可用的KEY,亲测有用。

下面是代码实现:

import requests
import random

KEY1 = '8edce3ce905a4c1dbb965e6b35c3834d'
KEY2 = 'c3386bd8e60a434a8c5b5106dc766887'
KEY3 = '40d56dcf5e1d4edc8a891eb824a11437'
KEY4 = 'a1f6dbf66978411c9127585f7779cd04'

KEY_LIST = [KEY1,KEY2,KEY3,KEY4]

def get_response(msg):
    # 这里我们就是在调用别人的api接口 实现最简单的与图灵机器人的交互"中做的一样
    # 构造了要发送给服务器的数据
    apiUrl = 'http://www.tuling123.com/openapi/api'
    data = {
        'key': random.choice(KEY_LIST),
        'info': msg,
        'userid': 'wechat-robot',
    }
    try:
        r = requests.post(apiUrl, data=data).json()
        # 字典的get方法在字典没有'text'值的时候会返回None而不会抛出异常
        return r.get('text')
    # 为了防止服务器没有正常响应导致程序异常退出,这里用try-except捕获了异常
    # 如果服务器没能正常交互(返回非json或无法连接),那么就会进入下面的return
    except:
        # 将会返回一个None
        return

reply = get_response('你在干嘛呢')
print(reply)

输出结果:

E:\anaconda3\python.exe E:/Pycharm软件/研究生期间项目/他人项目/攀哥/博客.py

我在外面啊

Process finished with exit code 0

二、青云客网络

青云客网络和图灵机器人有些类似,不过它不用通行码,也没有每天的调用限制。但是我个人觉得他的回复质量没有图灵机器人好。

青云客智能聊天机器人API (qingyunke.com)Python创建自己的聊天机器人http://api.qingyunke.com/;

下面是调用接口的格式和返回值意义:

Python创建自己的聊天机器人

下面是代码实现:

import requests

res = requests.post("http://api.qingyunke.com/api.php?key=free&appid=0&msg=" + '你在干嘛呢')
res = res.json()
print(res['content'])

输出结果:

E:\anaconda3\python.exe E:/Pycharm软件/研究生期间项目/他人项目/攀哥/博客.py

能干嘛呢,聊天呗,上网呗

Process finished with exit code 0

三、百度智能云Unit

相较于前两个接口,百度智能云Unit在调用时可能麻烦一点,因为要先在百度智能云上搭建自己的机器人,设置一些机器人的偏好。但也正因为如此,百度智能云Unit的回复相对于前两个接口质量更高,可以根据自己的实际需要和偏好对机器人进行设置,而且还可以用流程图的形式进行话术设计。

下面我先介绍一下如何在百度智能云Unit搭建自己的机器人。

首先进入官网:

百度智能云-智能时代基础设施 (baidu.com)Python创建自己的聊天机器人https://cloud.baidu.com/;

然后点击产品——人工智能——智能对话平台UNIT

Python创建自己的聊天机器人

然后在弹出的页面点击立即使用:

Python创建自己的聊天机器人

在点击个人版板块中的免费使用(创建过程可能会要求登录,这是直接注册或用百度的账号登录即可):

Python创建自己的聊天机器人

根据自己的需要申请好后,可以来到云端的总控制台:

Python创建自己的聊天机器人

点击我的机器人,再点击中间的加号创建机器人:

Python创建自己的聊天机器人

创建好机器人后点击我的技能,为机器人添加技能,也就是设置机器人的聊天内容和偏好:

Python创建自己的聊天机器人

然后可以选择自己的偏好,也可以测试聊天效果:

Python创建自己的聊天机器人

点击获取技能后,我们就能看到已经获取的技能:

Python创建自己的聊天机器人

回到我的机器人,点击我们刚刚创建的机器人——点击技能管理——点击添加技能,将我们刚刚获取的技能添加到机器人中。

Python创建自己的聊天机器人

注意添加的技能是有顺序的,比如添加的第一个是主题聊天—电影,那么机器人在回复是会更偏向于电影话题。

Python创建自己的聊天机器人

在调用API之前,我们还要记下三个参数:

1、机器人ID

机器人ID在点击我们创建的机器人后就能看到,比如我的ID:S62511

Python创建自己的聊天机器人

2、PAI KEY和Secret KEY

回到刚刚百度智能云主页,点击控制台并登录:

Python创建自己的聊天机器人

点击我们刚刚创建的产品:

Python创建自己的聊天机器人

可以看到对应的PAI KEY和Secret KEY。

Python创建自己的聊天机器人

将我们创建的机器人的ID、PAI KEY和Secret KEY三条信息记下,后面调用时会用到。

最后一步,调用我们刚刚搭建的聊天机器人的API,其中的三个参数:post_data、client_id和client_secret和分别填入上面得到的创建的机器人的ID、PAI KEY和Secret KEY,其中post_data只用修改后面的一个字段,填入机器人ID,如:\"service_id\":\"s62511\"。

下面是代码实现:

import json

baidu_server = 'https://aip.baidubce.com/oauth/2.0/token?'  #获取token的server
grant_type = 'client_credentials'
client_id = '自己的API KEY' #API KEY
client_secret = '自己的 Secret KEY' #Secret KEY   这里可以自己去百度注册,这里是我的API KEY 和 Secret KEY

#合成请求token的url
url = baidu_server+'grant_type='+grant_type+'&client_id='+client_id+'&client_secret='+client_secret

#获取token
res = requests.get(url).text
data = json.loads(res)  #将json格式转换为字典格式
token = data['access_token']

access_token = token
q = '在干嘛呢'  # 需要发送给UNIT服务器的内容放到这里即可
url = 'https://aip.baidubce.com/rpc/2.0/unit/service/chat?access_token=' + access_token  # 不用动
post_data = "{\"log_id\":\"UNITTEST_10000\",\"version\":\"2.0\",\"service_id\":\"s62511\",\"session_id\":\"\",\"request\":{\"query\":\"%s\",\"user_id\":\"88888\",\"query_info\":{\"type\":\"TEXT\",\"source\":\"KEYBOARD\"}}}}" % (
    q)
post_data中主要修改的是:service_id(提前准备好的机器人id)、type(TEXT为常规的文本型,EVENT为一组K-V(json),且其中必须包含一个名为『event_name』的key,其他自便)、source("ASR","KEYBOARD"。ASR为语音输入,KEYBOARD为键盘文本输入。针对ASR输入,UNIT平台内置了纠错机制,会尝试解决语音输入中的一些常见错误)
print('post_data:',post_data)
headers = {'content-type': 'application/x-www-form-urlencoded'}  # 不用管
response = requests.post(url, data=post_data.encode('utf-8'), headers=headers)
post_data.encode('utf-8'),需要先将post_data编码为'utf-8'格式,否则会出错
result = response.json()
reply = result['result']['dialog_state']['contexts']['SYS_PRESUMED_HIST'][1]
print(reply)

运行结果

E:\anaconda3\python.exe E:/Pycharm软件/研究生期间项目/他人项目/攀哥/博客.py

在看电影,你呢

Process finished with exit code 0

可以看到,我把主题聊天—电影技能放在了最前面,所以机器人的回答会更偏向于电影话题。

以上就上三种用Python实现聊天机器人的方法,有什么问题欢迎来评论区讨论。

Original: https://blog.csdn.net/qq_41231776/article/details/121708999
Author: 一枚研究僧
Title: Python创建自己的聊天机器人



相关阅读1

Title: 深度强化学习-强化学习基础-SARSA算法(四)

本片主要介绍SARSA算法,蒙特卡洛算法,以及自举的概念。内容比较细,比较基础,大家可以认真看。有不懂的地方可以先看之前的文章。

目录

SARSA:

SARSA算法和Q学习的对比:

多TD目标:

蒙特卡洛:

自举:

Q学习和SARSA算法都属于TD算法,Q 学习的目的是学习最优动作价值函数,SARSA 的目的是学习动作价值函数。

SARSA:

我们一般使用Python创建自己的聊天机器人作为确定的策略来控制智能体的运动,但现在Python创建自己的聊天机器人被用来评判策略的优略,不再用于控制智能体。动作价值函数Python创建自己的聊天机器人常和策略函数Python创建自己的聊天机器人结合使用,被称作 Actor-Critic(演员—评委)方法。策略函数控制智能体,因此被看做"演员",动作价值函数评价策略函数的表现,帮助改进Python创建自己的聊天机器人,因此 Python创建自己的聊天机器人被看做"评委"。常用 SARSA 训练"评委"。

SARSA 使用的单步 TD 目标定义为:

Python创建自己的聊天机器人

其中这个q()实际上是在t时刻对Python创建自己的聊天机器人做出的估计。最终鼓励q()逐渐拟合于Python创建自己的聊天机器人

SARSA算法和Q学习的对比:

二者都是既可以应用于表格形式(要求状态数有限),也可用于神经网络。对表格形式的更新也类似:更新为表格中现有的奖励值+学习率*(预测值-表格中的值)。对于神经网络用到梯度下降算法。使用梯度下降算法更新神经网络参数与SARSA算法和Q学习算法无关。

SARSA 是 State-Action-Reward-State-Action 的缩写,因此SARSA算法需要依赖于一个五元组,相较于四元组,多了一个Python创建自己的聊天机器人.Python创建自己的聊天机器人是根据策略函数Python创建自己的聊天机器人,在Python创建自己的聊天机器人下随机抽样得到的。

SARSA最终目的就是求动作价值函数Python创建自己的聊天机器人,而Q 学习的目的是学习最优动作价值函数Python创建自己的聊天机器人

Q 学习是异策略,行为策略和目标策略不同。因为Q学习学到的表格Qtable是最优动作价值函数的近似,与策略函数Python创建自己的聊天机器人无关,因此不论收集经验用的行为策略是什么,都不影响Q学习最终的目标策略。所以Q学习可以反复利用经验回放来进行训练。

此处还涉及到经验回放,简单介绍一下:经验回放所用到的四元组还是我们之前提到过的(Python创建自己的聊天机器人,Python创建自己的聊天机器人,Python创建自己的聊天机器人,Python创建自己的聊天机器人),将这些四元组缓存起来记录到 一个数组里,这个数组被称作经验回放数组(Replay Buffer),不论是基于表格形式的还是神经网络形式的Q学习,最终进行训练都需要用到这些四元组,这种方式就被称为经验回放。

SARSA是同策略,每一个Python创建自己的聊天机器人都与一个Python创建自己的聊天机器人相对应,不同的策略Python创建自己的聊天机器人会导致学习到的Python创建自己的聊天机器人的不同。经验回放数组里的(Python创建自己的聊天机器人,Python创建自己的聊天机器人,Python创建自己的聊天机器人,Python创建自己的聊天机器人)是已经缓存下来的,过时的行为策略收集到的,与当前策略对不上,必须要使用当前策略,因此不能使用经验回放。

多TD目标:

单TD目标表示公式中只有一个已知的现实奖励Python创建自己的聊天机器人,多步 TD 目标用 m 个奖励,可以视作单步 TD 目标的推广。从t开始每往后一个时刻,奖励就多乘以一个学习率,回报也多乘以一个学习率。m个奖励,就是m个奖励求和,t时刻后的都要乘以学习率,并且t+m时刻的回报乘以学习率的m次方。

Python创建自己的聊天机器人

后面进行计算与优化和单TD一样。本质上是没差的,只是多TD更接近于现实,更加可靠。

蒙特卡洛:

蒙特卡洛算法并不是一种算法的名称,是对一种算法特性的概括。蒙特卡洛是一种数值算法,靠随机样本对目标做近似。蒙特卡洛一般难以得到真实结果,但是可以得到十分相近的结果。随机梯度下降也是一种蒙特卡洛算法,拿随机梯度来近似真实梯度。

简单举个例子大家应该能更清楚:

Python创建自己的聊天机器人

背景是:在直角坐标系中以原点为圆心,半径为1有一个圆,它同时有一个外界正方形。我们利用蒙特卡洛算法来近似求Python创建自己的聊天机器人(pai)的值:

我们上面说到蒙特卡洛算法是靠随机样本对目标做近似,我们利用随机生成的点,在正方形中均匀分布,共生成n个点。我们知道圆的面积为pair^2,此时半径为1,圆的面积就为pai,正方形面积为4.则我们可以认为落在圆上的概率p=pai/4。而我们随机产生n个样本点,根据数学期望得到落在圆上的点的个数为m=np=npai/4,n是已知的产生的随机点的个数,m是经过统计的落在圆上的个数。最终经过化简pai=4m/n。由此一来,我们便可以计算出pai的近似值,并且n越大这个值越准确。

我们使用蒙特卡洛算法对网络进行训练,首先我们可以将一局游戏进行到底,观察所有奖励r1,...rn,我们可以直接计算ut,此时的ut是有实际数据的已经观测到的真实值,并以ut作为目标,鼓励价值网络向ut靠近。

蒙特卡洛的好处是无偏的:无偏估计的要求就是:估计出来的参数的数学期望等于被估计参数的真实值。ut是Python创建自己的聊天机器人的无偏估计,由于ut 的无偏性,拿ut 作为目标训练价值网络,得到的价值网络也是无偏的。

蒙特卡洛的坏处是方差大:回报Ut依赖于t时刻以后的动作,状态等,不确定性很大。实际观测值ut虽然是Ut的无偏估计,但可能实际上离回报的期望(即动作价值函数)很远,拿ut 作为目标训练价值网络,收敛会很慢。

自举:

自举的意思是用一个估算去更新同类的估算。

我们以TD算法为例,回顾一下单步 TD 目标定义:

Python创建自己的聊天机器人

由此我们可以看出来最终是要向Python创建自己的聊天机器人上面拟合的,并且后半部分q()是做出的估计,因此便是用自己做出的估计去更新自己即为自举。

自举的好处是方差小:咱们看公式可以得到单步TD目标的随机性只来自于q(Python创建自己的聊天机器人,Python创建自己的聊天机器人)和其他时刻的无关,然而之前介绍的回报Ut和从t时刻开始到回合结束所有时间的都有关,因此TD方差较小,用自举的方法训练网络,收敛比较快。

自举的坏处是有偏差:由于q()是对Python创建自己的聊天机器人的估计,我们当然希望可以使二者相等,但是假如q()高估,会导致Python创建自己的聊天机器人偏大,接着需要让q()向Python创建自己的聊天机器人靠拢,进而导致产生偏差。

实践中,自举通常比蒙特卡洛收敛更快,这就是为什么训练DQN和价值网络通常用TD算法。

Original: https://blog.csdn.net/weixin_46737548/article/details/124075142
Author: weixin_46737548
Title: 深度强化学习-强化学习基础-SARSA算法(四)

相关阅读2

Title: Anaconda下安装tensorflow (windows系统)

因为之前Anaconda、python都已经装好了(可以看之前文章Anaconda超详细安装教程(Windows环境下)_fan18317517352的博客-CSDN博客(本人技术小白一个,如有错误,欢迎各位大神指正。)说明:其实要是装Anaconda的话,就不用再单独装Python了。但是吧,我感觉大部分人都已经装好了Python,因为一般都是先接触的python,然后直接就单独装好了Python,这都不重要,不影响你安装今天的Anaconda。这是我之前装好的python了:下面开始正题:1、 Anaconda的下载: 一般两个选择,一个是官网,另一个是国内镜像网站(建议选择这个)。前者大家都懂,速度感人,所以...Python创建自己的聊天机器人https://blog.csdn.net/fan18317517352/article/details/123035625 ;

需要注意安装CUDA和CUDNN,大家可以参考这位大神的win10下CUDA和CUDNN的安装(超详细)!亲测有效!_u010618587的博客-CSDN博客_cuda安装CUDA8安装配置CUDA8的安装包可直接从NVIDIA官网下载。根据相应的系统选项,我选择的是cuda_8.0.61_win10.exe(大小为1.3G),安装的时候建议选择 自定义 而不是"精简"(从下面的英文解释可以看出,其实这里的精简写成完整应该更贴切,他会安装所有组件并覆盖现有驱动,然而我并不想安装全家桶,何况我的官方显卡驱动比他的新)。如下图所示,我们只需选择CUDA下面这...Python创建自己的聊天机器人https://blog.csdn.net/u010618587/article/details/82940528 ;

打开Anaconda,选择CMD.exe Prompt,点击Launch.

Python创建自己的聊天机器人

进入这个界面,默认前面的(base)就是root模式Python创建自己的聊天机器人

输入如下代码创建环境

conda create --name tensorflow python=3.8

Python创建自己的聊天机器人

按y,等待安装Python创建自己的聊天机器人

输入 conda info --envs检查环境安装是否成功,就看 有没有下面那个tensorflow就行。

Python创建自己的聊天机器人

然后输入

activate tensorflow

进入了tensorflow环境,看箭头,由base--->tensorflow

Python创建自己的聊天机器人

建议先 python -m pip install --upgrade pip,升级一下pip版本,免得出现我这种错误。

Python创建自己的聊天机器人

输入 pip install --ignore-installed --upgrade tensorflow-gpu==2.6.0 进行安装。会失败好多次,多试几次。真不行可以使用镜像安装。

pip install tensorflow-gpu==2.5.0 -i https://pypi.doubanio.com/simple

Python创建自己的聊天机器人

Python创建自己的聊天机器人

测试是否安装成功

,输入python

Python创建自己的聊天机器人

输入以下测试例子

import tensorflow as tf
tf.compat.v1.disable_eager_execution() 
hello = tf.constant('hello,tensorflow')
sess= tf.compat.v1.Session()
print(sess.run(hello))

成功Python创建自己的聊天机器人

在pycharm中测试

,这样是报错了,因为解释器没有换。

Python创建自己的聊天机器人

更换步骤Python创建自己的聊天机器人

Python创建自己的聊天机器人

Python创建自己的聊天机器人

Original: https://blog.csdn.net/fan18317517352/article/details/123042586
Author: 菜鸟1号!!
Title: Anaconda下安装tensorflow (windows系统)

相关阅读3

Title: KITTI自动驾驶数据集可视化教程

Python创建自己的聊天机器人
本文介绍关于自动驾驶数据集 KITTI的基本操作,包括 CameraLiDAR可视化教程,源码已上传:https://download.csdn.net/download/cg129054036/20907604

; 1. 数据准备

KITTI 数据 (calib, image_2, label_2, velodyne) 添加到 dataset/KITTI/object/training文件夹下。
目录文件结构如下:

├── dataset
│   ├── KITTI
│   │   ├── object
│   │   │   ├──KITTI
│   │   │      ├──ImageSets
│   │   │   ├──training
│   │   │      ├──calib & velodyne & label_2 & image_2
├── kitti_object.py
├── kitti_test.py
├── kitti_util.py
├── viz_util.py

2. Requirements

为了显示物体 2D bbox3D bboxUbuntu系统需要安装以下工具:

  • mayavi
  • pillow
  • vtk
  • opencv
  • PIL
  • matplotlib
  • numpy

3. 可视化操作

下面依次展示 KITTI 数据集可视化结果,可视化操作代码存放在 kitti_test.py 文件中,这里通过设置 data_idx=10 来展示编号为000010的数据,共有9种可视化操作,依次为:

  • 图片显示
  • 图片上绘制2D bbox
  • 图片上绘制3D bbox
  • Lidar在图片上投影
  • LidarFOV图
  • Lidar三维可视化
  • Lidar绘制3D bbox
  • Lidar鸟瞰图
  • Lidar鸟瞰图绘制2D bbox

代码中 dataset 需要修改为数据集实际路径

def visualization():
    import mayavi.mlab as mlab
    dataset = kitti_object(os.path.join(ROOT_DIR, '../dataset/KITTI/object'))

    data_idx = 10

    objects = dataset.get_label_objects(data_idx)
    print("There are %d objects.", len(objects))
    img = dataset.get_image(data_idx)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img_height, img_width, img_channel = img.shape
    pc_velo = dataset.get_lidar(data_idx)[:,0:3]
    calib = dataset.get_calibration(data_idx)

(1) 图片显示

Image.fromarray(img).show()

Python创建自己的聊天机器人
(2) 图片上绘制2D bbox

这里 KITTI 数据集给出了目标在图片上的坐标位置 (Xmin, Ymin, Xmax, Ymax),直接绘图即可。

show_image_with_boxes(img, objects, calib, False)

Python创建自己的聊天机器人
(3) 图片上绘制3D bbox

绘制物体 3D bbox时,需要进行坐标系转换, KITTI 数据集中给出的是物体在相机坐标系的位置 (x,y,z),根据物体 bbox 尺寸 (h,w,l) 首先计算 3D bbox 8个顶点坐标,然后借助标定文件将其转换为图片坐标系坐标 (u, v)

show_image_with_boxes(img, objects, calib, True)

Python创建自己的聊天机器人
(4) Lidar在图片上投影

Lidar 坐标下各 point 坐标转换为图片坐标系下坐标,然后根据图片尺寸选取投影点。

show_lidar_on_image(pc_velo, img, calib, img_width, img_height)

Python创建自己的聊天机器人
(5) LidarFOV图

imgfov_pc_velo, pts_2d, fov_inds = get_lidar_in_image_fov(pc_velo, calib, 0, 0, img_width, img_height, True)
draw_lidar(imgfov_pc_velo, show=True)

Python创建自己的聊天机器人
(6) Lidar三维可视化

 draw_lidar(pc_velo, show=True)

Python创建自己的聊天机器人
(7) Lidar绘制3D bbox

绘制 Lidar3D bbox时,需要进行坐标系转换, KITTI 数据集中给出的是物体在相机坐标系的位置 (x,y,z),这里借助标定文件将其转换为 Lidar坐标系下位置,同时借助物体bbox 尺寸 (h,w,l)计算3D框8个顶点坐标。

show_lidar_with_boxes(pc_velo, objects, calib,  True, img_width, img_height)

Python创建自己的聊天机器人
(8) Lidar鸟瞰图

鸟瞰图绘制时将点云数据进行了预处理,只选取 x 坐标位于 [0,70.4],y坐标位于 [-40,40]的有效点。

show_lidar_topview(pc_velo, objects, calib)

Python创建自己的聊天机器人
(9) Lidar鸟瞰图绘制2D bbox

绘制时为了区分物体距激光雷达距离,将 30米内目标使用绿色标志30米-50米内目标使用红色标志50米以外目标使用蓝色标志(场景 0000010无此距离目标。)

img1 = cv2.imread('000010_BEV.png')
img = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
show_lidar_topview_with_boxes(img1, objects, calib)

Python创建自己的聊天机器人

Original: https://blog.csdn.net/cg129054036/article/details/119516704
Author: 自动驾驶小学生
Title: KITTI自动驾驶数据集可视化教程