昨天介紹了能簡單架設TOD Chatbot的工具包ConvLab,那今天我們就來說明如何使用
前面幾天我們都使用CrossWOZ的簡體中文語料來做NLU、DST、DPL及NLG的舉例,
而在英文TOD系統中則是使用MultiWOZ語料進行實作,以下為CrossWOZ與MultiWOZ的比較:
特徵 | MultiWOZ | CrossWOZ |
---|---|---|
對話數量 | 包含10438個對話 | 包含6000個對話 |
涉及對話領域 | 酒店、餐廳、出租車、景點、火車 | 景點、酒店、餐館、地鐵、出租車 |
語言 | 英語 | 中文 |
平均對話輪次 | 6.8 | 21.6 |
平均每輪詞數 | 13.2 | 17.0 |
標註方式 | 主要集中在系統行為和置信狀態 | 提供用戶狀態和系統狀態的全面記錄 |
用戶行為標註 | 使用啟發式方法自動標註 | 涉及大量工人模擬用戶互動 |
應用場景 | 英語環境中的多領域對話系統研究 | 中文環境中的跨領域任務導向對話 |
MultiWOZ除廣泛使用在TOD模組外,CrossWOZ也是基於MultiWOZ來進行中文TOD語料建立,由於在ConvLab上提供的MultiWOZ模組也較完整,那我們以MultiWOZ來示範如何架設TOD System
與DAY9、DAY11及DAY14實作相同,因為NLU、DST及NLG在資料結構上皆可視為Text-to-Text,也不用像DPL任務需使用強化學習來訓練如何做對話決策,故我們使用T5來作為範例
from convlab.base_models.t5.nlu import T5NLU
from convlab.base_models.t5.dst import T5DST
from convlab.base_models.t5.nlg import T5NLG
引用T5模型在NLU、DST及NLG任務後,我們在這三個任務載入
ConvLab以MultiWOZ訓練好的t5-small-multiwoz21
模型,並設定上下文大小或其他參數
sys_nlu = T5NLU(speaker='user', context_window_size=0, model_name_or_path='ConvLab/t5-small-nlu-multiwoz21')
# 初始化用戶自然語言理解模型,指定說話者為用戶,視窗大小為0,使用預訓練模型路徑
sys_dst = T5DST(dataset_name='multiwoz21', speaker='user', context_window_size=100, model_name_or_path='ConvLab/t5-small-dst-multiwoz21')
# 初始化對話狀態追蹤模型,指定資料集名稱、說話者、上下文視窗大小和預訓練模型路徑
sys_nlg = T5NLG(speaker='system', context_window_size=0, model_name_or_path='ConvLab/t5-small-nlg-multiwoz21')
# 初始化系統自然語言產生模型,指定說話者為系統,視窗大小為0,使用預訓練模型路徑
在DPL我們使用VTRACE來作為決策模型:
from convlab.policy.vector.vector_nodes import VectorNodes # 導入向量化節點,用於策略學習
from convlab.policy.vtrace_DPT import VTRACE # 導入VTRACE策略,用於強化學習
VTRACE與Day13提到的DDPT一樣同為 Dialogue Policy Transformer(DPT)的一種,
差別在於VTRACE訓練較簡單,直接使用Policy Gradient做訓練。
而上面的VectorNodes
為我們使用One-hot
編碼將DST、NLU輸出的對話行為
和狀態
做編碼。
PipelineAgent
可以協助將NLU、DST、DPL及NLG四個模組組成一Pipeline模型:
sys_agent = PipelineAgent(sys_nlu, sys_dst, sys_policy, sys_nlg, name='sys')
以init_session()
將系統內的DST、DPL模組初始化就可以使用囉response()
則會將你的輸入與系統的回覆加入context上下文中
sys_agent.init_session()
res = sys_agent.response("I want to find a hotel in the expensive pricerange")
print(res)
我們與Day5相同,設計一個小聊天室,完整程式就像這樣:
# common import: convlab.$module.$model.$dataset
from convlab.base_models.t5.nlu import T5NLU # 導入用於自然語言理解的T5模型
from convlab.base_models.t5.dst import T5DST # 導入用於對話狀態追蹤的T5模型
from convlab.base_models.t5.nlg import T5NLG # 導入用於自然語言產生的T5模型
from convlab.policy.vector.vector_nodes import VectorNodes # 導入向量化節點,用於策略學習
from convlab.policy.vtrace_DPT import VTRACE # 導入VTRACE策略,用於強化學習
from convlab.dialog_agent import PipelineAgent # 匯入對話代理,負責管理對話流程
from convlab.util import load_dataset, load_ontology, load_database # 匯入實用工具函數,用於載入資料集、語意本體和資料庫
# 指定要使用的資料集名稱
dataset_name = 'multiwoz21' # 使用我們庫中定義的資料集名稱
dataset = load_dataset(dataset_name) # 載入指定的資料集
ontology = load_ontology(dataset_name) # 載入與資料集相關的語意本體
database = load_database(dataset_name) # 載入與資料集相關的資料庫
# 查看每個模型的README.md以獲取更多信息
sys_nlu = T5NLU(speaker='user', context_window_size=0, model_name_or_path='ConvLab/t5-small-nlu-multiwoz21')
# 初始化用戶自然語言理解模型,指定說話者為用戶,視窗大小為0,使用預訓練模型路徑
sys_dst = T5DST(dataset_name='multiwoz21', speaker='user', context_window_size=100, model_name_or_path='ConvLab/t5-small-dst-multiwoz21')
# 初始化對話狀態追蹤模型,指定資料集名稱、說話者、上下文視窗大小和預訓練模型路徑
# 下載預訓練的DDPT模型(深度對話政策訓練)
vectorizer = VectorNodes(dataset_name='multiwoz21',
use_masking=True, # 使用遮罩處理
manually_add_entity_names=True, # 手動新增實體名稱
seed=0, # 隨機種子設置
filter_state=True) # 啟用狀態過濾
sys_policy = VTRACE(is_train=False,
seed=0, # 隨機種子設置
vectorizer=vectorizer, # 使用上面定義的向量化節點
load_path="convlab/policy/vtrace_DPT/supervised")
# 初始化VTRACE策略,設定為非訓練模式,指定載入路徑
sys_nlg = T5NLG(speaker='system', context_window_size=0, model_name_or_path='ConvLab/t5-small-nlg-multiwoz21')
# 初始化系統自然語言產生模型,指定說話者為系統,視窗大小為0,使用預訓練模型路徑
# 將所有元件組合成一個對話代理系統
sys_agent = PipelineAgent(sys_nlu, sys_dst, sys_policy, sys_nlg, name='sys')
sys_agent.init_session() # 初始化對話會話
# 設立一個無窮迴圈,開始與TOD Chatbot對話
while True:
# 輸入你要跟TOD Chatbot講的話
user_input = input("You: ")
if "bye" in user_input.lower(): # 設立截止條件,如果輸入bye就結束對話。
print("Bot: Goodbye!")
break
# 向系統發送請求並取得回覆
response = sys_agent.response(user_input)
print(f"Bot: {response}") # 列印系統的回應結果
最後就像Day9一樣,使用git clone
和pip install
來安裝ConvLab-3模組包就可以使用啦!
git clone --depth 1 https://github.com/ConvLab/ConvLab-3.git && cd ConvLab-3模組包 && pip install -e .
Reference.
ConvLab-3 Getting Started