iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0

昨天介紹了能簡單架設TOD Chatbot的工具包ConvLab,那今天我們就來說明如何使用

MultiWOZ-英文的TOD語料

前面幾天我們都使用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

以MultiWOZ實作TOD模組

DAY9DAY11DAY14實作相同,因為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-將四個模型串在一起

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 clonepip 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


上一篇
Day16: 對話系統界的超級英雄家族!
下一篇
Day18: MINDACT-可以幫你上網訂票和發廢文的終極Chatbot
系列文
軟體工程師的脫魯日誌-持續介紹hardcore AI研究直到脫魯🥹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言