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”
欢迎大家体验交流~
uUNIT网站平台,创新技术下的结构化知识问答页面有介绍
怎么申请内测
很好的功能
怎么申请内测a
试了一下,效果不错,期待后续可以直接界面化操作
非常详细了!