2017-06-06 50 views
0

我正在使用Bot Framework,LUIS和ActionBinding開發一個bot。在子對話框中獲取LUIS實體

在我的意圖處理的一個我稱之爲一個新的對話,其中有StartAsync(IDialogContext context)ReceiveMessageAsync(IDialogContext context, IAwaitable<IMessageActivity> result)

據我瞭解,在等待(與context.Wait(ReceiveMessageAsync))由用戶輸入的信息將不會被髮送到LUIS方法, 對?

所以,如果我需要了解用戶說什麼,而不必解析字符串,這是我的選擇?可以調用ILuisService.QueryAsync與message.Text爲每個消息是一個選項?

我希望能夠檢測用戶鍵入的實體,以便我可以將它們映射到缺失的字段。例如,在這次談話:

User: I want to book a flight.     // LUIS detects intent 
Bot: Ok. Can you tell me more about your flight? // child dialog is called to handle the rest of the conversation 
User: I want to go to Madrid. 
Bot: To fly to Madrid you can choose between company A, B or C. 
User: I want to go with A tomorrow night 
Bot: Ok, searching for available tickets for tomorrow night in A... 

在這種情況下,有檢測意圖時沒有初始實體,但有可能是,在這種情況下,機器人不會索要已經給信息。

對於我的項目,只有一對一問題答案的簡單表單是不夠的。如果用戶想要更改一個或多個參數(即,我需要返回到所有參數並檢查更改的參數是否影響它們),我還需要對之前設置的參數進行更多驗證和確認。例如:

User: Wait, I want to fly to Barcelona instead. 
Bot: Company A does not fly to Barcelona. You can choose between C and D. 
User: Ok I want to fly with C. 
Bot: There are tickets available for tomorrow night in company C. Keep the flight for tomorrow night? 
User: yes. 

有關最佳實踐的任何提示或指導將有所幫助。

在此先感謝。


編輯:

與子行動解決方案,其中將我的驗證操作?在FulfillAsync方法?我需要驗證,然後向用戶發送問題並理解他發送的回覆(解析實體)。 LuisAction內部可能嗎?

我想使用QueryValueFromLuisAsync,但看了它之後,我需要通過paramName,這是一個動作屬性(如果我沒有弄錯),這就是我想要的避免。我不想將一個答案(即message.Text)映射到一個字段,我想將一個答案映射到多個字段。

比方說,我需要填寫一個有6個屬性的模型。如果機器人向用戶提出一個問題,並且在他的回覆中有3個實體,我希望將這些實體映射到3個字段,之後僅對剩餘的非映射字段提出問題。

+0

你在做動作綁定與https://github.com/Microsoft/BotBuilder-Samples/tree/master/CSharp/Blog-LUISActionBinding? –

+1

是的。我在VS解決方案中有該項目,我在克隆BotBuilder-Samples回購後複製了該項目。 –

+0

@EzequielJadib另外,是否有可能在使用ActionBinding意圖處理程序時獲取LuisResult對象? –

回答

1

我對此的第一反應是爲了避免使用自定義子對話框,並使用SubActions並創建自己的驗證器,如果您希望在那裏有複雜的邏輯,或者甚至覆蓋子動作中的IsValid方法。

但是,如果這不可能,那麼我會考慮重新使用QueryValueFromLuisAsync方法,其中的動作應該是您想要與之交互的模型。該功能最終會調用LUIS,並根據場景嘗試分配結果或返回其他意圖/操作。我會試試這個。

+0

通過'Sub Actions'你的意思是可以在沒有上下文的情況下啓動的上下文操作,對吧? 但是第二種選擇似乎更好,因爲我最終需要的是有一個「智能表單」,它可以基於LUIS檢測到的實體填充字段,並且有能力返回並在一個或多個字段獲取時再次提問鏈中另一個字段的值被無效。 所以我需要創建一個實現ILuisAction的模型,而QueryValueFromLuisAsync將爲該類的屬性賦值,對吧? –

+0

如果可能,請參閱我編輯的問題。感謝所有幫助到目前爲止。 –