我們從前面兩天瞭解了Chatbot 以NLU任務解析話語中的含義,
以及將有意義的資訊擷取出來。
但是如果你今天到一間旅館,要求住宿,
總不可能只率性的說一句「今晚我要住下來」吧?
訂房除了需告知意圖外,
還需要提供入住日期、入住天數、入住人數等資訊才能完成訂房。
既然要提供那麼多資訊,就很難在一句話內就講完
那交互對話的結果,就會造成對話落落長,要讓Chatbot一次總結也難
那Chatbot要如何在對話過程中記錄你提到的資訊並總結呢?
這時候,我們就要用到對話狀態追蹤了!!!
對話狀態追蹤(DST,Dialogue State Tracking),就是將對話中有用的資訊視為槽(Slot)及槽值(Value),並將其紀錄為狀態(State),直到對話結束前,都會不斷的將槽及槽值更新至狀態中。
你可以理解成DST目標是把使用者說的話簡化為一個有用的資訊庫,也可以理解為做了對話摘要。
DST的做法為以下:
交互對話的過程中,DST將每輪對話提供的資訊記錄下來,並整理成類似Python字典的資料結構。
若我詢問: 「我想找有健身房,价格为600且评分为4以上的酒店」
DST會將价格及评分視為槽(Slot),並將
那DST就會將對話總結成以下狀態格式:
{
"名称": "",
"酒店类型": "",
"地址": "",
"地铁": "",
"电话": "",
"酒店设施": "健身房",
"价格": "600",
"评分": "4",
"周边景点": "",
"周边餐馆": "",
"周边酒店": ""
}
若Chatbot詢問: 「请问你想要的酒店附近有哪些景点呢?」
你則回: 「法源寺和民族文化宫附近」
對話狀態又會紀錄成以下:
{
"名称": "",
"酒店类型": "",
"地址": "",
"地铁": "",
"电话": "",
"酒店设施": "健身房",
"价格": "600",
"评分": "4",
"周边景点": [
"法源寺", # 對話狀態會隨著對話做累加
"民族文化宫"
],
"周边餐馆": "",
"周边酒店": ""
}
看懂了嗎? 簡單來說只要有資訊被DST認為是要紀錄的,他就會更新狀態。
若是打招呼或其他與話題無關的資訊則會被排除掉。
那其實現在對於TOD(任務導向對話)或DST的研究皆以LLMs為主要模型
解決了BERT及其他語言模型OOV(Out-Of-Vocabulary)的問題。
但BERT-DST的概念較為簡單,我們還是以此為範例來簡介一下~
BERT-DST先辨識目前話語(Utterance)是否包含槽或槽值,如果有就把它們的範圍標記起來
[CLS]標籤位置用來辨識該句子裡有沒有重要資訊,
[CLS]到[SEP]之間為對話歷史,即上下文對話,用來加強DST辨識能力用
[SEP]後的句子為當前話語,對應的位置用來辨識該字詞(token)是否為重要資訊(slot)的範圍
Reference.
INTERSPEECH 2019-BERT-DST: Scalable End-to-End Dialogue State Tracking with Bidirectional Encoder Representations from Transformer
李宏毅-Dialogue State Tracking as Question Answering