智能问答机器人

article/2025/8/28 20:33:23

1. 前言

问答机器人现在很多场合都有使用,比如:网页智能客服、微信公众号智能回复、淘宝的售后客服,QQ聊天机器人等等。有了这些客户机器人就能帮我们回答很多预置的一些问题,帮助用户解决常见问题,还可以进行自主训练,得到一个适合自己使用的机器人。机器人也可以关联很多其他的技能,玩小游戏,查询天气、查询节假日、查询很多其他的信息,非常方便。

这篇文章就采用华为云提供的智能问答机器人设计一个小软件,采用华为云提供的API接口完成数据交互,与机器人进行问答交互,通过这个例子可以了解到智能问答机器人的基本功能、使用场景、使用方法等等。

image-20220209135931880

华为云的智能问答机器人特点介绍

提供问答引擎、机器人管理平台来方便客户快速、低成本构建智能问答服务。智能问答能满足用户快速上线、高度定制、数据可控的需求,具有问答准确率高、自主学习等特点。能够帮助企业节省客服人力,大大降低客服响应时间。

具备如下优势点:

  • 智能的问答管理
    • 热点问题、趋势、知识自动分析统计。
    • 支持未知问题自动聚类,匹配相似问答,辅助人工不断扩充知识库。
    • 支持问答调测,点对点的监测智能应答过程。
    • 支持领域知识挖掘,提供易用的标注工具挖掘领域词。
  • 全面的对话管理
    • 支持自然语言多能力融合,智能对话中控。
    • 灵活的知识库管理,支持对知识的批量操作。
    • 支持嵌入多轮对话技能,满足复杂的任务型对话场景。
  • 高效训练部署
    • 基于modelarts的底层算法能力,提供更快的模型训练、部署能力。
    • 支持多算法模型效果验证,验证不同数据、参数、模型对问法效果的影响。
    • 支持模型最优参数组合推荐,保证问答效果。

2. 使用问答机器人服务

2.1 开通服务

地址: https://www.huaweicloud.com/product/cbsqa.html

点击立即使用会进入到购买页面,可以免费体验14天,对于技术评估,场景测试已经足够。

image-20220209093930052

image-20220209093946385

image-20220209094116181

image-20220209094130563

2.2 配置机器人

(1)机器人购买之后,点击进入管理页面,对机器人的属性、技能进行配置,训练。

image-20220209094415424

image-20220209094456180

(2)可以添加预置的技能,还可以添加自定义技能

预置的技能有查询天气、成语接龙、查星座、查节日、猜数字游戏等等。也可以自己自定义技能标注训练发布。

image-20220209094751127

image-20220209094705889

2.3 对话体验

在管理页面右上角可以在线体验与机器人对话,可以快速调试问答效果。

image-20220209131421310

image-20220209131504326

2.4 接口调试

地址: https://support.huaweicloud.com/api-cbs/cbs_03_0115.html

在调用API测试之前,可以先使用在线调试接口测试,了解请求如何发出,有哪些必填参数,请求参数怎么填,返回的结果格式是怎样的。

image-20220209131616278

2.5 API请求总结

(1)请求的URL格式

请求的URL格式: POST /v1/{project_id}/qabots/{qabot_id}/chat
其中参数介绍: 
project_id  是项目ID。
qabot_id 是机器人标识符,qabot编号,UUID格式。如:303a0a00-c88a-43e3-aa2f-d5b8b9832b02。
登录对话机器人服务控制台,在智能问答机器人列表中就可以查看到abot_id。最终拼接的URL格式: https://cbs-ext.cn-north-4.myhuaweicloud.com/v1/0e5957be8a00f53c2fa7c0045e4d8fbf/qabots/5c889415-6834-4ada-aa51-ea5000941e25/chat    

image-20220209131851505

(2)请求头与请求参数总结

请求头:  
"X-Auth-Token": "------------",  这是API接口鉴权用的,所有的API请求都要这个参数
"Content-Type": "application/json"请求体: 
{"question": "北京天气"  这是给机器人提交的问题,随后机器人会返回答案
}响应结果:
{"request_id": "e3ab440c-0bb2-455b-aff8-07e4cc4115f4","reply_type": 1,"taskbot_answers": {"answer": "当前北京天气晴,最高8摄氏度,最低-5摄氏度,日间南风≤3级,夜间南风≤3级。","skill_id": "22a20348-aa8b-44d2-96df-dcae1b8d92c2","skill_responses": [{"frame": {"intention": "weather_query","confidence": 1,"reply": "当前北京天气晴,最高8摄氏度,最低-5摄氏度,日间南风≤3级,夜间南风≤3级。","intention_alias": "查天气","candidate_words": [],"task_complete": true,"flow_complete": true,"current_slots": [{"slot_id": "a9ee29df-8f60-4ff1-863e-60e9412a1f95","slot_name": "地点","slot_identification": "loc","slot_values": [{"word": "北京","norm_word": "北京","begin_position": 0,"end_position": 1}]}],"history_slots": []},"candidate": {"candidate_confidence": 0},"skill_id": "22a20348-aa8b-44d2-96df-dcae1b8d92c2","skill_version": "v50","locked": false,"related_intentions": [{"intention": "weather_query","confidence": 1}]},{"frame": {"confidence": 0,"reply": "你太难理解了,我需要一些信息才能知道呢,哼!","candidate_words": [],"task_complete": true,"flow_complete": true,"current_slots": [],"history_slots": []},"candidate": {"candidate_confidence": 0},"skill_id": "8b71d740-aedb-4c01-8948-460dab64fd22","skill_version": "v67","locked": false,"related_intentions": [{"intention": "constellation","confidence": 0.513}]},{"frame": {"confidence": 0,"reply": "对不起,我没明白,请再多教我一些吧","candidate_words": [],"task_complete": true,"flow_complete": true,"current_slots": [],"history_slots": []},"candidate": {"candidate_intention": "chengyu","candidate_confidence": 0.507154},"skill_id": "9d2aa6d4-8461-4ca7-9db8-af32fdbfde57","skill_version": "v12","locked": true,"related_intentions": [{"intention": "chengyu","confidence": 0.507}]},{"frame": {"confidence": 0,"reply": "对不起,我没明白,请再多教我一些吧","candidate_words": [],"task_complete": true,"flow_complete": true,"current_slots": [],"history_slots": []},"candidate": {"candidate_confidence": 0},"skill_id": "4a93acd4-5a29-4188-b033-9fffd932e5df","skill_version": "v31","locked": true,"related_intentions": [{"intention": "sys.other","confidence": 0.555}]},{"frame": {"confidence": 0,"reply": "对不起,我没明白,请再多教我一些吧","candidate_words": [],"task_complete": true,"flow_complete": true,"current_slots": [],"history_slots": []},"candidate": {"candidate_confidence": 0},"skill_id": "25ad99ee-8a13-40a2-8fa1-0a18370e2ef5","skill_version": "v34","locked": false,"related_intentions": [{"intention": "sys.other","confidence": 0}]}]},"session_id": "4b105ca2-28e2-4ec8-bd4b-87c8d7c6a322"
}

请求头里的X-Auth-Token字段在之前的文章已经介绍过,获取方法看这里: https://bbs.huaweicloud.com/blogs/317759 翻到2.3小节。

(3)请求参数介绍

详细的参数可以看官方文档介绍: https://support.huaweicloud.com/api-cbs/cbs_03_0115.html

请求参数里一般主要填下面两个字段:question 这是必填的参数,填用户的问题。如:查天气。长度为1~512。session_id 填会话标识符,UUID格式。如:c04e6f7b-61d7-4a2d-a0c8-f9ecd2f62359。
每次对话开启,机器人创建会话id,下次请求中传入该id表示继续该轮对话,每轮会话有效时间为2分钟。
若传入的会话id已过期或者为空,则机器人会重新创建新的会话id(重新创建会话id会消耗一定时间)。
比如: 玩成语接龙游戏,就需要填会话标识ID,这样才可以接着上一次的对话继续问答。

(4)响应参数介绍

reply_type 表示当前回答的类型0 知识库回复。1 技能回复。2 闲聊回复。3 图谱回复。4 文档回复。5 表格回复。session_id  这是当前的会话id,每次对话开启,机器人创建会话id,下次请求中传入该id表示继续该对话,每轮会话有效时间为2分钟。以技能回复为例:  
"taskbot_answers": {
"answer": "当前北京天气晴,最高8摄氏度,最低-5摄氏度,日间南风≤3级,夜间南风≤3级。",
}

3. 实现效果与案例代码

3.1 实现效果

(1)成语接龙

image-20220209123137225

(2)天气查询

image-20220209133929894

(3)查星座

image-20220209134248235

image-20220209134346517

(4)猜数字游戏

image-20220209134752735

3.2 核心代码

image-20220209134858362

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("智能问答机器人");//读取之前保存的token数据QString data_token=ReadDataFile();if(!data_token.isEmpty()){Token=data_token.toUtf8();qDebug()<<"读取到之前的数据:"<<Token;}/*网络请求设置*/manager = new QNetworkAccessManager(this);connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));//机器人ui->listWidget->addItem(new QListWidgetItem(QIcon(QObject::tr(":/res/2.ico")), QObject::tr("您好,很高兴为你服务.")));}Widget::~Widget()
{delete ui;
}/*
功能: 保存数据到文件
*/
void Widget::SaveDataToFile(QString text)
{/*保存数据到文件,方便下次加载*/QString file;file=QCoreApplication::applicationDirPath()+"/"+ConfigFile;QFile filesrc(file);filesrc.open(QIODevice::WriteOnly);QDataStream out(&filesrc);out << text;  //序列化写字符串filesrc.flush();filesrc.close();
}/*
功能: 从文件读取数据
*/
QString Widget::ReadDataFile(void)
{//读取配置文件QString text,data;text=QCoreApplication::applicationDirPath()+"/"+ConfigFile;//判断文件是否存在if(QFile::exists(text)){QFile filenew(text);filenew.open(QIODevice::ReadOnly);QDataStream in(&filenew); // 从文件读取序列化数据in >> data; //提取写入的数据filenew.close();}return data; //返回值读取的值
}/*
功能: 获取token
*/
void Widget::GetToken()
{//表示获取tokenfunction_select=3;QString requestUrl;QNetworkRequest request;//设置请求地址QUrl url;//获取token请求地址requestUrl = QString("https://iam.%1.myhuaweicloud.com/v3/auth/tokens").arg(SERVER_ID);//自己创建的TCP服务器,测试用//requestUrl="http://10.0.0.6:8080";//设置数据提交格式request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8"));//构造请求url.setUrl(requestUrl);request.setUrl(url);QString text =QString("{\"auth\":{\"identity\":{\"methods\":[\"password\"],\"password\":""{\"user\":{\"domain\": {""\"name\":\"%1\"},\"name\": \"%2\",\"password\": \"%3\"}}},""\"scope\":{\"project\":{\"name\":\"%4\"}}}}").arg(MAIN_USER).arg(IAM_USER).arg(IAM_PASSWORD).arg(SERVER_ID);//发送请求manager->post(request, text.toUtf8());
}//解析反馈结果
void Widget::replyFinished(QNetworkReply *reply)
{QString displayInfo="";int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();//读取所有数据QByteArray replyData = reply->readAll();qDebug()<<"状态码:"<<statusCode;qDebug()<<"反馈的数据:"<<QString(replyData);//更新tokenif(function_select==3){displayInfo="token 更新失败.";//读取HTTP响应头的数据QList<QNetworkReply::RawHeaderPair> RawHeader=reply->rawHeaderPairs();qDebug()<<"HTTP响应头数量:"<<RawHeader.size();for(int i=0;i<RawHeader.size();i++){QString first=RawHeader.at(i).first;QString second=RawHeader.at(i).second;if(first=="X-Subject-Token"){Token=second.toUtf8();displayInfo="token 更新成功.";//保存到文件SaveDataToFile(Token);break;}}QMessageBox::information(this,"提示",displayInfo,QMessageBox::Ok,QMessageBox::Ok);return;}//判断状态码if(200 != statusCode){//解析数据QJsonParseError json_error;QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error);if(json_error.error == QJsonParseError::NoError){//判断是否是对象,然后开始解析数据if(document.isObject()){QString error_str="";QJsonObject obj = document.object();QString error_code;//解析错误代码if(obj.contains("error_code")){error_code=obj.take("error_code").toString();error_str+="错误代码:";error_str+=error_code;error_str+="\n";}if(obj.contains("error_msg")){error_str+="错误消息:";error_str+=obj.take("error_msg").toString();error_str+="\n";}//显示错误代码QMessageBox::information(this,"提示",error_str,QMessageBox::Ok,QMessageBox::Ok);}}return;}//对话返回if(function_select==0){//解析数据QJsonParseError json_error;QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error);if(json_error.error == QJsonParseError::NoError){//判断是否是对象,然后开始解析数据if(document.isObject()){QString error_str="";QJsonObject obj = document.object();QString answer;//解析对话IDif(obj.contains("session_id")){session_id=obj.take("session_id").toString();qDebug()<<"持续对话ID: "<<session_id;}//解析答案if(obj.contains("taskbot_answers")){QJsonObject obj1=obj.take("taskbot_answers").toObject();if(obj1.contains("answer")){answer=obj1.take("answer").toString();}}qDebug()<<"答案:"<<answer;//机器人ui->listWidget->addItem(new QListWidgetItem(QIcon(QObject::tr(":/res/2.ico")), answer));}}}
}//获取对话结果
void Widget::getProblemResult(QString session_id,QString send_text)
{//表示获取对话结果function_select=0;QString requestUrl;QNetworkRequest request;//设置请求地址QUrl url;//获取token请求地址requestUrl = QString("https://cbs-ext.%1.myhuaweicloud.com/v1/%2/qabots/%3/chat").arg(SERVER_ID).arg(PROJECT_ID).arg(ROBOT_ID);//设置数据提交格式request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));//设置tokenrequest.setRawHeader("X-Auth-Token",Token);//构造请求url.setUrl(requestUrl);request.setUrl(url);QString text =QString("{\"question\": \"%1\",\"session_id\":\"%2\"}").arg(send_text).arg(session_id);//发送请求manager->post(request, text.toUtf8());
}//发送问答
void Widget::on_pushButton_send_clicked()
{QString text=ui->lineEdit->text();if(text.isEmpty()){return;}QListWidgetItem *item;item=new QListWidgetItem(text);item->setTextAlignment(Qt::AlignRight);item->setTextColor(QColor("#FF1493"));ui->listWidget->addItem(item);getProblemResult(session_id,text);
}//更新token
void Widget::on_pushButton_token_clicked()
{GetToken();
}

http://chatgpt.dhexx.cn/article/Iok2FlLl.shtml

相关文章

智能问答机器人概述

智能问答机器人概述 总览任务机器人FAQ机器人闲聊机器人 总览 处理逻辑&#xff1a; query–>中控逻辑–>response 任务机器人 指特定条件下提供信息或服务的机器人。 任务型机器人核心模块主要包括三部分&#xff1a; 自然语言理解模块 —— Language Understanding …

数仓实时数据同步 debezium

数仓实时数据同步 debezium 背景debezium 简介架构基本概念 例子Router目前遇到的问题 背景 数据湖将源库的数据同步到hive数仓ods层&#xff0c;或直接在kafka中用于后面计算。源库包括mysql、postgresql、sqlserver、oracle&#xff0c;大部分是mysql数据库。当前采用的sqoo…

基于日志的同步数据一致性和实时抽取

宜信技术研发中心架构师 目前就职于宜信技术研发中心&#xff0c;任架构师&#xff0c;负责流式计算和大数据业务产品解决方案。曾任职于Naver china&#xff08;韩国最大搜索引擎公司&#xff09;中国研发中心资深工程师&#xff0c;多年从事CUBRID分布式数据库集群开发和CUB…

解析 TiDB 在线数据同步工具 Syncer

TiDB 是一个完全分布式的关系型数据库&#xff0c;从诞生的第一天起&#xff0c;我们就想让它来兼容 MySQL 语法&#xff0c;希望让原有的 MySQL 用户 (不管是单机的 MySQL&#xff0c;还是多机的 MySQL Sharding) 都可以在基本不修改代码的情况下&#xff0c;除了可以保留原有…

服务器与客户端的数据同步

2019独角兽企业重金招聘Python工程师标准>>> 问题 从一个例子说起&#xff0c;我们的客户端从服务器获取数据&#xff0c;这里假定获取文章。第一次使用&#xff0c;我们获取服务器端最新发表的几篇文章。 我们可以每次都重新获取&#xff0c;但这样费时又费流量。好…

数据实时同步或抽取上收的技术分析

原文&#xff1a;http://blog.csdn.net/dsg_gulibin/article/details/1696365 1 实现数据集中的技术手段分析比较 根据业界提供数据同步或抽取的解决方案来看&#xff0c;主要包括以下几大类&#xff1a; l 存储复制技术 l 数据库复制技术 l …

时间同步/集群时间同步/在线/离线

目录 一、能够连接外网 二、集群不能连接外网--同步其它服务器时间 一、能够连接外网 1.介绍ntp时间协议 NTP&#xff08;Network Time Protocol&#xff09;网络时间协议&#xff0c;是用来使计算机时间同步的一种协议&#xff0c;它可以使计算机对其服务器或时钟源做同步…

如何实时同步数据到StarRocks

我们知道&#xff0c;是StarRocks基于Doris开发的&#xff0c;它在多表连接查询的性能方面引领OLAP市场&#xff0c;是一个很好用的结构化数据仓库。但是一直没有很好的工具能够实现业务数据库的数据实时同步到StarRocks分布式数据仓库集群中&#xff0c;本文将带领读者一起来通…

文件实时同步

rsync remote sync 远程同步&#xff0c;同步是把数据从缓冲区同步到磁盘上去的、数据在内存缓存区完成之后还没有写入到磁盘中去、所以有时候要同步到磁盘中去的&#xff0c;而rsync说白了跟复制差不多、能将一个文件从一个地方复制到另外一个地方的、但是他也可以实现跨主机复…

系统间通讯实现数据信息实时同步解决方案

项目开发阶段遇到一个需求&#xff0c;描述大致就是同一个用户在A系统数据库保存的数据信息与在B系统数据库保存的数据信息要保持同步。当A系统用户修改了个人信息&#xff0c;A系统后台在将用户修改后的信息入库的同时也会向B系统发送消息&#xff0c;让B系统后台进行自动数据…

一文带你玩转实时数据同步方案

1、概述 1.1、目标 实时数据同步主要实现从源数据库到目标数据库的实时数据同步。源数据主要支持mysql数据库&#xff0c;目标数据包括mysql数据库和hbase数据库。 下面是实时数据同步的数据流转图&#xff0c;mysql的增量订阅数据经过canal和kafka&#xff0c;数据最终实时…

两台服务器同时写文件 怎么做同步,两台服务器做实时数据同步

两台服务器做实时数据同步 内容精选 换一换 DCS Memcached即将下线&#xff0c;部分Region已暂停售卖&#xff0c;建议使用Redis4.0/5.0。本章节主要描述Memcached主备实例。Memcached主备实例在单机实例基础上&#xff0c;增强服务高可用以及数据高可靠性。Memcached主备实例具…

实时数据同步方案

一.Flume收集各数据库日志&#xff0c;准实时抽取到HDFS 安装HDP&#xff0c;包含Flume 方案优点&#xff1a; 1.配置简单&#xff0c;不用编程&#xff1a;只要在flume.conf文件中配置source、channel及sink的相关属性 2.采用普通SQL轮询的方式实现&#xff0c;具有通用性&…

如何实现数据自动化的实时同步?

企业在日常业务中&#xff0c;比如总分支机构之间、数据中心之间、不同节点之间、跨国业务之间等&#xff0c;都需要将文件及时的传输&#xff0c;以供协同使用。所以&#xff0c;很多企业会选择一些同步工具或软件。 谈到文件同步备份大家使用较多的可能是Rsync、同步盘等一些…

像素是什么,一个像素有多大,像素和分辨率的关系

图片的像素和分辨率 对于像素和分辨率这两个词&#xff0c;主要见于图片和显示设备上。只要你用到手机里的照相功能&#xff0c;你都要接触到这两个概念。只是大多数人都是一知半解&#xff0c;而更多的人却根本就不知道&#xff0c;白白浪费了手机里500万、800万像素的摄影头&…

屏幕尺寸、分辨率、DPI、PPI

屏幕尺寸 下面这张图是华为荣耀7的尺寸图&#xff0c;图上写的是5.2英寸。我们所说的这个5.2英寸是手机屏幕对角线的长度。 我们平时是不用英寸这个单位的&#xff0c;我们用的是毫米&#xff0c;厘米&#xff0c;米这些单位。那么英寸和毫米&#xff0c;厘米之间怎样的换算关…

像素(Pixel)、DPI与PPI一看就明白

像素&#xff08;Pixel&#xff09;、DPI与PPI 像素&#xff08;Pixel&#xff09;DPI 英文全写是(Dots Per Inch&#xff0c;每英寸点数)PPI 英文全写是(Pixels Per Inch&#xff0c;每英寸像素数)比喻来区分应用&#xff08;这张图熟悉吗&#xff09;1.分辨率啥意思&#xff…

关于像素、分辨率、PPI、DPI等概念的分析

关于影像图的比例尺和分辨率&#xff1a;https://blog.csdn.net/liliiii/article/details/40261953 当我们说到 像素、分辨率、DPI、PPI等专业术语的时候&#xff0c;一般会涉及到图像、屏幕、打印机等等。 像素&#xff08;Pixel&#xff09;为图像显示的基本单位&#xff0c;…

分辨率 PPI DPI概念定义详解

我们在开发中&#xff0c;涉及到UI显示时&#xff0c;经常会遇到的一些概念&#xff0c;比如分辨率&#xff0c;ppi&#xff0c;dpi等&#xff0c;这些概念&#xff0c;在百度百科中&#xff0c;发现都有对它们的定义&#xff0c;一些博客中&#xff0c;也有对这几个概念的对比…

DPI与PPI的区别

开发中不免会遇到分辨率、DPI、PPI和屏幕尺寸等术语&#xff0c;那就弄弄清楚这些概念的真正含义。 分辨率 分辨率这个词在很多地方都有&#xff0c;比如相机、视频、扫描仪。这里说的就是显示器的分辨率。显示器是由一个个像素点(pixel)所组成的&#xff0c;一般所说的显示器…