聊天机器人虽有问答集可以回覆大部分常见问题,但难免会有疏漏。因此本研究亦设计回馈机制,若使用者发现机器人的回覆内容不符合想预期,可以直接查看与问句第二和第三相似的问答组合,或是点选「以上皆非」选项,两种方式系统都会自动记录相关资讯。後续我们便可整理蒐集到的组合,持续优化聊天机器人与扩增问答集。
「[语料库模型] 07-程序码: 余弦相似性」这篇的程序码会回传相似度最高的 3 个问答组合。
回馈纪录使用与问答集相似的 CSV 格式储存,方便整理後移植到资料集中。
比较不同的是,回馈纪录的 Q 栏位代表的是使用者输入的语句,A 栏位则会根据使用者的选择而有不同,主要分为两种情况。
程序码: https://gitlab.com/graduate_lab415/nlp/-/blob/master/add_adjustment.py
这部分的程序码,是为了让 API 可以将回馈纪录写进档案
param = sys.argv
q = param[1] #使用者输入的问句
qa_id = param[2] #使用者认为较贴切的问句,若都不符合则传送 -1
category_id = param[3] #使用者当下选择的类别编号
可以接收像是这样的参数
python3 add_adjustment.py "申请喘息服务" 359 0
新问题是指使用者选了「以上皆非」,也就是说使用者认为他的问句和我们提供的都不相似,我们把这种状况认为是新问题。
if qa_id == "-1":
result['new_question'] = True
answer = ""
remark = "New Question"
else:
result['new_question'] = False
qa = os.popen(
"/home/yr/PycharmProjects/nlp/venv/bin/python3 /home/yr/PycharmProjects/nlp/get_answer_by_id.py " + qa_id).read()
qa = json.loads(qa)
answer = qa['A']
remark = "Origin Question "+qa['Q']
result
是用来记录状况,印出最後的 JSON 档案的。
remark
就是备注,若是新问题,备注就会记录 "New Question";反之,则纪录使用者认为更贴近问题。
answer
是针对使用者的问句,若是新问题,就留空,待後续维护人员评估;反之,使用编号 359 查出问答组合,并把答案的部分存到 answer
。
file_exist = os.path.isfile("/home/yr/PycharmProjects/nlp/output/adjustments.csv")
csv_file = open("/home/yr/PycharmProjects/nlp/output/adjustments.csv", "a+")
writer = csv.writer(csv_file, delimiter=',')
'''Add CSV Title'''
if not file_exist:
csv_file = open("/home/yr/PycharmProjects/nlp/output/adjustments.csv", "w")
writer = csv.writer(csv_file, delimiter=',')
writer.writerow(['id', 'Intent ID', 'Q', 'A', 'category', 'source', 'time', 'remark'])
'''Add Row'''
csv_file = open("/home/yr/PycharmProjects/nlp/output/adjustments.csv", "a+")
writer = csv.writer(csv_file, delimiter=',')
new_row = ['', '', q, answer, category_id, 'User Input', str(datetime.datetime.now()), remark]
首先检查 adjustments.csv 档案是否存在,若不存在,就开个新档,并把栏位名称写进去。
档案已存在,就把纪录直接写到档案的最後一笔。
w: 开新档 & 写入
a+: 用附加方式打开(资料会加在档案最後,不会把前面的内容洗掉) & 可读写
success = writer.writerow(new_row)
if success > 6:
'''
new_row = ['', '', '', '', '']
because len(new_raw) is 6
'''
result['success'] = 1
else:
result['success'] = -1
这部分可能没写很好,未来可以再修正写法。
主要是想以 new_row 的长度来决定是否有新增成功,判断的时候又遇到一些问题,不太了解为何 len(['', '', '', '', ''])
的结果是 6,就先将错就错,若是长度有大於 5 个空字串的 list,就算他成功吧。
print(json.dumps(result, ensure_ascii=False))
印出刚刚准备的 result
,回馈机制的 API 就完成了!
{
"new_question": true,
"success": 1
}
<<: 【DAY 21】为什麽每天可以有这麽多问题?如果有机器人可以帮帮我就好了!— Microsoft Power Virtual Agents 智慧虚拟助理来罗~
先附上店家的Google Maps,跟消费方式: 双十国庆连假开始... 一个月没发片了,原本的预定...
Youtube 频道:https://www.youtube.com/c/kaochenlong ...
NIST SP 800-88 R1引入了三种消毒方法:清除(clear),清除(Purge)和销毁(...
接着来讲讲try catch 部分.... 一般来说是要避免程序因为出现错误讯息挂掉的处理方式......
LIFF 是一种 Line 提供让 line bot 可以不跳脱 Line 去开启网页的 API。 ...