[⭐趣玩]如何快速搭建一个聊天机器人

3,882 阅读5分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

UNIT简介

百度推出的智能对话定制平台


随着AI技术和理念的兴起,很多产品都希望采用对话式的人机交互方式。然而对话系统的研发对于大多数开发者而言却是一个很困难的工作,对技术和数据的要求都很高。为此,百度将积累多年的自然语言理解与交互技术对外开放,推出了智能对话定制与服务平台UNIT(Understanding and Interaction Technology),将业界领先的技术能力输出给广大的开发者,以便降低对话系统的研发门槛。基于UNIT,开发者可以高效、低成本的搭建对话系统,从而为用户提供智能客服、智能家居等场景下的服务咨询、业务办理等服务。

使用须知


研发环境是UNIT提供给开发者进行对话系统测试的环境(UNIT为开发者默认提供8个免费研发环境,其中5个研发环境可用于对话技能、FAQ问答技能和表格问答技能,3个研发环境用于文档问答技能),可用于自定义技能的定义、训练数据标注、技能训练、对话测试。部署在研发环境的技能模型可通过技能对话API被业务系统集成调用,进行联调测试,并根据效果评估进一步优化模型效果使用研发环境需要注意以下两点:

a. 一个研发环境只能部署一个技能,且只能保留当前技能模型的5个历史版本,如果已存在5个历史版本,需要删掉历史版本后,才能重新在当前研发环境下训练模型。

b. 研发环境仅提供1QPS和500次调用/天,如不能满足需求,建议购买使用生产环境。

准备工作

  • 找到开发平台 - 智能对话系统定制平台Unit - 立即使用【先备好百度账号,完成基本信息填写】

  • 进入UNIT - 点击 创建机器人 
  • 对话流程控制分为TaskFlow和技能分发,随便选一个就行,详细可以看文档

  • 创建完成后点击机器人进入开发页面

  • 选择我的技能 -> 添加预制技能(闲聊)-> 获取技能
  • 这里选择了增强版(普通版就是一轮,增强版是多轮),也可以选择其他技能但可能代码会不一样可以通过查阅文档修改代码参数。

  • 返回我的机器人开发主页 - 选择技能管理 - 添加技能 - 多轮闲聊
  • 给机器人添加闲聊技能

⭐⭐⭐一个具有闲聊功能的机器人就完成了,后续就是申请API接口

申请机器人API

  • 点击创建应用 - 创建完成返回应用列表,可以看到 API Key 和 Secret Key 

部署对话代码

  • 第一步当然是导包和填写 key 
import json
import random
import requests
# 填写自己的API Key 和 Secret Key
clinet_id = 'your API Key'
clinet_secret = 'your Secret Key'
  • 第二步是,获取access_token和ess_token,获取acce_token是写死的

  • 另外需要注意的是post_data,需要传入自己参数,具体看下面

  • 后面获取对话响应的json后可以自己处理,具体在 schema 里的json已经放在后面

def unit_chat(chat_input,user_id='8888'):
    '''
    description:调用百度UNIT接口,回复聊天内容
    '''
    # 设置默认回复内容,一旦出现异常,回复该内容
    chat_reply = '不好意思,俺正在学习中,随后回复你'
    # 根据 clinet_id 与 clinet_secret 获取access_token
    # 获取access_token是写死的,参考https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu
    url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}'.format(clinet_id,clinet_secret)
    res = requests.get(url)
    access_token = eval(res.text)['access_token']
    # ess_token 写死 获取聊天机器人接口数据
    unit_chatbot_url = 'https://aip.baidubce.com/rpc/2.0/unit/service/chat?access_token=' + access_token
    # 定死的 参考https://ai.baidu.com/ai-doc/UNIT/Zk38h1vl4#requestuser_id
    # 对话API调用并实现 文档 https://ai.baidu.com/forum/topic/show/944007
    post_data = {
        "bot_session": "",
        "log_id":str(random.random()),
        "service_id":"your robot id", # 你的机器人的id
        "session_id":"",
        "request":{
            "query":chat_input,
            "query_info": {
                "asr_candidates": [],
                "source": "KEYBOARD",
                "type": "TEXT"
            },
            "updates": "",
            "user_id":user_id,
        },
        "bot_id":"your skill id", # 机器人的技能的id
        "version":"2.0",
        "dialog_state":{
            "contexts":{
                "SYS_REMEMBERED_SKILLS":[
                    ""
                ]
            }
        }
    }
    # 将封装好的数据作为请求内容,发送给Unit料件机器人接口,并得到返回结果
    res = requests.post(url=unit_chatbot_url,json=post_data)
    
    # 获取聊天接口返回数据
    unit_chat_obj = json.loads(res.content)
    # 判断聊天接口返回数据是否出错
    if unit_chat_obj['error_code'] != 0:
        return chat_reply
    # 找到返回文本内容 result -> response_list
    unit_chat_obj_result = unit_chat_obj['result']
    unit_chat_response_list = unit_chat_obj_result['response_list']
    # 定位 schema -> intent_confidence(置信度) 如果大于0.0得到响应结果
    unit_chat_response_obj = random.choice(
        [unit_chat_response for unit_chat_response in unit_chat_response_list if unit_chat_response["schema"]["intent_confidence"]>0.0]
    )
    # 获取回复内容(共有三个,通过random随机输出一个),访问 action_list -> 选择启动一个 -> say -> 得到响应结果
    unit_chat_response_action_list = unit_chat_response_obj["action_list"]
    # 随机选择一个回答进行回复
    # unit_chat_response_action_obj = random.choice(unit_chat_response_action_list)
    # 选择置信度最大值的回答进行回复
    confidence_list = [unit_chat_response_confidence["confidence"] for unit_chat_response_confidence in unit_chat_response_action_list]
    confidence_max_index = confidence_list.index(max(confidence_list ))
    unit_chat_response_action_obj = unit_chat_response_action_list[confidence_max_index]
    unit_chat_response_say = unit_chat_response_action_obj["say"]
    return unit_chat_response_say 

具体代码,请注意 post_data 里有两个参数需要更换为你自己申请的机器人的参数:

  • service_id :你的机器人的id
  • bot_id :你的技能id

那么在哪里可以找到呢?打开UNIT平台 在我的机器人里 可以看到,如下图:

  • 第三步写主函数,run,开始闲聊
if __name__=='__main__':
    while True:
        user_id='Armor'
        chat_input = input("{}输入:".format(user_id))
        res_say = unit_chat(chat_input,user_id=user_id)
        print("AI回复:",res_say)
        print("-.-"*20)
        if chat_input =='Q' or chat_input =='q': # 按q退出
            break

查看效果

前面还可以,后几个牛头不对马嘴

json返回参数一览

返回的 schema 格式如下:

'schema': {
    'intent_confidence': 1.0, 
    'slots': [], 
    'domain_confidence': 0.0, 
    'slu_tags': [], 
    'intent': 'BUILT_CHAT'
}, 
'action_list': [
    {'refine_detail': {'option_list': [], 'interact': '', 'clarify_reason': ''}, 
     'action_id': 'chat_satisfy', 
     'confidence': -1.1745927334, 
     'custom_reply': '', 
     'say': '你好,有什么可以帮到你的吗?', 
     'type': 'chat'
    }, {'refine_detail': {'option_list': [], 'interact': '', 'clarify_reason': ''}, 
        'action_id': 'chat_satisfy', 
        'confidence': -1.6890048981, 
        'custom_reply': '', 
        'say': '嗯,很晚了还不睡么?', 
        'type': 'chat'
       }, {'refine_detail': {'option_list': [], 'interact': '', 'clarify_reason': ''}, 
           'action_id': 'chat_satisfy', 
           'confidence': -1.7524920702, 
           'custom_reply': '', 
           'say': '你好,请问怎么称呼', 
           'type': 'chat'}
],

剩下的可以自己探索,有挺多好玩的东西~