12.24 Rasa 入門教程 Core 系列(四)

Rasa 入門教程 Core 系列(四)

rasa_tutorial_core_background.png

Rasa 入門教程 Core 系列包括十一個部分,前面介紹了 。本文主要介紹 Rasa 框架 Core 系列的第四部分:動作。動作是你的機器人根據用戶輸入做出響應的動作,Rasa 中有四種類型的動作:

  • 話術動作:以 utter_ 開頭,向用戶發送特定消息
  • 檢索動作:以 respond_ 開頭,通過檢索模型向用戶發送消息
  • 自定義動作:運行任意代碼,發送任意數量的消息(或不發送消息)
  • 默認動作:例如:action_listen、action_restart、action_default_fallback。

本文的目錄結構:

  1. 話術動作
  2. 檢索動作
  3. 自定義動作
  4. 使用其他代碼執行動作
  5. 使用動作主動與用戶聯繫
  6. 默認動作

1. 話術動作

定義話術動作 ActionUtterTemplate,以 utter_ 開頭在 domain 文件中添加話術模板:

<code>templates:
utter_my_message:
- "this is what I want my action to say!"/<code>

通常使用 utter_ 開頭的話術動作,如果沒有此前綴,任然可以在自定義動作中使用模板,但是無法將模板直接預測為自己的動作,有關更多信息詳見響應。

如果使用外部 NLG 服務,則無需在 domain 中指定模板,但仍需要將話術名稱添加到 domain 的動作列表中。

2. 檢索動作

檢索動作使的處理大量類似意圖變得更加容易。請參閱檢索動作以瞭解更多信息。

3. 自定義動作

一個動作可以運行您想要的任何代碼。自定義動作可以打開燈,將事件添加到日曆,檢查用戶的銀行餘額,或者您其他任何事情。

當預測到自定義動作時,Rasa 會調用你指定的端點。該端點應該是一個 web 服務器用來響應此調用,運行代碼並有選擇地返回信息以修改對話狀態。

使用 endpoints.yml 指定你的動作服務器:

<code>action_endpoint:
url: "http://localhost:5055/webhook"/<code>

並使用 --endpoints endpoints.yml 將其傳遞給腳本。

您可以使用 node.js、.NET、java 或任何其他語言創建動作服務器,定義你的動作,同時我們也提供了一個小型 python SDK,使用它可以使得開發更加容易。

3.1 使用 Python 自定義動作

對於用 python 編寫的動作,我們有一個方便的 SDK,可以很方便的啟動該動作服務器。

你的動作服務器只需安裝 rasa-sdk:

<code>pip install rasa-sdk/<code>

包含你的自定義動作的文件應稱為 actions.py。或者,你可以使用一個名為的軟件包目錄,actions或者使用 --actions 標誌手動指定一個動作模塊或軟件包。

如果已安裝 rasa,請運行以下命令以啟動動作服務器:

<code>rasa run actions/<code>

否則,如果未安裝 rasa,請運行以下命令:

<code>python -m rasa_sdk --actions actions/<code>

在餐館機器人中,如果用戶說“給我推薦一家墨西哥餐館”,則你的機器人可以執行 ActionCheckRestaurants 動作,如下所示:

<code>from rasa_sdk import Action
from rasa_sdk.events import SlotSet

class ActionCheckRestaurants(Action):
def name(self) -> Text:
return "action_check_restaurants"

def run(self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:

cuisine = tracker.get_slot('cuisine')
q = "select * from restaurants where cuisine='{0}' limit 1".format(cuisine)
result = db.query(q)

return [SlotSet("matches", result if result is not None else [])]/<code>

你應該將動作名稱 action_check_restaurants 添加到 domain 文件的動作中。動作的 run 方法接收三個參數。你可以訪問 slot 值以及用戶使用 tracke 對象發送的最新消息,還可以通過 dispatcher.utter_message() 調用 dispatcher 對象發給用戶。

run() 方法細節:Action.run(dispatcher, tracker, domain)

Rasa 入門教程 Core 系列(四)

rasa_tutorial_core_01.png

上面的 Python 代碼就是一個 SlotSet 事件示例,在這裡包含了所有可能的事件的完整列表。

4. 使用其他代碼執行動作

Rasa 會將 HTTP POST請求發送到服務器,其中包含要運行的動作信息。此外,此請求將包含有關對話的所有信息。Action Server 顯示了詳細的API規範。

作為對來自 Rasa 的動作調用的響應,你可以修改跟蹤器,例如通過設置槽位並將響應發給用戶。所有修改都是使用事件完成的。在 Events 中的列表包含了所有事件類型。

5. 使用動作主動與用戶聯繫

你可能希望主動與用戶聯繫,例如顯示長時間在後臺運行的輸出或將外部事件通知給用戶。

為此,您可以 POST 到此端點,在請求正文中指定特定用戶運行的操作。使用 output_channel 參數可以指定使用哪個輸出通道將助手的響應發送給用戶。如果你的消息是靜態的,則可以使用 utter_ 對應的模板在 domain 文件中定義動作。如果需要更多控制,請在你的 domain 文件中添加自定義動作,然後在動作服務器中實現所需的步驟。在自定義動作中調度的所有消息都將轉發到指定的輸出通道。

主動聯繫用戶取決於通道的能力,因此並非每個通道都支持。如果你的通道不支持它,請考慮使用 CallbackInput 通道將消息發送到 Webhook。

6. 默認動作

有八種默認動作:

Rasa 入門教程 Core 系列(四)

rasa_tutorial_core_02.png

所有默認動作都可以被覆蓋。為此,請將動作名稱添加到你的 domain 文件中的動作列表中:

<code>actions:
- action_default_ask_affirmation/<code>

然後,Rasa 將調用你的動作端點,並將其視為其他所有自定義動作。



分享到:


相關文章: