在過去的幾十年中,智能會話系統(tǒng)已經(jīng)發(fā)生了顯著的變化,從關(guān)鍵字識別交互式語音應(yīng)答(IVR)系統(tǒng)到跨平臺智能個人助理,都在慢慢成為日常生活中不可或缺的一部分。在這樣的背景環(huán)境下,我們需要一個直觀、靈活和全面的研發(fā)平臺,用來幫助我們進行新算法評估、快速原型創(chuàng)建以及可靠地部署會話 AI 智能體。
因此,Uber AI 發(fā)布了名為「柏拉圖研究會話系統(tǒng)」(Plato Research Dialogue System)的開源人工智能平臺,來解決這個問題。雷鋒網(wǎng) AI 科技評論將其文章整理編譯如下。
柏拉圖研究會話系統(tǒng)(Plato)簡介
Plato 是一個用于構(gòu)建、訓(xùn)練和部署會話 AI 智能體的平臺。它能夠使我們在會話 AI 中進行最先進的研究,快速創(chuàng)建原型和演示系統(tǒng),以及更便捷的采集會話數(shù)據(jù)。而且該系統(tǒng)有「簡潔」和「易于理解」的特點,并與現(xiàn)有的深度學(xué)習(xí)和與現(xiàn)有深度學(xué)習(xí)框架和貝葉斯優(yōu)化框架(用于模型調(diào)優(yōu))集成,可減少編寫代碼的需要。因此不論是經(jīng)驗豐富的研究人員還是會話 AI 背景有限的興趣愛好者,都能夠輕松掌握其使用方法。
同時,我們也在平臺拓展性方面做出了許多努力,如一般研究或特定用例所用工具,包括 Olympus,PyDial,ParlAI,Virtual Human Toolkit,Rasa,DeepPavlov,ConvLab 等。在評估是否利用這些工具時,我們發(fā)現(xiàn)許多用戶需要熟悉特定于平臺的源代碼,關(guān)注特定的用例。這既不靈活也無法可靠地支持其他用戶使用,并且有時還需要使用許可證。
Plato 則能夠解決這些問題,并旨在構(gòu)建、訓(xùn)練和部署會話 AI 智能體。它支持通過語音、文本或結(jié)構(gòu)化信息(會話行為)進行交互,并且每個會話智能體可以與人類用戶、其他會話智能體(在多智能體設(shè)置中)或數(shù)據(jù)進行交互。最重要的是,Plato 可以為每個會話智能體組件合并現(xiàn)有的預(yù)訓(xùn)練模型,并且每個組件都可以在線(在交互期間)或離線(從數(shù)據(jù))進行訓(xùn)練。
Plato 如何運作?
從概念上講,會話智能體需要經(jīng)過各種步驟才能處理它接收的輸入信息(例如,「今天天氣如何?」)并產(chǎn)生恰當?shù)妮敵觯ā赣酗L但不太冷」)。主要步驟對應(yīng)于標準體系結(jié)構(gòu)的主要組件(見圖 1):
- 語音識別(將語音轉(zhuǎn)錄為文本)
- 語言理解(從該文本中提取意義)
- 狀態(tài)跟蹤(迄今為止所說和所做工作的匯總信息)
- API 調(diào)用(搜索數(shù)據(jù)庫,查詢 API 等)
- 會話策略(生成智能體響應(yīng)的抽象含義)
- 語言生成(將抽象意義轉(zhuǎn)換為文本)
- 語音合成(將文本轉(zhuǎn)換為語音)
我們使 Plato 的設(shè)計盡可能模塊化且具有靈活性,它支持傳統(tǒng)的和自定義的會話 AI 架構(gòu)。更重要的是,它支持多方交互,其中的多個智能體可能具有不同的角色,可以相互交互,同時進行訓(xùn)練,并解決分布式問題。
下面的圖 1 和圖 2 描繪了與人類用戶和模擬用戶交互時 Plato 會話智能體架構(gòu)的示例。與模擬用戶交互是研究社區(qū)中用于快速開始學(xué)習(xí)的常見做法(即在與人類交互之前學(xué)習(xí)一些基本行為)。每個單獨的組件都可以用任意機器學(xué)習(xí)庫(例如,Ludwig,TensorFlow 或 PyTorch)進行在線或離線的訓(xùn)練。因為 Plato 是一個通用框架,Uber 的開源深度學(xué)習(xí)工具箱 Ludwig 是一個很好的選擇,因為 Ludwig 不需要編寫代碼并且與 Plato 完全兼容。

圖 1:Plato 的模塊化架構(gòu)有助于組件的在線或離線訓(xùn)練,可以通過自定義或預(yù)先訓(xùn)練的模型進行替換。(圖中的灰色組件不是核心柏拉圖組件)

圖 2:使用模擬用戶而不是人類用戶,如圖 1 所示,我們可以預(yù)先訓(xùn)練柏拉圖各組件的統(tǒng)計模型。然后,這些可以用于創(chuàng)建原型會話智能體,該智能體可以與人類用戶交互以收集更多自然數(shù)據(jù),這些數(shù)據(jù)隨后可用于訓(xùn)練更好的統(tǒng)計模型。(圖中的灰色組件不是柏拉圖核心組件)
除了單智能體交互之外,Plato 還支持多智能體會話,其中多個柏拉圖智能體可以相互交互并相互學(xué)習(xí)。具體來說,柏拉圖將產(chǎn)生會話智能體,確保輸入和輸出(每個智能體聽到和說出的內(nèi)容)被恰當?shù)貍鬟f給每個智能體,并跟蹤會話。
這種設(shè)置可以促進多智能體學(xué)習(xí)的研究,其中智能體需要學(xué)習(xí)如何生成語言以執(zhí)行任務(wù),以及在多方交互的子領(lǐng)域中進行研究(會話狀態(tài)跟蹤、會話輪控制等等)。會話原則定義了每個智能體可以理解的內(nèi)容(實體或含義的本體,例如:價格、位置、偏好、烹飪類型等)以及它可以做什么(詢問更多信息、提供一些信息、調(diào)用 API 等)。智能體可以通過語音、文本或結(jié)構(gòu)化信息(會話行為)進行通信,并且每個智能體都有自己的配置。下面的圖 3 描述了這種架構(gòu),概述了兩個智能體和各種組件之間的通信:

圖 3:Plato 的架構(gòu)允許對多個智能體進行并行訓(xùn)練,每個智能體可能具有不同的角色和目標,并且可以促進多方交互和多智能體學(xué)習(xí)等領(lǐng)域的研究。(圖中的灰色組件不是核心柏拉圖組件)
最后,Plato 通過圖中所示的通用智能體體系結(jié)構(gòu)支持自定義體系結(jié)構(gòu)(例如:將 NLU 拆分為多個獨立組件)和聯(lián)合訓(xùn)練的組件(例如:文本到會話狀態(tài)、文本到文本或任何其他組合)。如圖 4 所示:

圖 4:Plato 的通用智能體體系結(jié)構(gòu)支持廣泛的自定義,包括聯(lián)合組件、語音到語音組件和文本到文本組件,所有這些組件都可以串行或并行執(zhí)行。
此模式脫離了標準會話智能體體系結(jié)構(gòu),支持任何類型的體系結(jié)構(gòu)(例如:使用聯(lián)合組件、文本到文本或語音到語音組件或任何其他設(shè)置),并允許將現(xiàn)有或預(yù)先訓(xùn)練有素的模型加載進 Plato 中。
用戶只需為模塊提供 Python 類名和包路徑,以及模型的初始化參數(shù),或?qū)⒆约旱慕M件載入 Plato 中,就可以自行定義這個體系結(jié)構(gòu)。用戶簡單的按照應(yīng)該執(zhí)行的順序?qū)⒛K列出之后,Plato 就可以負責其余部分了,包括:包裝輸入/輸出、鏈接模塊和處理會話。Plato 支持模塊的串行和并行執(zhí)行。
Plato 還通過組合結(jié)構(gòu)的貝葉斯優(yōu)化(BOCS)為會話 AI 架構(gòu)或單個模塊參數(shù)的貝葉斯優(yōu)化提供支持。
Plato 安裝及運行
版本 Plato(v.1.1)不需要實際安裝,因為它允許用戶修改部分代碼或擴展現(xiàn)有用例以獲得更大的靈活性。但是,Plato 確實依賴于某些外部庫,需要安裝這些庫。可以按照以下兩個步驟完成此過程:
注意:Plato 是用 Python 3 開發(fā)的。
1. 克隆存儲庫:
git clone
git@github.com:uber-research/plato-research-dialogue-system.git
2. 安裝要求:
MacOS:
brew install portaudio
pip install -r requirements.txt
Ubuntu / Debian:
sudo apt-get install python3-pyaudio
pip install -r requirements.tx
Windows:
pip install -r requirements.txt
為了支持語音,則必須安裝 PyAudio,它具有開發(fā)人員機器上可能不存在的許多依賴項。如果上述步驟不成功,PyAudio 安裝錯誤這篇文章(https://stackoverflow.com/questions/5921947/pyaudio-installation-error-command-gcc-failed-with-exit-status-1)包含了有關(guān)如何獲取這些依賴項并安裝 PyAudio 的說明。
其他常見安裝問題的解決方案可在 Commonsues.md.
3. 運行:
有關(guān)配置文件以及如何運行 Plato 的快速介紹,請參見下文。
運行 Plato 會話智能體
要運行 Plato 會話智能體,用戶必須使用相應(yīng)的配置文件運行以下命令(請參閱示例/ simulate_agenda.yaml 以獲取示例配置文件,其中包含有關(guān)環(huán)境和要創(chuàng)建的智能體的許多設(shè)置以及他們的組件):
python runPlatoRDS.py -config <PATH TO yaml CONFIG FILE>
下面列出了一些示例模式和配置:
1)運行單個會話智能體
- 使用 Cambridge Restaurants 域中基于議程的用戶模擬器運行模擬:
python runPlatoRDS.py -config examples / config / simulate_agenda.yaml
- 使用 Cambridge Restaurants 域中基于議程的模擬器運行基于文本的交互:
python runPlatoRDS.py -config examples / config / simulate_text.yaml
- 使用 Cambridge Restaurants 域中基于議程的模擬器運行基于語音的交互:
python runPlatoRDS.py -config examples / config / simulate_speech.yaml
2)運行多個會話智能體
柏拉圖的主要功能之一是允許兩個智能體互相交互。每個智能體可以具有不同的角色(例如,系統(tǒng)和用戶)、不同的目標,并接收不同的獎勵信號。例如,要在基準劍橋餐廳域上運行多個 Plato 智能體,我們運行以下命令來訓(xùn)練智能體的會話策略并對其進行測試:
python runPlatoRDS.py -config 示例/ config / CamRest_MA_train.yaml
python runPlatoRDS.py -config 示例/ config / CamRest_MA_test.yaml
3)運行通用 Plato 會話智能體
本文中的大多數(shù)討論和示例都圍繞傳統(tǒng)的會話智能體體系結(jié)構(gòu)展開。然而,Plato 不需要堅守這條規(guī)則,它的通用智能體支持任何范圍的自定義模塊,包括:將自然語言理解分解成許多組件、將多個組件并行運行以及只有一個文本到文本模型等等。
通用智能體允許用戶將其自定義模塊作為 Python 類對象加載。對于配置文件中列出的每個模塊,Plato 將使用給定的路徑和參數(shù)實例化該類模型。然后在每次會話期間,通用智能體將按順序調(diào)用每個模塊(按照其配置文件中提供的順序),并將當前模塊的輸出傳遞給列表中的下一個模塊,最后通用智能體將返回最后一個模塊的輸出。
以下是在通用模塊模式下運行單個 Plato 智能體或多個 Plato 智能體的兩個示例。
- 單一通用智能體,用于實現(xiàn)自定義體系結(jié)構(gòu)或使用現(xiàn)有的預(yù)先訓(xùn)練的統(tǒng)計模型:
python runPlatoRDS.py -config 示例/ config / simulate_agenda_generic.yaml
- 多個通用智能體,與上述相同,但適用于多個智能體(假設(shè)該智能體已使用 Examples / config / CamRest_MA_train.yaml 訓(xùn)練過會話策略):
python runPlatoRDS.py -config examples / config / MultiAgent_test_generic.yaml
數(shù)據(jù)訓(xùn)練
Plato 支持使用任何深度學(xué)習(xí)框架在線(在交互期間)或離線(從數(shù)據(jù))方式訓(xùn)練智能體的內(nèi)部組件。實際上,只要符合 Plato 接口輸入/輸出的類型,任何模型都可以加載到 Plato 中。例如:目標模型是自定義 NLU,它只需要具有 Plato 的 NLU 抽象類,實現(xiàn)必要的功能,并將數(shù)據(jù)打包/解壓到自定義模型中即可。
Plato 內(nèi)部經(jīng)驗數(shù)據(jù)追蹤
為了便于在線學(xué)習(xí)、調(diào)試和評估,Plato 在一個稱為會話情節(jié)記錄器的結(jié)構(gòu)中跟蹤其內(nèi)部經(jīng)驗數(shù)據(jù),包含有關(guān)先前的會話狀態(tài)、采取的行動、當前會話狀態(tài)、收到的話語信息和產(chǎn)生的話語信息、收到的獎勵以及一些其他結(jié)構(gòu),如:一個可用于跟蹤上述類別無法收集的任何其他內(nèi)容的自定義字段。
在會話結(jié)束或按照指定時間間隔結(jié)束時,每個會話智能體將調(diào)用其內(nèi)部組件的 train()函數(shù),將會話經(jīng)驗數(shù)據(jù)作為訓(xùn)練數(shù)據(jù)傳遞;然后每個組件都會選擇訓(xùn)練所需的信息部分。
要使用在 Plato 中實現(xiàn)的學(xué)習(xí)算法,任何外部數(shù)據(jù)(如 DSTC2 數(shù)據(jù))都需要被解析為 Plato 類型的經(jīng)驗數(shù)據(jù),以便這些外部數(shù)據(jù)可以由訓(xùn)練中相應(yīng)的組件進行加載和使用。或者用戶可以解析數(shù)據(jù),并在 Plato 之外訓(xùn)練他們的模型;然后在需要將這些數(shù)據(jù)用于 Plato 智能體時簡單地加載訓(xùn)練模型。
在線/離線訓(xùn)練
在線訓(xùn)練的過程就跟用戶希望將所訓(xùn)練每個組件配置中的「Train」標志轉(zhuǎn)換為「True」一樣簡單。而以數(shù)據(jù)進行訓(xùn)練的離線訓(xùn)練中,用戶只需加載他們從數(shù)據(jù)集中解析的經(jīng)驗數(shù)據(jù)。我們將使用 DSTC2 數(shù)據(jù)集作為 Plato 離線訓(xùn)練的一個例子,該數(shù)據(jù)集可以從「第二會話狀態(tài)跟蹤挑戰(zhàn)網(wǎng)站」
(http://camdial.org/~mh521/dstc/downloads/dstc2_traindev.tar.gz)中獲得。
該 runDSTC2DataParser.py 腳本將解析 DSTC2 數(shù)據(jù),并將其保存為 Plato 的經(jīng)驗數(shù)據(jù)。然后,它將加載該經(jīng)驗數(shù)據(jù)并訓(xùn)練受監(jiān)督的策略:
python runDSTC2DataParser.py -data_path
<PATH_TO_DSTC2_DATA> / dstc2_traindev / data /
可以使用以下配置文件測試經(jīng)過訓(xùn)練的策略:
python runPlatoRDS.py -config
Examples/ config / simulate_agenda_supervised.yaml
注意:用戶可以將經(jīng)驗數(shù)據(jù)從過去的交互或從數(shù)據(jù)加載到 Plato,然后通過強化學(xué)習(xí)或其他學(xué)習(xí)方法繼續(xù)訓(xùn)練他們的模型。
用 Plato 和 Ludwig 進行訓(xùn)練
Ludwig 是一個由 Uber 發(fā)布的開源深度學(xué)習(xí)框架,它允許用戶在不編寫任何代碼的情況下訓(xùn)練模型。用戶只需將其數(shù)據(jù)解析為 CSV 文件,創(chuàng)建 Ludwig 配置文件,然后在終端中簡單執(zhí)行運行命令即可。用 YAML 編寫的 Ludwig 配置文件描述了神經(jīng)網(wǎng)絡(luò)的架構(gòu),其中包含在 CSV 文件中使用到的功能以及其他參數(shù)。
在上一節(jié)中,runDSTC2DataParser.py 腳本實際上生成了一些 CSV 文件,可用于訓(xùn)練自然語言理解和生成,可在以下位置找到:Data/data。作為一個例子,我們將看到如何訓(xùn)練系統(tǒng)端自然語言生成器。為此,用戶需要編寫 yaml 配置文件,類似于下面所示。
Input_features:
name:nlg_input
type:sequence
encoder:rnn
cell_type:lstm
Output_features:
name:nlg_output
type:sequence
decoder:generator
cell_type:lstm
training:
epochs:20
learning_rate:0.001
dropout:0.2
并訓(xùn)練他們的模型:
ludwig experiment –model_definition_file
Examples/config/ludwig_nlg_train.yaml –data_csv
Data/data/DSTC2_NLG_sys.csv –output_directory Models/CamRestNLG/Sys/
接下來是在 Plato 中加載模型。用戶應(yīng)該轉(zhuǎn)到 simulate_agenda_nlg.yaml 配置文件,并在必要時更新 Ludwig 模型的路徑:
...
NLG:
nlg:CamRest
model_path:<PATH_TO_YOUR_LUDWIG_MODEL>/model
...
并測試該模型的工作原理:
python runPlatoRDS.py -config
Examples / config / simulate_agenda_nlg.yaml
請記住,Ludwig 每次調(diào)用時都會創(chuàng)建一個新的 experiment_run_i 目錄,因此用戶需要確保 Plato 配置文件中的模型路徑是最新的。
Ludwig 還提供了一種在線訓(xùn)練模型的方法,因此在實踐中,用戶只需要編寫非常少的代碼來構(gòu)建、訓(xùn)練和評估 Plato 中新的深度學(xué)習(xí)組件。
Plato 智能體新域生成
為了給面向任務(wù)的應(yīng)用程序(如插槽填充)構(gòu)建會話智能體,用戶需要一個項目數(shù)據(jù)庫和一個描述其域的本體。Plato 提供了一個腳本來自動執(zhí)行此過程。
例如,假設(shè)用戶想要為在線花店構(gòu)建會話智能體,在 CSV 文件中包含以下項目:
物品 ID,類型,顏色,價格,場合
1,玫瑰,紅色,1,任何
2,玫瑰,白色,2,周年紀念
3,玫瑰,黃色,2,慶祝
4,莉莉,白色,5,任何
5,蘭花,粉紅色,30,任何
6,大麗花,藍色,15,任何
用戶只需調(diào)用 createSQLiteDB.py 即可自動生成 DB SQL 文件和 JSON 本體文件。用戶可以在配置文件中指定信息、請求和系統(tǒng)可請求的插槽,如下所示:
-
GENERAL:
csv_file_name:Data / data / flowershop.csv
db_table_name:
estore db_file_path:Ontology / Ontologies / flowershop.db
ontology_file_path:Ontology / Ontologies / flowershop.json
ONTOLOGY(本體):
informable_slots:[類型,價格,場合]
requestable_slots:[價格,顏色]
system_requestable_slots:[價格,場合]
注意:ONTOLOGY 部分是可選的。如果 ONTOLOGY 未被提供,腳本將假定所有插槽都是信息性的、可請求的和系統(tǒng)可請求的。
并運行腳本:
python createSQLiteDB.py -config
Examples / config / create_flowershop_DB.yaml
A flowershop-rules.json 和 a flowershop-dbase.db 可以在 Domain/Domains 中找到。我們現(xiàn)在可以簡單地使用虛擬組件運行 Plato 并與簡單智能體進行交互作為完整性檢查:
python runPlatoRDS.py -config
Examples / config / flowershop_text.yaml
Plato 智能體新模塊生成
根據(jù)其功能,我們有兩種方法可以創(chuàng)建新模塊。如果模塊采用了執(zhí)行 NLU 或會話策略的新方法實現(xiàn),那么用戶應(yīng)該編寫一個自相應(yīng)抽象類的類。
但是,如果一個模塊不適合單個智能體基本組件之一,例如:它執(zhí)行命名實體識別或從文本預(yù)測會話行為,那么用戶必須編寫一個直接從 ConversationalModule 得到的類,然后這個類只由通用智能體使用。
自抽象類
用戶需要創(chuàng)建一個自相應(yīng) Plato 抽象類的新類,并實現(xiàn)抽象類定義的接口以及他們希望的任何其他功能。此類應(yīng)具有唯一名稱(例如「myNLG」),用于在解析配置文件時將其與其他選項區(qū)分開來。在此版本中,除非用戶使用通用智能體,否則需要手動添加解析配置文件的一些條件(例如:會話智能體、會話管理器等)。
構(gòu)建新模塊
要構(gòu)造新模塊,用戶必須將其代碼添加到從會話模塊得到的新類中。然后他們可以通過在配置中提供適當?shù)陌窂健㈩惷蛥?shù),用通用智能體來加載模塊。
…
MODULE_i:
package:myPackage.myModule
Class:myModule
arguments:
model_path:Models/myModule/parameters/
…
…
用戶負責確保新模塊能夠適當?shù)靥幚砬懊婺K的輸出,并且新模塊的輸出可以按照其通用配置文件中的規(guī)定,由其他模塊恰當?shù)厥褂谩?br />
未來計劃
由 Uber AI 研發(fā)的項目 Plato 被用于促進 SIGDial 2019 的工作,即同時訓(xùn)練兩個通過自生成語言相互交流的會話智能體。在這項工作中,我們可以利用 Plato 輕松對這兩個會話智能體進行訓(xùn)練,使它們中一個能實現(xiàn)餐館信息詢問,而另一個則可以提供該問題回答的信息。并且隨著時間的推移,他們的談話將變得越來越自然。
我們相信,Plato 能夠在 Ludwig、TensorFlow、PyTorch、Keras 以及其他開源項目的深度學(xué)習(xí)框架中更加無縫地進行會話智能體的訓(xùn)練,從而改進學(xué)術(shù)和行業(yè)應(yīng)用中的會話 AI 技術(shù)。
原文鏈接:
https://eng.uber.com/plato-research-dialogue-system/
GitHub 地址:
https://github.com/uber-research/plato-research-dialogue-system
更詳細的使用方法:
https://uber-research.github.io/plato-research-dialogue-system/
來源 | 雷鋒網(wǎng)
作者 | 楊鯉萍