簡體   English   中英

在dialogFlow控制台中創建的調用意圖

[英]calling intents created in dialogFlow console

由於我不熟悉dialogFlow編碼,因此我對在控制台DialogFlow中創建的意圖有一些疑問。

1)如果我在dialogFlow控制台中創建一個意圖“ intent1”,是否可以在firebase函數中調用該意圖?如果是,該怎么做?

2)如何使用戶選擇選項而不是鍵入? 我必須為此使用什么?

3)如何配置用戶類型編號時要調用的意圖?

4)實體,事件,動作和參數的目的是什么?

我仍然對Google編程上的Actions還是陌生的,但這是我的理解。

Dialogflow允許您定義意圖。 然后,您可以定義代碼以實現這些意圖。 該控制台為Google Cloud Functions提供了內聯JavaScript編輯器。 您可以轉到Google雲功能控制台並在其中查看代碼。 或者,如果您想部署更復雜的代碼(例如,將JavaScript拆分為多個文件-內置編輯器僅適用於單個index.js文件),則可以將其翻轉為“網絡實現”。

因此,dialogflow會接受人工輸入(他們說的一個短語),並針對不同的意圖查看訓練過的短語集,然后選擇認為正確的短語。 然后,它調用該意圖的實現代碼(該代碼存儲在firebase中)。 因此,當您詢問“是否有可能在firebase函數中調用此意圖”時,這有點倒退。 意圖是用戶說點什么和調用firebase函數(通過HTTP)之間的粘合劑。 意圖本身並不是可以調用的代碼。

如果希望用戶選擇選項,則可以使用選項名稱(例如“一個”,“兩個”,“三個”等)創建實體,或為每個選項名稱創建意圖。 當用戶說“一個”時,將觸發一個“一個”意圖。 由您的應用程序代碼決定用戶在菜單瀏覽結構中的位置,以了解“一個”的含義。 (您也可以在帶有屏幕的設備上使用“建議”來向他們顯示必須點擊的選項。)理想情況下,您將允許用戶說出短語或數字,以提供更大的靈活性。

因此,您的第三個問題(如何配置在用戶鍵入數字時將被調用的意圖),您的應用程序可能會執行類似從默認“歡迎”意圖(起點)開始的操作。 您會口頭上說菜單選項“例如,一個用於家庭用品,兩個用於服裝,三個用於鞋子……”。 然后,您會記住用戶在菜單中的位置。 然后,您將“一個”連接為一個意圖,然后在Cloud Function中將檢查用戶使用的菜單,因此您將知道“剛好在歡迎意圖之后,“一個”就意味着家居用品”。 然后,應用程序可能會問第二個問題,例如“說一個家具,兩個花瓶,三個迪斯科球……”。 如果他們再次說“一個”,這將具有相同的意圖,但是您的應用程序將保存一個變量,以跟蹤用戶在菜單樹中的位置。

實體允許您定義術語詞匯表。 例如:“我想購買$ {color} $ {thing}”。 您可以使用值“ red”,“ green”,“ blue”等定義顏色實體。可以定義“ dress”,“ hat”,“ shoes”等其他事物。目的訓練短語可以是“ I”。想買一件紅色連衣裙”。 對話流可以說是“紅色”,因為訓練句子是“顏色”實體,“衣服”是“事物”實體。 然后將這些值作為參數傳遞給支持實現的Web服務-也就是說,您的“購買”意圖將獲得“顏色”和“事物”參數。

事件是系統生成的觸發器,而不是用戶輸入觸發器。 例如,啟動您的應用程序的“歡迎”意圖是系統生成事件。 當應用程序從一個設備移動到另一個設備時,會使用另一個事件。 如果您請求開始使用推送通知的權限,則還有其他系統事件。 這是一種使代碼在發生某些事情時運行的方式(不僅是在用戶說出某些內容時)。

希望對您有所幫助!

您可以通過“事件”直接調用一個意圖,也可以通過API發送請求,並允許引擎自動匹配該意圖。 請按照SDK文檔中的說明進行操作。 但實際上您要做的是:

const dialogflow = require('dialogflow');
const sessionClient = new dialogflow.SessionsClient();
// Define session path
const sessionPath = sessionClient.sessionPath(projectId, sessionId);

const r_text = "What's the weather like in Rio de Janeiro?"

// The text query request.
const request = {
  "session": sessionPath,
  "queryParams": {
    "payload": payload
  },
  "queryInput": {
    "text": {
      "text": r_text,
      "languageCode": languageCode,
    },
  },
};

return sessionClient
.detectIntent(request)
.then(responses => {
  console.log('Detected intent');
  const result = responses[0].queryResult;
  ...do stuff with responses...
  return Promise.resolve('Resolved intent');
})
if (result.intent) {
  console.log(`  Intent: ${result.intent.displayName}`);
  return Promise.resolve('Resolved intent');
} else {
  console.log(`  No intent matched.`);
  return Promise.resolve('Not resolved intent');
}

另外,在定義有效負載時,請注意一個煩人的bug(花了我幾天的時間)並將JSON轉換為API希望接收的結構:

const payload = structjson.jsonToStructProto({
  "user": userId,
  "location": r_location,
  "timestamp": r_timestamp,
  "sender": r_sender
})

您可以在Google的存儲庫中找到structjson庫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM