基于百度理解与交互技术实现机器问答

linbin524 linbin524     2022-10-07     412

关键词:

总目录地址:AI 系列 总目录 

 

需要最新源码,或技术提问,请加QQ群:538327407

 

我的各种github 开源项目和代码:https://github.com/linbin524

 

一、前言

我们都知道现在聊天对话机器是一个很有意思的东西,比如说苹果siri,比如说微软的小冰。

聊天对话机器的应用场景也很广泛,比如说:银行的自助办卡机器人、展会讲解解说等等。

 

我们对机器人说句话,机器人从听取,到语义识别,认知转换,到最后调出我们所想要的东西,这个过程看似简单,其实内藏许多黑科技,让我们来一一解析一下。

 

1、我们对机器人说句话:我想看一下今天的天气?

技术实现:不论是语音、文字,机器首先要采集到我们的问题,语音还需要语音转换的一个过程,且内容转换结果必须准确,否则就有点像不同语言体系的人在对话,有种鸡同鸭讲的感觉,结果肯定也是一个大坑了。

 

2、语义识别

技术实现:通常这个阶段,已经将内容转换为一段文字,程序会对文字进行分词,结合关键字截取拼接语义(这里需要AI的训练)

3、认知转换

技术实现:上述的那就话中,今天是个关键词,天气是个关键词,  在训练库中需要提炼词槽,将可能语句尽可能提供给机器人

 

4、调用结果

当认知转换完成后,需要对关键词进行规则判断,比如说, 想看 + 今天+ 天气,组成时候,自动调用查询天气接口

 

上述的结果,更多需要我们对机器人进行训练,让它学习,要不然结果肯定不是那么友好的。

 

 

二、技术需求

 

通过文字输入问题,动态理解转化,识别内容,进行机器解答和语音提示。

PS:上述的需求基本可以理解为你叫机器人做一件事,机器人领悟,按照你的要求执行。

进阶:可以采用语音输入,转换为文字,之后的序列一样。(需要阵列麦克风)

三、技术选型

1、采用C# winform 作为程序主题

2、采用win7 TTS 作为语音朗读功能

3、采用百度理解交互技术 UNIT 作为识别基础

 本篇的重点在于如何对机器UNIT 进行配置与训练(机器识别会理解错误,需要进行纠错),最后的winform 只是调用结果显示,不作为重点关注。

四、实现

1、新建winform 窗体

 

 

2、添加TTS,引用System.Speech

 

 

3、进行 语音朗读测试

 

SpeechSynthesizer voice = new SpeechSynthesizer(); //创建语音实例
voice.Rate = 2; //设置语速,[-10,10]
voice.Volume = 100; //设置音量,[0,100]
voice.SpeakAsync(“您好!”); //播放指定的字符串,这是异步朗读

 

PS:有些win7 系统TTS 有问题,需要自己百度查找,下载TTS 进行安装。目前上述支持中文,输入英文,只会念字母,因为需要朗读类别做转换,详细请百度speech 操作。

 

 

 4、结合百度理解与交互技术

 

百度提供的sdk 目前只支持android 和IOS,但有提供http API,所以笔者采用C#实现了。

先去官网注册成为百度开发者。

 

(1) 创建应用

 

 (2) 创建场景,场景编号是后面需要用到的

 

 

(3)新建单元,官方提供对话单元和问答单元,我们选择创建对话单元

 

 

 

(4)、对对话单元进行配置,新建词藻

 

 

 

 

新建词藻

 词藻词典有自定义的,也有系统的,本文中选择系统通用的。也可以下载自定义模板,写入自己的自定义词典

 

 

这个对话单元中,有文本回复和执行函数,我们这里选文本回复

触发的规则:会话规则中,上述的词藻已填充,那么文本内容才会出现

 

 

保存完成,后再次新建对话单元,主要说明介绍我们的公司

 

 

 

 

 

 跳转到数据中心,进行新建对话样本

 

 

 

 

 添加

 

 依法将公司介绍关键词添加

 

来的训练与验证板块

输入打开菜单,一开始输入,可能得到错误答案,你要 @UNIT 纠正意图与词槽,手动将关键词和意图、取词、词藻匹配上

 

 

 完成后的结果:

 

(1)、

配置基本参数

 

    /// <summary>
    /// 理解与交互技术UNIT 
    /// </summary>
    public class ConfigUnit
    {
        /// <summary>
        /// Api key
        /// </summary>
        public static String clientId = "";
        // 百度云中开通对应服务应用的 Secret Key
        public static String clientSecret = "";
        //场景Id
        public static string clientSceneId = "";
    }

 

部分解析实体model

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BaiduAIAPI.Model.UnitModel
{
    public class UnitModel
    {

        public long log_id { get; set; }
        public string error_code { get; set; }

        public string error_msg { get; set; }

        public UnitResult result { get; set; }

        public bool IsSuccess { get; set; }

        public string returnSay { get; set; }
    }

    public class UnitResult
    {

        public string session_id { get; set; }
        public List<UnitAction_list> action_list { get; set; }
        public object schema { get; set; }
        public object qu_res { get; set; }
    }
    public class UnitAction_list
    {

        public string action_id { get; set; }
        public object action_type { get; set; }
        public object arg_list { get; set; }
        public object code_actions { get; set; }

        public float confidence { get; set; }

        public object exe_status { get; set; }

        public string main_exe { get; set; }

        public string say { get; set; }

        public object hint_list { get; set; }
        
    }

    /// <summary>
    /// 其余的model 还没补充完整
    /// </summary>
    public class UnitSchema {


    }

}

错误信息定义

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BaiduAIAPI.Type
{
   public class BaiduUnitType
    {
        public static string GetErrorCodeToDescription(string errorCode)
        {
            string errorDecrition = "";

            switch (errorCode)
            {

                case "1": errorDecrition = "服务器内部错误,请再次请求, 如果持续出现此类错误,请通过QQ群(224994340)联系技术支持团队。"; break;
                case "2": errorDecrition = "服务暂不可用,请再次请求, 如果持续出现此类错误,请通过QQ群(224994340)或工单联系技术支持团队。"; break;

                case "3": errorDecrition = "调用的API不存在,请检查后重新尝试。"; break;
                case "4": errorDecrition = "集群超限额。"; break;
                case "6": errorDecrition = "无权限访问该用户数据。"; break;
                case "14": errorDecrition = "IAM鉴权失败,建议用户参照文档自查生成sign的方式是否正确,或换用控制台中ak sk的方式调用。"; break;
                case "17": errorDecrition = "每天请求量超限额。"; break;
                case "18": errorDecrition = "QPS超限额。"; break;
                case "19": errorDecrition = "请求总量超限额。"; break;

                case "100": errorDecrition = "无效的access_token参数,请检查后重新尝试。"; break;
                case "110": errorDecrition = "access token无效。"; break;
                case "111": errorDecrition = "access token过期。"; break;
                case "282004": errorDecrition = "请求参数格式不正确。"; break;
                case "282900": errorDecrition = "必传字段为空。"; break;
                case "282901":
                    errorDecrition = "场景ID校验失败,请确认console中app和场景是否关联了:https://console.bce.baidu.com/ai/#/ai/unit/app/list。"; break;
                case "282902":
                    errorDecrition = "UNIT环境启动中,请稍后再试;如果持续出现此类错误,请通过QQ群(224994340)联系技术支持团队。"; break;

                case "282903":
                    errorDecrition = "UNIT系统异常;如果持续出现此类错误,请通过QQ群(224994340)联系技术支持团队。"; break;
                    
                        
                case "282000": errorDecrition = "服务器内部错误,如果您使用的是高精度接口,报这个错误码的原因可能是您上传的图片中文字过多,识别超时导致的,建议您对图片进行切割后再识别,其他情况请再次请求, 如果持续出现此类错误,请通过QQ群(631977213)或工单联系技术支持团队。"; break;
             
                default: errorDecrition = "未知的错误!"; break;
            }

            return errorDecrition;

        }
    }
}

 

封装的接口方法

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.UI.WebControls;
using AOP.Common;
using BaiduAIAPI.Model.UnitModel;
using BaiduAIAPI.Type;

namespace BaiduAIAPI.UNIT
{
    public class UnderstandingAndInteractiveTechnology
    {

        // unit对话接口
        public static UnitModel Unit_Utterance(string token, string sceneId, string query)
        {
            UnitModel result = new UnitModel();
            #region 基础校验
            string error = "";
            if (string.IsNullOrWhiteSpace(token))
            {
                error += "token不能为空!";
            }
            if (string.IsNullOrWhiteSpace(sceneId))
            {
                error += "场景编号不能为空!";
            }

            if (string.IsNullOrWhiteSpace(query))
            {
                error += "询问问题不能为空!";
            }

            if (!string.IsNullOrWhiteSpace(error))
            {
                result.error_msg = error;
                return result;
            }
            #endregion

            string host = "https://aip.baidubce.com/rpc/2.0/solution/v1/unit_utterance?access_token=" + token;
            string str = "{\"scene_id\":" + sceneId + ",\"query\":\"" + query + "\", \"session_id\":\"\"}"; // json格式 
            var tempResult = HttpRequestHelper.Post(host, str);


             result=Json.ToObject<UnitModel>(tempResult);

            if (!string.IsNullOrWhiteSpace(result.error_code))
            {
                result.error_msg = BaiduUnitType.GetErrorCodeToDescription(result.error_code);
                result.IsSuccess = false;
            }
            else
            {
                result.IsSuccess = true;
                result.returnSay = result.result.action_list[0].say;
            }

            return result;
        }
    }
}

 

首先用单元测试结果:

 

using System;
using BaiduAIAPI;
using BaiduAIAPI.UNIT;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace AIAPIUnitTestProject.BaiduAIAPI
{
    [TestClass]
    public class BaiduUnitTest
    {
        [TestMethod]
        public void TestChat()
        {
            var accessTokenModel = Access_Token.GetAccessToken(ConfigUnit.clientId, ConfigUnit.clientSecret);
            if (accessTokenModel.IsSuccess)
            {
                string queryString = "今天天气怎么样?";
                var tempUnitResult = UnderstandingAndInteractiveTechnology.Unit_Utterance(accessTokenModel.SuccessModel.access_token, ConfigUnit.clientSceneId, queryString);

              

            }

        }
    }
}

 

确定接口没有问题,结合到我们的Demo程序中,界面代码如下:

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Speech.Synthesis;
using BaiduAIAPI;
using BaiduAIAPI.UNIT;
using BaiduAIAPI.Model.UnitModel;

namespace SpeechDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();


        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (tb_YourSay.Text.Trim() == "")
            {

                MessageBox.Show("请你输入你要说的话!");
                return;
            }
            UnitModel result = new UnitModel();
            var accessTokenModel = Access_Token.GetAccessToken(ConfigUnit.clientId, ConfigUnit.clientSecret);
            if (accessTokenModel.IsSuccess)
            {
                string queryString = tb_YourSay.Text.Trim();
                result = UnderstandingAndInteractiveTechnology.Unit_Utterance(accessTokenModel.SuccessModel.access_token, ConfigUnit.clientSceneId, queryString);
            }
            else
            {
                result.returnSay = result.error_msg;
            }
            tb_RobotSay.Text = result.returnSay;
            SpeechSynthesizer voice = new SpeechSynthesizer();   //创建语音实例
            voice.Rate = 2; //设置语速,[-10,10]
            voice.Volume = 100; //设置音量,[0,100]
           
            voice.SpeakAsync(result.returnSay);  //播放指定的字符串,这是异步朗读
          

        }
    }
}

 

结果展示

 

 

评价

理解和交互需要做大量的对话样本和语言交互纠错,才可以实现相对比较精准的回答。

 

c#使用词嵌入向量与向量数据库为大语言模型(llm)赋能长期记忆实现私域问答机器人落地

 本文将探讨如何使用c#开发基于大语言模型的私域聊天机器人落地。大语言模型(LargeLanguageModel,LLM这里主要以chatgpt为代表的的文本生成式人工智能)是一种利用深度学习方法训练的能够生成人类语言的模型。这种模型可以... 查看详情

chatgpt-聊天机器人

...聊天机器人3.1聊天机器人的定义与发展聊天机器人是一种基于人工智能技术的智能对话系统,旨在模仿人类的对话方式与用户进行交互。聊天机器人可以通过自然语言处理技术和机器学习算法分析用户的输入,理解用户的意图和... 查看详情

腾讯算法高级研究员陈松坚:智能问答技术及其应用

...实现路径,包括单轮问答机器人,多轮问答机器人及阅读理解机器人。其中重点阐述了单轮问答机器人的实现原理,包括字面匹配,词向量匹配,深度语义匹配,迁移学习等技术。此后他还分享了小知团队将上述技术产品化的经... 查看详情

利用百度ai快速开发出一款“问答机器人”并接入小程序

先看实现效果: 利用百度UNIT预置的智能问答技能和微信小程序,实现语音问答机器人。这里主要介绍小程序功能开发实现过程,分享主要功能实现的子程序模块,都是干货!想了解UNIT预置技能调用,请参看我之前的帖子:《... 查看详情

基于udp协议实现的‘智能’问答机器人(代码片段)

‘智能’问答机器人效果客户端代码服务端代码思想效果客户端输入消息后:服务端就会自动应答:👇客户端代码/***user:ypc;*date:2021-06-29;*time:21:03;*使用UDP创建一个客户端*/publicclassUDPDemo1//创建服务端的ip地... 查看详情

问答系统介绍

...#160;   (2)生成式3.依据答案来源分类:(1)基于知识图谱问答系统(2)机器阅读理解的问答系统(3)基于问答对的问答系统    定义:给定自然语言处理问题,通过对问题进行语义理解和解析,进而... 查看详情

基于百度语音和图灵的交互机器人

1.准备工作:(1)硬件:树莓派3b  usb麦克风  音响(2) 软件:百度语音api  图灵机器人api python2或3(树莓派自带)mplayer 申请一个百度语音账号,创建一个新应用,并获取相应的Key,截图如下:... 查看详情

alexaminifn功能

AlexaMiniFN是一款高性能小型AI模型。它利用基于机器学习的技术,将计算机视觉技术与语音技术相结合,使用者可以通过语音指令来控制机器人,完成诸如识别物体、语音识别、自然语言理解等多种计算机视觉任务。它还可以用... 查看详情

gpt2训练自己的对话问答机器人(代码片段)

...cn/simple/pipinstallpandaspipinstallmatplotlibpipinstalljieba2.理论研究基于GPT2的中文闲聊机器人,模型实现基于HuggingFace的transformers,精读GPT2-Chinese的论文和代码,获益匪浅。3.模型训练与测试data/train.txt:默认的原 查看详情

作业三

...实现的事情是,手机用户与小娜的智能交互,不是简单地基于存储式的问答, 查看详情

简单剖析智能语音交互技术

...部分自动语音识别(AutomaticSpeechRecognition,ASR),自然语言理解(NaturalLanguageUnders 查看详情

基于servlet的技术问答网站系统实现

这一篇博客将详细介绍一个基于Servlet的问答网站的实现,有详细的代码。可能篇幅较长,以代码为主,有兴趣的童鞋看完可以尝试动手搭建一个属于自己的问答社区。工具:Eclipse,数据库用到了MySQL,这次项目中未使用jsp,全... 查看详情

自然语言处理基础知识

...人能够理解的语言,比如文本生成、自动文摘等。NLP技术基于大数据、知识图谱、机器学习、语言学等技术和资源,并可以形成机器翻译、深度问答、对话系统的具体应用系统,进而服务于各类实际业务和产品。NLP在金融方面金... 查看详情

美团知识图谱问答技术实践与探索

...、售后全链路的多个场景中都存在大量的咨询问题。我们基于问答系统,以自动智能回复或推荐回复的方式,来帮助商家提升 查看详情

kg美团知识图谱问答技术实践与探索(代码片段)

...景中,用户都有大量的问题需要咨询商家。因此我们基于问答系统,以自动智能回复或推荐回复的方式,来帮助商家提升回答用户问题的效率,更快地解决用户的问题。针对不同问题,美团的智能问答系统包... 查看详情

《百度unit对话系统核心技术解析》2018-09

...文链接:https://mp.weixin.qq.com/s/n1ASECUOWH7UY73yDiVaUg口语理解基于语义解析的口语理解模式,是将用户请求解析为所包含语义信息的结构化表达。其中,最典型的结构化表达是意图(描述用户的核心诉求)+词槽(描述意图的关键信息... 查看详情

ai语音对话技术

...别为:自动语音识别(AutomaticSpeechRecognition,ASR)自然语言理解(NaturalLang 查看详情

自然语言处理(nlp)基于squad的机器阅读理解(代码片段)

【自然语言处理(NLP)】基于SQuAD的机器阅读理解(文章目录)前言(一)、任务描述机器阅读理解(MachingReadingComprehension,MRC)是一项基于文本的问答任务(Text-QA),也是非常重要和经典的自然语言处理任务之一。机器阅读理解旨... 查看详情