UNIT实例演示结构化知识问答技能的使用
孤僻是病666 发布于2019-09 浏览:6696 回复:6
2
收藏
最后编辑于2019-11

UNIT最近出了一个新功能,结构化知识问答技能,是基于语义理解和知识匹配的通用问答技术,只需提供结构化的表格数据,便能快速地搭建支持复杂查询的精准问答服务,学习和使用成本低,同时支持灵活的同义词泛化和答案配置。

用一个实例演示下怎么使用,欢迎大家交流:https://ai.baidu.com/unit/v2#/innovationtec/detail/kbqa

UNIT结构化知识问答技能,提供管理API和对话API供开发者们实现上述功能,构建一个完整技能的流程如下:

1、需求分析
首先需要选择合适的场景,该对话场景需具有结构化或能够梳理出结构化的表格数据,依据该表格数据有智能对话问答诉求,例如有以下汽车数据:

期望能满足关于汽车的相关问答,例如”帕萨特的价格是多少?“、“价格20万以上的车有哪些?”、”奥迪A4L是德系的吗?“

2、构建技能
当需求确认后,可通过 管理API 进行技能构建,生成对应模型,在管理API中构建一个技能需要涉及技能创建、schema定义、结构化知识上传、同义词上传、回复话术配置及模型训练等步骤。

1)技能创建

通过接口API(kbqa/skill/add)创建技能,只需传入botName和 botDesc 参数, 创建成功会返回 botId。

import json
import requests

url_base = "https://aip.baidubce.com/rpc/2.0/unit/"
access_token = "xxxxxx"
skill_id = 0
schema_id = 0

def skill_add():
       action = "kbqa/skill/add"
       url = "%s%s?access_token=%s" % (url_base, action, access_token)
       params = {
        "skillName": "kbqa_demo",
        "skillDesc": "kbqa技能demo",
    }
    response = requests.post(url, data=json.dumps(params))
    return json.loads(response.text)
   

# 技能创建,获取返回的skillId
response = skill_add()
skill_id = response["result"]["skillId"]

2)schema定义

Schema用于描述数据每个属性字段的信息(包括属性的中⽂名、英⽂名、数据类型),例如上面的汽车数据,我们可以整理出schema如下:

让上面的schema保存为schema.txt,以tab分隔,然后通过API接口(kbqa/schema/add)定义schema,需要传入 skillId。

# 加载schema文件,转换成符合规范的dict列表
def load_schema(filename):
    schema = {
        "schemaEnName": "car",     
        "schemaCnName": "汽车|车",
        "schemaAttrs":[]
    }
    attr_names = []
    with open(filename) as fin:
        for line in fin:
            terms = line.strip().split('\t')
            if len(terms) != 3:
                continue
            attr = {
                "attrEnName": terms[0],
                "attrType": terms[1],
                "attrCnName": terms[2],
            }
            schema["schemaAttrs"].append(attr)
            attr_names.append(terms[0])
    return schema, attr_names

def schema_add(schema):
    action = "kbqa/schema/add"
    url = "%s%s?access_token=%s" % (url_base, action, access_token)
    params = {
        "skillId": skill_id,
        "schemaData": schema,
    }
    response = requests.post(url, data=json.dumps(params))
    return json.loads(response.text)

# 定义schema,返回schemaId
schema, attr_names = load_schema('./schema.txt')
response = schema_add(schema)
schema_id = response["result"]["schemaId"]

3)结构化知识上传

将上面的表格数据保存为records.txt,以tab分隔,然后转化成dict数据,再通过API接口(kbqa/record/add)批量上传数据。

# 加载records数据,转换成符合规范的dict列表
def load_records(filename, attr_names):
    records = []
    with open(filename) as fin:
        for line in fin:
            terms = line.strip().split('\t')
            if len(terms) != len(attr_names):
                continue
            record = {}
            for idx, attr in enumerate(attr_names):
                record[attr] = terms[idx]
            records.append(record)
    if len(records) == 0:
        raise RuntimeError("[FATAL] load records error")
    return records

def record_add(records):
    action = "kbqa/record/add"
    url = "%s%s?access_token=%s" % (url_base, action, access_token)
    params = {
        "schemaId": schema_id,
        "recordData": records,
    }
    response = requests.post(url, data=json.dumps(params))
    return json.loads(response.text)

# 上传数据,返回上传成功数据条数
records = load_records('./records.txt', attr_names)
response = record_add(records)
print(response)

4)同义词上传(非必须)

同义词上传为非必须操作,主要是为了提升系统的整体问答效果,例如“帕萨特”又称“桑塔纳”,这个时候需要把“桑塔纳”作为“帕萨特”的同义词进行添加,便于问答系统进行解析;

5)回复话术配置(非必须)

系统有默认的话术答复方式,若不满足用户诉求时,可按照回复话术配置要求进行话术个性化配置;

6)模型训练

完成上述操作后可调用API(kbqa/model/train)发起模型训练,生成结构化知识问答技能

def model_train():
    action = "kbqa/model/train"
    url = "%s%s?access_token=%s" % (url_base, action, access_token)
    params = {
        "modelDesc": "结构化知识问答技能demo模型训练",
        "trainOption": {
            "configure": {
                "kbqa":"true"
            },
            "data":{
                "schemaIds":[schema_id]
            }
        },
    }
    response = requests.post(url, data=json.dumps(params))
    return json.loads(response.text)

# 模型训练,返回modelId
response = model_train()
print(response)

3、对话API调用
上述技能构建完成后,可通过对话API实现对技能进行调用,获取属于您的结构化知识问答技能。例如下面的示例,结构化知识问答技能对话API说明文档链接:https://unitweb.cdn.bcebos.com/kbqa/百度UNIT-结构化知识问答技能对话API说明文档.pdf

#!/bin/bash
curl -i -k 'https://aip.baidubce.com/rpc/2.0/unit/kbqa/bot/chat?access_token={access_token}' --data '{"bot_session":"","log_id":"7758521","request":{"bernard_level":1,"client_session":"{\"client_results\":\"\", \"candidate_options\":[]}","query":"帕萨特的价格和驱动","query_info":{"asr_candidates":[],"source":"KEYBOARD","type":"TEXT"},"updates":"","user_id":"88888"},"skill_id":"300000","version":"2.0"}'

# 返回 “帕萨特驱动是前轮驱动,价格是15.49”

欢迎大家体验交流~

收藏
点赞
2
个赞
共6条回复 最后由半醉半醒半疯Z回复于2019-11
#7半醉半醒半疯Z回复于2019-11
#6 zhang081699回复
怎么申请内测

uUNIT网站平台,创新技术下的结构化知识问答页面有介绍

0
#6zhang081699回复于2019-11

怎么申请内测

0
#5wangwei8638回复于2019-09

很好的功能

0
#4199******94回复于2019-09

怎么申请内测a

0
#3中大bbking回复于2019-09

试了一下,效果不错,期待后续可以直接界面化操作

0
#2伊茨米可回复于2019-09

非常详细了!

0
TOP
切换版块