智慧聊天機器人語料庫的設計編寫(一)——Dialogflow

Wangalan30發表於2018-05-05

工作快一年,平時做的並不是什麼太有技術含量的事情,但突然有一天突發奇想,很想把工作中的一些東西記錄下來,於是打算開始在這裡記錄,當做平時的工作總結吧。

大學畢業一年,目前在一家小型公司進行人工智慧聊天機器人的對話設計工作。平時 主要使用的智慧對話工具主要包括 Google 的 Dialogflow,以及 AIML 檔案編寫兩種方式。

今天首先想寫的是 Dialogflow 這種智慧聊天設計工具。

Dialogflow 的基本用法:一問一答,Training Phrase 和 Response

Dialogflow 是一個設計智慧聊天對話的網站,使用時需要連線外網。且普遍用於英語對話的設計。

Dialogflow 的使用方法十分簡單,主要包括 Agent、Intent、Entity 三部分。Agent 就是存放同一個話題中所有對話的域,可以統一匯出成 Json 包的形式儲存。一個 Agent 中的對話語句以 Intent 的形式訓練出來。每個 Intent 相當於一條語句,對應聊天者的一個意圖,訓練對話語句時,首先需要新建一個 Agent,Agent 的名字之能是英文數字或下劃線,且不能有空格。緊接著我們新建一個 Inent,Intent 名稱設定的要求更寬泛一點,它允許有空格。然後,在 Intent 中的 Training Phrase 中輸入我們預先設定的可能會說的話,並可以在下方的 Response 一欄中寫出對應的回答,如,在 Training Phrase 中輸入‘Hello’,按下回車,就會形成一條預定輸入,然後在 Response 中輸入‘Hi’,這樣,當我們在頁面右邊的 train 皮膚中輸入‘Hello’時,介面就會返回‘Hi’,這就相當於完成了一次簡單的對話。

Response 中,一條語句就是一個回覆,如果在 Response 中設定了多個語句,那麼在輸出時,就可以隨機出現 Response 中的一句作為回覆輸出。

Entity:關鍵詞匹配實現泛化

當然,如果每次對話都需要精確地將每一句可能會說到的話都列舉出來,那麼顯然智慧的含量就會大打折扣,於是,在 Dialogflow 中,就存在一種最重要的訓練方式,使用 Entity 泛化。

我們可以預先在最左側 Entity 一欄中新增我們所需的聊天單詞的分類。如,我們可以新增一類叫做 sports 的 Entity,並在其中加入 basketball、 football、 baseball 等運動單詞。之後就可以去 Intent 中進行訓練。利用 Entity, 我們就可以只需對某一類句式進行訓練,只需一句話,就可以對多句話做出回答。如,‘I like basketball’。按下回車後,系統會自動識別 basketball 這個單詞,並關聯出其所在的 Entity 顯示在下方。這樣,之後如果在 右側 Train 一欄中輸入‘I like football’ 或 ‘I like baseball’ 等,都可以輸出這個 Intent 中的 Response 的內容。當然,在訓練時,有時系統並不會自動顯示出語句中相關單詞帶有的 Entity,這時,我們可以自己設定,只需要在訓練成功的語句上雙擊相應的單詞,介面上就會自動顯示可以新增的 Entity 分類,點選選擇就可以了。

Dialogflow 中為我們預先提供了很多常用的 Entity,如時間,數字,日期等,這些 Entity 在使用時,無需我們手動新增相應的 Entity 內容,系統會在你輸入相關單詞進行訓練時,自動識別併為你新增訓練語句中帶有的預設 Entity。

Entity 在設定時,每一個 Entity 都對應一個 value,這是 Entity 在系統中被識別使用的值,且可以在 Response 中返回和繼承,我們可以在 Response 中使用 $+Entity 的名稱來拿到並輸出 Entity 的值,同時,為了提高 Entity 匹配到的機率,更大程度上解決有歧義的單詞的輸入麻煩,也為了滿足多種情況下相匹配同一個 Entity 的需求,我們在設定 Entity 時,可以在後面設定很多個同義項,這樣,在匹配 sport 這個詞時,我們不僅可以輸入 basketball,同時也可以輸入 sports,以方便我們的使用。

另外,一個 Intent 中包含的 Entity 的數量不可過多,我曾經因為要對相應的單詞數量進行識別以確定語言等級,所以計劃給每句話的主謂賓都加上了 Entity,由此就會導致系統紊亂,出現匹配不到或匹配錯誤等問題。

Follow-up:為相關語句新增上下文

在 Dialogflow 中還有一個上下文的設定,就是 Intent 介面中最上面的 Follow-up。我們可以在主介面點選 Intent 為他新增 Follow-up Intent,也可以在 Intent 語句訓練介面直接在 context 中輸入 相關上下文的 Intent 的名稱。這樣,我們在進行父 Intent 的對話時,匹配到後就可以直接進入 Follow-up 對話中繼續進行下面的對話,且 Follow-up Intent 尤其生效的生存週期,也就是 Context 前面顯示的數字,在這個時間段內,我們的對話將一直保持在當前的對話環境中,不會匹配到別的 Intent 去。

在新增 Follow-up 時,會有許多個選項,我們可以選擇普通 Intent,也可以使用 Yes 或 No 判斷,從而實現語句樹形分支。當對一個問題的回答因 yes or no 不同時,可以走向不同的 Follow-up Intent。

Action:擴充套件用標記文字輸入

在 Intent 中還有一個 Action 的空檔,在我的工作中,Action 主要被我用於填寫一些識別符號以供程式擴充套件,連線實現外部相應的功能,至於其更多的用處,我並沒有使用到。

Dialogflow 中預置的 Agent

Dialogflow 中,系統為我們預先訓練好了許多個實用 Agent,有鬧鐘,Small-talk 等等,有時,我們可以直接使用這些 Agent 用於我們自己的對話,方便快捷。

當然,在訓練 Intent 時我們也會發現,在每個 Intent 中都有內建的 Small-Talk 開關,如果想在這個 Intent 中也可以匹配到 Hi,Hello 等日常打招呼用語時,我們便可以開啟此開關。

Dialogflow Agent 的數量限制

Dialogflow 的使用需要用 Google 賬號登入,且每個賬號最多可設定十個到十二個 Agent,所以,如果你想真對多個不同的話題進行聊天,為了建立多個 Agent,你就需要多個 Google 賬號,或申請 Google Cloud 空間了。

Dialogflow 匹配閥值的設定

在 Dialogflow Agent 的設定介面,我們可以根據需要設定相應的匹配閥值,來調節匹配的概率和精確度。

Dialogflow Agent 的匯出和匯入

Dialogflow 中的 Agent 可以匯出為一個 Json 包,同時也可以將預置的 Json 包匯入到 新的 Agent,同樣在設定欄中可以找到。

更多

在我看來,Dialogflow 更多的是供個體開發者或普通使用者體驗或開發,並不適用於太大規模的軟體開發使用。匹配的精確度根據個人的需求會有很大的不同,且由於匹配和訓練都是在網頁上完成,且需要連線外網,在實際應用中會根據網路狀況存在不同程度的延時,影響開發和使用。

當然,Dialogflow 自己的官網也有相應的解釋說明文件,使用時可以參考檢視。

如有讀者,感謝閱讀。

相關文章