äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãšãŒãžã§ã³ãã§ã¯ãDialogflow ES ãšãŒãžã§ã³ãããã匷åãªäŒè©±å¶åŸ¡ãšããŒã«ãå©çšã§ããŸããDialogflow ES ãšãŒãžã§ã³ãã§è€éãªäŒè©±ãåŠçããŠããå Žåã¯ãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãžã®ç§»è¡ãæ€èšããå¿ èŠããããŸãã
ãã®ã¬ã€ãã§ã¯ãDialogflow Dialogflow ES ããäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã«ãšãŒãžã§ã³ããç§»è¡ããæ¹æ³ã«ã€ããŠèª¬æããŸãããããã® 2 ã€ã®ãšãŒãžã§ã³ã ã¿ã€ãã«ã¯æ ¹æ¬çãªéãã倿°ããããããã®ç§»è¡ãç°¡åã«è¡ãæ¹æ³ã¯ãããŸããã
ç§»è¡ã«ãã®ã¬ã€ãã䜿çšããå Žåã¯ãäžã® [ãã£ãŒãããã¯ãéä¿¡] ãã¿ã³ãã¯ãªãã¯ããŠè¯å®çãªãã£ãŒãããã¯ãŸãã¯åŠå®çãªãã£ãŒãããã¯ããéããã ããã ããã ãããã£ãŒãããã¯ã¯ãä»åŸãã®ã¬ã€ãã®æ¹åã«åœ¹ç«ãŠãããŠããã ããŸãã
倧ãŸãã«ã¯ãèªå / æåã®ãã€ããªãã ããã»ã¹ãæšå¥šãããŸããDialogflow ES ãšãŒãžã§ã³ã ããŒã¿ãèªã¿åãããã®ããŒã¿ãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãšãŒãžã§ã³ãã«æžã蟌ã¿ãTODO ãªã¹ãããã£ããã£ããããŒã«ã䜿çšããŸããæ¬¡ã«ããã¹ã ãã©ã¯ãã£ã¹ãTODO ãªã¹ããããŒã«ã«ãã£ãŠç§»è¡ãããããŒã¿ã䜿çšããŠãå®å šãªäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãšãŒãžã§ã³ããåäœæããŸãã
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã«ã€ããŠ
ãã®ç§»è¡ã詊ãåã«ãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã®ä»çµã¿ããã£ããçè§£ããŠããå¿ èŠããããŸãããŸãã¯ãã¡ããã©ããã
ãŸããæ°ãããšãŒãžã§ã³ãã§å¿ èŠã«ãªãå¯èœæ§ã®ããæ©èœãæã€è¿œå ã®ã³ã³ã»ãã ããã¥ã¡ã³ããèªãå¿ èŠããããŸãã æ¬¡ã®ç¹ã«æ³šåããŸãããã
- ã³ã³ãœãŒã«ã®æŠèŠ
- ãšãŒãžã§ã³ã
- ãããŒ
- ããŒãž
- ç¶æ ãã³ãã©
- ã€ã³ãã³ã
- ãã©ã¡ãŒã¿
- ãã«ãã£ã«ã¡ã³ã
- Webhook
Dialogflow ES ãšäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã®éãã«ã€ããŠ
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãDialogflow ES ãšäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã®éèŠãªéãã«ã€ããŠèª¬æããŸããåŸã»ã©æåã§ç§»è¡äœæ¥ãè¡ãéã¯ããã®ã»ã¯ã·ã§ã³ãåç §ããŠãã ããã
æ§é ãšäŒè©±ãã¹ã®å¶åŸ¡
Dialogflow ES ã«ã¯ãæ§é ãšäŒè©±ãã¹ã®å¶åŸ¡ã®ããã«æ¬¡ã®ãã®ãçšæããŠããŸãã
- ã€ã³ãã³ãã¯ããšãŒãžã§ã³ãã®æ§æèŠçŽ ãšããŠäœ¿çšãããŸãã äŒè©±ã®ä»»æã®æç¹ã§ã€ã³ãã³ããäžèŽããŸããããæå³ã§ãåã€ã³ãã³ãã¯äŒè©±ã®ããŒãã§ãã
- ã³ã³ããã¹ãã¯äŒè©±ãå¶åŸ¡ããããã«äœ¿çšãããŸãã ã³ã³ããã¹ãã¯ãã©ã®ã€ã³ãã³ãããã€ã§ãäžèŽãããããšãã§ããããå¶åŸ¡ããããã«äœ¿çšãããŸãã ã³ã³ããã¹ãã¯äžå®æ°ã®äŒè©±ã¿ãŒã³åŸã«æéåãã«ãªããããé·ãäŒè©±ã§ã¯ãã®ã¿ã€ãã®å¶åŸ¡ãäžæ£ç¢ºã«ãªãå¯èœæ§ããããŸãã
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã¯ãæ§é ãªãœãŒã¹ã®éå±€ãšãäŒè©±ãã¹ãããæ£ç¢ºã«å¶åŸ¡ããæ©èœãåããŠããŸãã
- ããŒãžã¯äŒè©±ã®ã°ã©ãããŒãã§ãã äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã®äŒè©±ã¯ã¹ããŒããã·ã³ã«äŒŒãŠããŸããäŒè©±ã®ä»»æã®æç¹ã§ã1 ã€ã®ããŒãžãã¢ã¯ãã£ãã«ãªããŸãã ãšã³ããŠãŒã¶ãŒã®å ¥åãŸãã¯ã€ãã³ãã«åºã¥ããŠãäŒè©±ãå¥ã®ããŒãžã«é·ç§»ããããšããããŸãã è€æ°ã®äŒè©±ã¿ãŒã³ã§ããŒãžãã¢ã¯ãã£ããªç¶æ ã®ãŸãŸã«ãªãããšã¯ãããããŸãã
- ãããŒã¯ãé¢é£ããããŒãžã®ã°ã«ãŒãã§ãã åãããŒã¯ã倧ãŸããªäŒè©±ãããã¯ãåŠçããå¿ èŠããããŸãã
- ç¶æ
ãã³ãã©ã¯ãé·ç§»ãšã¬ã¹ãã³ã¹ãå¶åŸ¡ããããã«äœ¿çšãããŸããç¶æ
ãã³ãã©ã«ã¯æ¬¡ã® 3 çš®é¡ããããŸãã
- ã€ã³ãã³ã ã«ãŒã: äžèŽãããå¿ èŠãããã€ã³ãã³ããä»»æã®ã¬ã¹ãã³ã¹ãä»»æã®ããŒãžé·ç§»ãå«ãŸããŸãã
- æ¡ä»¶ã«ãŒã: æºããå¿ èŠãããæ¡ä»¶ãä»»æã®ã¬ã¹ãã³ã¹ãä»»æã®ããŒãžé·ç§»ãå«ãŸããŸãã
- ã€ãã³ã ãã³ãã©: åŒã³åºãå¿ èŠãããã€ãã³ãåãä»»æã®ã¬ã¹ãã³ã¹ãä»»æã®ããŒãžé·ç§»ãå«ãŸããŸãã
- ã¹ã³ãŒã ã¯ãç¶æ ãã³ãã©ãåŒã³åºãããšãã§ãããã©ãããå¶åŸ¡ããããã«äœ¿çšãããŸãã ã»ãšãã©ã®ãã³ãã©ã¯ãããŒãžãŸãã¯ãããŒå šäœã«é¢é£ä»ããããŸãã é¢é£ä»ããããŠããããŒãžãŸãã¯ãããŒãã¢ã¯ãã£ããªå Žåããã³ãã©ã¯ã¹ã³ãŒãå ã«ãããåŒã³åºãããšãã§ããŸãã ã¹ã³ãŒãå ã®äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã€ã³ãã³ã ã«ãŒãã¯ãã¢ã¯ãã£ããªå ¥åã³ã³ããã¹ããæã€ Dialogflow ES ã€ã³ãã³ããšåæ§ã«æ©èœããŸãã
ãšãŒãžã§ã³ãã®ãããŒãããŒãžãèšèšããéã¯ããšãŒãžã§ã³ãèšèšã¬ã€ãã®ãã㌠ã»ã¯ã·ã§ã³ã®ã¢ããã€ã¹ãã確èªãã ããã
ãã©ãŒã å ¥å
Dialogflow ES ã¯ãã¹ãããå ¥åã䜿çšããŠããšã³ããŠãŒã¶ãŒããå¿ èŠãªãã©ã¡ãŒã¿ãåéããŸãã
- ãããã®ãã©ã¡ãŒã¿ã¯ãå¿ é ãšããŒã¯ãããã€ã³ãã³ãã®ãã©ã¡ãŒã¿ã§ãã
- å¿ é ãã©ã¡ãŒã¿ããã¹ãŠåéããããŸã§ãã€ã³ãã³ãã®ç §åãç¶ç¶ããŸãã
- ãšã³ããŠãŒã¶ãŒã«å€ã®å ¥åãæ±ããããã³ãããå®çŸ©ã§ããŸãã
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã¯ããã©ãŒã å ¥åã䜿çšããŠããšã³ããŠãŒã¶ãŒããå¿ èŠãªãã©ã¡ãŒã¿ãåéããŸãã
- ãããã®ãã©ã¡ãŒã¿ã¯ããŒãžã«é¢é£ä»ããããŠããããã®ããŒãžãã¢ã¯ãã£ããªãšãã«åéãããŸãã
- ããŒãžçšã®æ¡ä»¶ã«ãŒãã䜿çšããŠããã©ãŒã å ¥åãå®äºããŠããããšã確èªããŸãã éåžžããããã®æ¡ä»¶ã«ãŒãã¯å¥ã®ããŒãžã«é·ç§»ããŸãã
- å€ã®åéã®è©Šè¡ãäœåãè¡ãããã«ãããã³ããã ãã§ãªãããªããã³ãã ãã³ãã©ãå®çŸ©ããããšãã§ããŸãã
é·ç§»
ãšã³ããŠãŒã¶ãŒå ¥åãã€ã³ãã³ããšäžèŽãããšãDialogflow ES ã¯ããã€ã³ãã³ãããæ¬¡ã®ã€ã³ãã³ãã«èªåçã«é·ç§»ããŸãã ãã®äžèŽã¯ãå ¥åã³ã³ããã¹ããæããªãã€ã³ãã³ããŸãã¯ã¢ã¯ãã£ããªå ¥åã³ã³ããã¹ããæã€ã€ã³ãã³ãã§ã®ã¿çºçããŸãã
ã¹ã³ãŒãå ã®ç¶æ ãã³ãã©ãèŠä»¶ãæºãããé·ç§»ã¿ãŒã²ãããæäŸãããšãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã¯ããããŒãžããæ¬¡ã®ããŒãžã«é·ç§»ããŸãããããã®é·ç§»ã䜿çšããããšã§ãäŒè©±ã確å®ã«ãšã³ããŠãŒã¶ãŒã«å°ãããšãã§ããŸãã ãããã®é·ç§»ãå¶åŸ¡ããæ¹æ³ã¯è€æ°ãããŸãã
- ã€ã³ãã³ã ãããã³ã°ã«ãã£ãŠãã€ã³ãã³ã ã«ãŒããããªã¬ãŒããããšãã§ããŸãã
- æ¡ä»¶ãæºããããšã«ãã£ãŠãæ¡ä»¶ã«ãŒããããªã¬ãŒããããšãã§ããŸãã
- ã€ãã³ãã®åŒã³åºãã«ãããã€ãã³ã ãã³ãã©ãããªã¬ãŒã§ããŸãã
- ãªããã³ãã ãã³ãã©ã«ããããšã³ããŠãŒã¶ãŒãè€æ°å詊è¡ããåŸã«å€ãæäŸã§ããªãå Žåã«é·ç§»ãè¡ãããšãã§ããŸãã
- é·ç§»ã¿ãŒã²ããã«ã¯ã·ã³ããªãã¯é·ç§»ã¿ãŒã²ããã䜿çšã§ããŸãã
ãšãŒãžã§ã³ã ã¬ã¹ãã³ã¹
Dialogflow ES ãšãŒãžã§ã³ãã®ã¬ã¹ãã³ã¹ã¯ãã€ã³ãã³ããäžèŽãããšãšã³ããŠãŒã¶ãŒã«éä¿¡ãããŸãã
- ãšãŒãžã§ã³ãã¯ãå¯èœãªã¬ã¹ãã³ã¹ã®ãªã¹ãããã¬ã¹ãã³ã¹ã®ã¡ãã»ãŒãžã 1 ã€éžæã§ããŸãã
- ã¬ã¹ãã³ã¹ã¯ãã©ãããã©ãŒã åºæã«èšå®å¯èœã§ããªãã ã¬ã¹ãã³ã¹åœ¢åŒã䜿çšã§ããŸãã
- ã¬ã¹ãã³ã¹ã¯ Webhook ã«ãã£ãŠé§åãããããšãã§ããŸãã
ãã«ãã£ã«ã¡ã³ããåŒã³åºããããšãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãšãŒãžã§ã³ãã®ã¬ã¹ãã³ã¹ããšã³ããŠãŒã¶ãŒã«éä¿¡ãããŸããåžžã« Webhook ãå«ã Dialogflow ES ãã«ãã£ã«ã¡ã³ããšã¯ç°ãªããäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãã«ãã£ã«ã¡ã³ãã¯ããã«ãã£ã«ã¡ã³ã ãªãœãŒã¹ã« Webhook ãæ§æãããŠãããã©ããã«å¿ããŠãWebhook ãåŒã³åºãå ŽåãšåŒã³åºããªãå ŽåããããŸããWebhook ã¬ã¹ãã³ã¹ã«åºã¥ãéçã¬ã¹ãã³ã¹ãšåçã¬ã¹ãã³ã¹ã¯ãã©ã¡ãããã«ãã£ã«ã¡ã³ãã«ãã£ãŠå¶åŸ¡ãããŸãã ãšãŒãžã§ã³ã ã¬ã¹ãã³ã¹ãäœæããæ¹æ³ã¯è€æ°ãããŸãã
- ãã«ãã£ã«ã¡ã³ãã¯ãä»»æã®ã¿ã€ãã®ç¶æ ãã³ãã©ã«æäŸã§ããŸãã
- è€æ°ã®ã¬ã¹ãã³ã¹ã¯ãã¬ã¹ãã³ã¹ ãã¥ãŒãä»ããŠäŒè©±ã¿ãŒã³äžã«é£çµã§ããŸãã ãã®æ©èœã«ããããšãŒãžã§ã³ãã®èšèšãç°¡çŽ åã§ããå ŽåããããŸãã
- äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã¯ãçµã¿èŸŒã¿ã®ãã©ãããã©ãŒã åºæã®ã¬ã¹ãã³ã¹ããµããŒãããŠããŸããããã ãããã©ãããã©ãŒã åºæã®ã¬ã¹ãã³ã¹ã«äœ¿çšã§ããã«ã¹ã¿ã ãã€ããŒããªã©ãè€æ°ã®ã¬ã¹ãã³ã¹ ã¿ã€ããçšæãããŠããŸãã
ãã©ã¡ãŒã¿
Dialogflow ES ãã©ã¡ãŒã¿ã«ã¯æ¬¡ã®ç¹åŸŽããããŸãã
- ã€ã³ãã³ãã§ã®ã¿å®çŸ©ãããŸãã
- ãšã³ããŠãŒã¶ãŒå ¥åãã€ãã³ããWebhookãAPI åŒã³åºãã«ãã£ãŠèšå®ãããŸãã
- ã¬ã¹ãã³ã¹ããã©ã¡ãŒã¿ ããã³ãããWebhook ã³ãŒãããã©ã¡ãŒã¿å€ã§åç
§ãããŸãã
- åºæ¬çãªåç
§åœ¢åŒã¯
$parameter-name
ã§ãã - åç
§ã¯ã
.original
ã.partial
ã.recent
ã®æ¥å°ŸèŸæ§æããµããŒãããŠããŸãã - åç
§ã§ã¯ãã¢ã¯ãã£ããªã³ã³ããã¹ãïŒ
#context-name.parameter-name
ïŒãæå®ã§ããŸãã - åç
§ã§ã¯ãã€ãã³ã ãã©ã¡ãŒã¿ïŒ
#event-name.parameter-name
ïŒãæå®ã§ããŸãã
- åºæ¬çãªåç
§åœ¢åŒã¯
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã®ãã©ã¡ãŒã¿ã«ã¯æ¬¡ã®ç¹åŸŽããããŸãã
- ã€ã³ãã³ããšããŒãžãã©ãŒã ã§å®çŸ©ãããŸãã
- ã€ã³ãã³ã ãã©ã¡ãŒã¿ãšãã©ãŒã ãã©ã¡ãŒã¿ã¯ã»ãã·ã§ã³ ãã©ã¡ãŒã¿ã«äŒæãããã»ãã·ã§ã³ã®æéäžã¯åç §ã§ããŸãã
- ãšã³ããŠãŒã¶ãŒå ¥åãWebhookããã«ãã£ã«ã¡ã³ã ãã©ã¡ãŒã¿ ããªã»ãããAPI åŒã³åºãã«ãã£ãŠèšå®ãããŸãã
- ã¬ã¹ãã³ã¹ããã©ã¡ãŒã¿ ããã³ããããªããã³ãã ãã³ãã©ããã©ã¡ãŒã¿ ããªã»ãããWebhook ã³ãŒãã§åç
§ãããŸãã
- åç
§åœ¢åŒã¯ãã»ãã·ã§ã³ ãã©ã¡ãŒã¿ã®å Žåã¯
$session.params.parameter-id
ãã€ã³ãã³ã ãã©ã¡ãŒã¿ã®å Žåã¯$intent.params.parameter-id
ã§ãã - ã€ã³ãã³ã ãã©ã¡ãŒã¿åç
§ã¯ã
.original
ãš.resolved
ã®æ¥å°ŸèŸæ§æããµããŒãããŠããŸãã ã»ãã·ã§ã³ ãã©ã¡ãŒã¿ã§ã¯ãã®æ§æã¯ãµããŒããããŠããŸããã
- åç
§åœ¢åŒã¯ãã»ãã·ã§ã³ ãã©ã¡ãŒã¿ã®å Žåã¯
ã·ã¹ãã ãšã³ãã£ãã£
Dialogflow ES ã¯å€ãã®ã·ã¹ãã ãšã³ãã£ãã£ããµããŒãããŠããŸãã
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã¯ãåãã·ã¹ãã ãšã³ãã£ãã£ã®å€ãããµããŒãããŠããŸãããããã€ãéãããããŸããç§»è¡ããéã«ã¯ãDialogflow ES ã§äœ¿çšããŠããã·ã¹ãã ãšã³ãã£ãã£ãåãèšèªã®äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã§ããµããŒããããŠããããšã確èªããŸãããµããŒããããŠããªãå Žåã¯ããããã®ã«ã¹ã¿ã ãšã³ãã£ãã£ãäœæããå¿ èŠããããŸãã
ã€ãã³ã
Dialogflow ES ã€ãã³ãã«ã¯æ¬¡ã®ç¹åŸŽããããŸãã
- ã€ã³ãã³ããç §åããããã«ãAPI åŒã³åºããŸã㯠Webhook ããåŒã³åºãããšãã§ããŸãã
- ãã©ã¡ãŒã¿ãèšå®ã§ããŸãã
- çµ±åãã©ãããã©ãŒã ã«ãã£ãŠåŒã³åºãããã€ãã³ãã¯ããå°æ°ã§ãã
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã€ãã³ãã«ã¯æ¬¡ã®ç¹åŸŽããããŸãã
- ã€ãã³ã ãã³ãã©ãåŒã³åºãããã«ãAPI åŒã³åºããŸã㯠Webhook ããåŒã³åºãããšãã§ããŸãã
- ãã©ã¡ãŒã¿ãèšå®ã§ããŸããã
- ãšã³ããŠãŒã¶ãŒå ¥åã®æ¬ åŠãèªèãããªããšã³ããŠãŒã¶ãŒå ¥åãWebhook ã«ãã£ãŠç¡å¹ã«ããããã©ã¡ãŒã¿ãWebhook ãšã©ãŒãªã©ã®åŠçã«äœ¿çšã§ããçµã¿èŸŒã¿ã€ãã³ããæ°å€ããããŸãã
- åŒã³åºãã¯ãä»ã®ç¶æ ãã³ãã©ãšåãã¹ã³ãŒãã«ãŒã«ã§å¶åŸ¡ã§ããŸãã
çµã¿èŸŒã¿ã€ã³ãã³ã
Dialogflow ES ã¯ã次ã®çµã¿èŸŒã¿ã€ã³ãã³ãããµããŒãããŠããŸãã
- ãŠã§ã«ã«ã ã€ã³ãã³ã
- ãã©ãŒã«ãã㯠ã€ã³ãã³ã
- äºåå®çŸ©ããããã©ããŒã¢ãã ã€ã³ãã³ã
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒããµããŒãããçµã¿èŸŒã¿ã€ã³ãã³ãã¯æ¬¡ã®ãšããã§ãã
- ãŠã§ã«ã«ã ã€ã³ãã³ãã¯ãµããŒããããŠããŸãã
- ãã©ãŒã«ãã㯠ã€ã³ãã³ãã¯æäŸãããŸããã 代ããã«ãã€ãã³ã ãã³ãã©ã§ no-match ã€ãã³ãã䜿çšããŸãã
- ãã¬ãã£ã ãµã³ãã«ã®å Žåã¯ãããã©ã«ãã®ãã¬ãã£ã ã€ã³ãã³ãã䜿çšããŸãã
- äºåå®çŸ©ããããã©ããŒã¢ãã ã€ã³ãã³ãã¯æäŸãããŸããã ãããã®ã€ã³ãã³ãã¯ããšãŒãžã§ã³ãã®èŠä»¶ã«åŸã£ãŠäœæããå¿ èŠããããŸãã ããšãã°ããšãŒãžã§ã³ãã®è³ªåã«å¯ŸããåŠå®çãªåçïŒãnoãããno thanksãããno I don'tããªã©ïŒãåŠçããã€ã³ãã³ããäœæããããšãå¿ èŠãªå ŽåããããŸãã äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã®ã€ã³ãã³ãã¯ãšãŒãžã§ã³ãéã§åå©çšå¯èœã§ãããããå®çŸ©ãå¿ èŠãªã®ã¯ 1 åã ãã§ãããããã®äžè¬çãªã€ã³ãã³ãã«å¯ŸããŠãç°ãªãã€ã³ãã³ã ã«ãŒããç°ãªãã¹ã³ãŒãã§äœ¿çšãããšãäŒè©±ããã詳现ã«å¶åŸ¡ã§ããŸãã
Webhook
Dialogflow ES Webhook ã«ã¯æ¬¡ã®ç¹åŸŽããããŸãã
- ãšãŒãžã§ã³ãã«å¯Ÿã㊠1 ã€ã® Webhook ãµãŒãã¹ãæ§æã§ããŸãã
- åã€ã³ãã³ãã«ãWebhook ã䜿çšããŠãããšããããŒã¯ãä»ããããšãã§ããŸãã
- Webhook ãšã©ãŒã®åŠçã¯çµã¿èŸŒã¿ã§ãµããŒããããŠããŸããã
- Webhook ã«ãã£ãŠãšãŒãžã§ã³ãã®ã©ã®éšåããåŒã³åºããããã確èªããããã«ãã€ã³ãã³ã ã¢ã¯ã·ã§ã³åãŸãã¯ã€ã³ãã³ãåã䜿çšãããŸãã
- ã³ã³ãœãŒã«ã«ã¯ã€ã³ã©ã€ã³ ãšãã£ã¿ããããŸãã
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒWebhook ã«ã¯æ¬¡ã®ç¹åŸŽããããŸãã
- ãšãŒãžã§ã³ãã«è€æ°ã® Webhook ãµãŒãã¹ãæ§æã§ããŸãã
- åãã«ãã£ã«ã¡ã³ãã§ãå¿ èŠã«å¿ã㊠Webhook åŒã³åºããæå®ã§ããŸãã
- Webhook ãšã©ãŒåŠçãçµã¿èŸŒã¿ã§ãµããŒããããŠããŸãã
- äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã®ãã«ãã£ã«ã¡ã³ã Webhook ã«ã¯ã¿ã°ãå«ãŸããŠããŸãããã®ã¿ã°ã¯ Dialogflow ES ã¢ã¯ã·ã§ã³ã«äŒŒãŠããŸãããWebhook ãåŒã³åºãå Žåã«ã®ã¿äœ¿çšãããŸããWebhook ãµãŒãã¹ã¯ããããã®ã¿ã°ã䜿çšããŠããšãŒãžã§ã³ãã®ã©ã®éšåããåŒã³åºããããã確èªã§ããŸãã
- ã³ã³ãœãŒã«ã«ã¯ãçµã¿èŸŒã¿ã® Webhook ã³ãŒããšãã£ã¿ã¯ãããŸããã Cloud Functions ã䜿çšããã®ãäžè¬çã§ãããå€ãã®ãªãã·ã§ã³ããããŸãã
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã«ç§»è¡ããå Žåã¯ããªã¯ãšã¹ã ããããã£ãšã¬ã¹ãã³ã¹ ããããã£ãç°ãªããããWebhook ã³ãŒãã倿Žããå¿ èŠããããŸãã
çµ±å
Dialogflow ES çµ±åãš äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒçµ±åã¯ãç°ãªããã©ãããã©ãŒã ããµããŒãããŠããŸããäž¡æ¹ã®ãšãŒãžã§ã³ã ã¿ã€ãã§ãµããŒããããŠãããã©ãããã©ãŒã ã§ãæ§æãç°ãªãå ŽåããããŸãã
䜿çšããŠãã Dialogflow ES çµ±åãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã§ãµããŒããããŠããªãå Žåã¯ããã©ãããã©ãŒã ãåãæ¿ããããçµ±åãèªåã§å®è£ ããå¿ èŠããããŸãã
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã®ã¿ã®ãã®ä»ã®æ©èœ
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã§ã®ã¿æäŸãããæ©èœã¯ä»ã«ã倿°ãããŸããç§»è¡äžã«ãããã®æ©èœã®äœ¿çšãæ€èšããŠãã ããã æ¬¡ã«äŸã瀺ããŸãã
- é«åºŠãª NLU
- é³å£°ã®è©³çްèšå®ïŒé³å£°çµäºã®æåºŠãé³å£°ã®ã¿ã€ã ã¢ãŠããªããªã©ïŒ
- 倿Žå±¥æŽ
- æ¡ä»¶ä»ãããžãã¯
- ãã¬ãã©ããŒçµ±åçšã® DTMF å ¥å
- ç°å¢ç¹æã® Webhook
- ãã¹ã
- ã«ãŒãã°ã«ãŒã
- æ€çŽ¢ãšãŒãžã§ã³ãã®ããŒã¿
- ã»ãã¥ãªãã£èšå®ïŒç§å¿åãšããŒã¿ä¿æïŒ
- é«åºŠãªã¬ã¹ãã³ã¹ãšæ¡ä»¶ã®ã·ã¹ãã 颿°
- ãã¹ãã±ãŒã¹
- ãšãŒãžã§ã³ã ããŒã¿ã®æ€èšŒ
ãã¹ã ãã©ã¯ãã£ã¹
ç§»è¡ããåã«ãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãšãŒãžã§ã³ãã®èšèšã®ãã¹ã ãã©ã¯ãã£ã¹ãçè§£ããŠãããŠãã ããããããã®äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã®ãã¹ã ãã©ã¯ãã£ã¹ã®å€ã㯠Dialogflow ES ã®ãã¹ã ãã©ã¯ãã£ã¹ãšäŒŒãŠããŸãããäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒåºæã®ãã®ããããŸãã
ç§»è¡ããŒã«ã«ã€ããŠ
ç§»è¡ããŒã«ã¯ãDialogflow ES ããŒã¿ã®å€§éšåãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãšãŒãžã§ã³ãã«ã³ããŒããæåã§ç§»è¡ããå¿ èŠãããé ç®ã®ãªã¹ãã TODO ãã¡ã€ã«ã«æžã蟌ã¿ãŸãããã®ããŒã«ã¯ãã«ã¹ã¿ã ãšã³ãã£ã㣠ã¿ã€ããšã€ã³ãã³ã ãã¬ãŒãã³ã° ãã¬ãŒãºã®ã¿ãã³ããŒããŸãã ç¹å®ã®ããŒãºã«åãããŠãã®ããŒã«ãã«ã¹ã¿ãã€ãºããããšãæ€èšããŠãã ããã
ç§»è¡ããŒã«ã®ã³ãŒã
ãã®ããŒã«ã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãããã®ããŒã«ã®ã³ãŒãã確èªããŠããã®æ©èœãçè§£ããŠãã ããã ãšãŒãžã§ã³ãã®ç¹å®ã®ç¶æ³ã«å¯Ÿå¿ããããã«ããã®ã³ãŒãã倿ŽããããšãããããããŸãã以äžã®æé ã§ããã®ããŒã«ãå®è¡ããŸãã
// Package main implements the ES to CX migration tool. package main import ( "context" "encoding/csv" "flag" "fmt" "os" "strings" "time" v2 "cloud.google.com/go/dialogflow/apiv2" proto2 "cloud.google.com/go/dialogflow/apiv2/dialogflowpb" v3 "cloud.google.com/go/dialogflow/cx/apiv3" proto3 "cloud.google.com/go/dialogflow/cx/apiv3/cxpb" "google.golang.org/api/iterator" "google.golang.org/api/option" ) // Commandline flags var v2Project *string = flag.String("es-project-id", "", "ES project") var v3Project *string = flag.String("cx-project-id", "", "CX project") var v2Region *string = flag.String("es-region-id", "", "ES region") var v3Region *string = flag.String("cx-region-id", "", "CX region") var v3Agent *string = flag.String("cx-agent-id", "", "CX region") var outFile *string = flag.String("out-file", "", "Output file for CSV TODO items") var dryRun *bool = flag.Bool("dry-run", false, "Set true to skip CX agent writes") // Map from entity type display name to fully qualified name. var entityTypeShortToLong = map[string]string{} // Map from ES system entity to CX system entity var convertSystemEntity = map[string]string{ "sys.address": "sys.address", "sys.any": "sys.any", "sys.cardinal": "sys.cardinal", "sys.color": "sys.color", "sys.currency-name": "sys.currency-name", "sys.date": "sys.date", "sys.date-period": "sys.date-period", "sys.date-time": "sys.date-time", "sys.duration": "sys.duration", "sys.email": "sys.email", "sys.flight-number": "sys.flight-number", "sys.geo-city-gb": "sys.geo-city", "sys.geo-city-us": "sys.geo-city", "sys.geo-city": "sys.geo-city", "sys.geo-country": "sys.geo-country", "sys.geo-state": "sys.geo-state", "sys.geo-state-us": "sys.geo-state", "sys.geo-state-gb": "sys.geo-state", "sys.given-name": "sys.given-name", "sys.language": "sys.language", "sys.last-name": "sys.last-name", "sys.street-address": "sys.location", "sys.location": "sys.location", "sys.number": "sys.number", "sys.number-integer": "sys.number-integer", "sys.number-sequence": "sys.number-sequence", "sys.ordinal": "sys.ordinal", "sys.percentage": "sys.percentage", "sys.person": "sys.person", "sys.phone-number": "sys.phone-number", "sys.temperature": "sys.temperature", "sys.time": "sys.time", "sys.time-period": "sys.time-period", "sys.unit-currency": "sys.unit-currency", "sys.url": "sys.url", "sys.zip-code": "sys.zip-code", } // Issues found for the CSV output var issues = [][]string{ {"Field", "Issue"}, } // logIssue logs an issue for the CSV output func logIssue(field string, issue string) { issues = append(issues, []string{field, issue}) } // convertEntityType converts an ES entity type to CX func convertEntityType(et2 *proto2.EntityType) *proto3.EntityType { var kind3 proto3.EntityType_Kind switch kind2 := et2.Kind; kind2 { case proto2.EntityType_KIND_MAP: kind3 = proto3.EntityType_KIND_MAP case proto2.EntityType_KIND_LIST: kind3 = proto3.EntityType_KIND_LIST case proto2.EntityType_KIND_REGEXP: kind3 = proto3.EntityType_KIND_REGEXP default: kind3 = proto3.EntityType_KIND_UNSPECIFIED } var expansion3 proto3.EntityType_AutoExpansionMode switch expansion2 := et2.AutoExpansionMode; expansion2 { case proto2.EntityType_AUTO_EXPANSION_MODE_DEFAULT: expansion3 = proto3.EntityType_AUTO_EXPANSION_MODE_DEFAULT default: expansion3 = proto3.EntityType_AUTO_EXPANSION_MODE_UNSPECIFIED } et3 := &proto3.EntityType{ DisplayName: et2.DisplayName, Kind: kind3, AutoExpansionMode: expansion3, EnableFuzzyExtraction: et2.EnableFuzzyExtraction, } for _, e2 := range et2.Entities { et3.Entities = append(et3.Entities, &proto3.EntityType_Entity{ Value: e2.Value, Synonyms: e2.Synonyms, }) } return et3 } // convertParameterEntityType converts a entity type found in parameters func convertParameterEntityType(intent string, parameter string, t2 string) string { if len(t2) == 0 { return "" } t2 = t2[1:] // remove @ if strings.HasPrefix(t2, "sys.") { if val, ok := convertSystemEntity[t2]; ok { t2 = val } else { t2 = "sys.any" logIssue("Intent<"+intent+">.Parameter<"+parameter+">", "This intent parameter uses a system entity not supported by CX English agents. See the migration guide for advice. System entity: "+t2) } return fmt.Sprintf("projects/-/locations/-/agents/-/entityTypes/%s", t2) } return entityTypeShortToLong[t2] } // convertIntent converts an ES intent to CX func convertIntent(intent2 *proto2.Intent) *proto3.Intent { if intent2.DisplayName == "Default Fallback Intent" || intent2.DisplayName == "Default Welcome Intent" { return nil } intent3 := &proto3.Intent{ DisplayName: intent2.DisplayName, } // WebhookState if intent2.WebhookState != proto2.Intent_WEBHOOK_STATE_UNSPECIFIED { logIssue("Intent<"+intent2.DisplayName+">.WebhookState", "This intent has webhook enabled. You must configure this in your CX agent.") } // IsFallback if intent2.IsFallback { logIssue("Intent<"+intent2.DisplayName+">.IsFallback", "This intent is a fallback intent. CX does not support this. Use no-match events instead.") } // MlDisabled if intent2.MlDisabled { logIssue("Intent<"+intent2.DisplayName+">.MlDisabled", "This intent has ML disabled. CX does not support this.") } // LiveAgentHandoff if intent2.LiveAgentHandoff { logIssue("Intent<"+intent2.DisplayName+">.LiveAgentHandoff", "This intent uses live agent handoff. You must configure this in a fulfillment.") } // EndInteraction if intent2.EndInteraction { logIssue("Intent<"+intent2.DisplayName+">.EndInteraction", "This intent uses end interaction. CX does not support this.") } // InputContextNames if len(intent2.InputContextNames) > 0 { logIssue("Intent<"+intent2.DisplayName+">.InputContextNames", "This intent uses context. See the migration guide for alternatives.") } // Events if len(intent2.Events) > 0 { logIssue("Intent<"+intent2.DisplayName+">.Events", "This intent uses events. Use event handlers instead.") } // TrainingPhrases var trainingPhrases3 []*proto3.Intent_TrainingPhrase for _, tp2 := range intent2.TrainingPhrases { if tp2.Type == proto2.Intent_TrainingPhrase_TEMPLATE { logIssue("Intent<"+intent2.DisplayName+">.TrainingPhrases", "This intent has a training phrase that uses a template (@...) training phrase type. CX does not support this.") } var parts3 []*proto3.Intent_TrainingPhrase_Part for _, part2 := range tp2.Parts { parts3 = append(parts3, &proto3.Intent_TrainingPhrase_Part{ Text: part2.Text, ParameterId: part2.Alias, }) } trainingPhrases3 = append(trainingPhrases3, &proto3.Intent_TrainingPhrase{ Parts: parts3, RepeatCount: 1, }) } intent3.TrainingPhrases = trainingPhrases3 // Action if len(intent2.Action) > 0 { logIssue("Intent<"+intent2.DisplayName+">.Action", "This intent sets the action field. Use a fulfillment webhook tag instead.") } // OutputContexts if len(intent2.OutputContexts) > 0 { logIssue("Intent<"+intent2.DisplayName+">.OutputContexts", "This intent uses context. See the migration guide for alternatives.") } // ResetContexts if intent2.ResetContexts { logIssue("Intent<"+intent2.DisplayName+">.ResetContexts", "This intent uses context. See the migration guide for alternatives.") } // Parameters var parameters3 []*proto3.Intent_Parameter for _, p2 := range intent2.Parameters { if len(p2.Value) > 0 && p2.Value != "$"+p2.DisplayName { logIssue("Intent<"+intent2.DisplayName+">.Parameters<"+p2.DisplayName+">.Value", "This field is not set to $parameter-name. This feature is not supported by CX. See: https://cloud.google.com/dialogflow/es/docs/intents-actions-parameters#valfield.") } if len(p2.DefaultValue) > 0 { logIssue("Intent<"+intent2.DisplayName+">.Parameters<"+p2.DisplayName+">.DefaultValue", "This intent parameter is using a default value. CX intent parameters do not support default values, but CX page form parameters do. This parameter should probably become a form parameter.") } if p2.Mandatory { logIssue("Intent<"+intent2.DisplayName+">.Parameters<"+p2.DisplayName+">.Mandatory", "This intent parameter is marked as mandatory. CX intent parameters do not support mandatory parameters, but CX page form parameters do. This parameter should probably become a form parameter.") } for _, prompt := range p2.Prompts { logIssue("Intent<"+intent2.DisplayName+">.Parameters<"+p2.DisplayName+">.Prompts", "This intent parameter has a prompt. Use page form parameter prompts instead. Prompt: "+prompt) } if len(p2.EntityTypeDisplayName) == 0 { p2.EntityTypeDisplayName = "@sys.any" logIssue("Intent<"+intent2.DisplayName+">.Parameters<"+p2.DisplayName+">.EntityTypeDisplayName", "This intent parameter does not have an entity type. CX requires an entity type for all parameters..") } parameters3 = append(parameters3, &proto3.Intent_Parameter{ Id: p2.DisplayName, EntityType: convertParameterEntityType(intent2.DisplayName, p2.DisplayName, p2.EntityTypeDisplayName), IsList: p2.IsList, }) //fmt.Printf("Converted parameter: %+v\n", parameters3[len(parameters3)-1]) } intent3.Parameters = parameters3 // Messages for _, message := range intent2.Messages { m, ok := message.Message.(*proto2.Intent_Message_Text_) if ok { for _, t := range m.Text.Text { warnings := "" if strings.Contains(t, "#") { warnings += " This message may contain a context parameter reference, but CX does not support this." } if strings.Contains(t, ".original") { warnings += " This message may contain a parameter reference suffix of '.original', But CX only supports this for intent parameters (not session parameters)." } if strings.Contains(t, ".recent") { warnings += " This message may contain a parameter reference suffix of '.recent', but CX does not support this." } if strings.Contains(t, ".partial") { warnings += " This message may contain a parameter reference suffix of '.partial', but CX does not support this." } logIssue("Intent<"+intent2.DisplayName+">.Messages", "This intent has a response message. Use fulfillment instead."+warnings+" Message: "+t) } } else { logIssue("Intent<"+intent2.DisplayName+">.Messages", "This intent has a non-text response message. See the rich response message information in the migration guide.") } if message.Platform != proto2.Intent_Message_PLATFORM_UNSPECIFIED { logIssue("Intent<"+intent2.DisplayName+">.Platform", "This intent has a message with a non-default platform. See the migration guide for advice.") } } return intent3 } // migrateEntities migrates ES entities to your CX agent func migrateEntities(ctx context.Context) error { var err error // Create ES client var client2 *v2.EntityTypesClient options2 := []option.ClientOption{} if len(*v2Region) > 0 { options2 = append(options2, option.WithEndpoint(*v2Region+"-dialogflow.googleapis.com:443")) } client2, err = v2.NewEntityTypesClient(ctx, options2...) if err != nil { return err } defer client2.Close() var parent2 string if len(*v2Region) == 0 { parent2 = fmt.Sprintf("projects/%s/agent", *v2Project) } else { parent2 = fmt.Sprintf("projects/%s/locations/%s/agent", *v2Project, *v2Region) } // Create CX client var client3 *v3.EntityTypesClient options3 := []option.ClientOption{} if len(*v3Region) > 0 { options3 = append(options3, option.WithEndpoint(*v3Region+"-dialogflow.googleapis.com:443")) } client3, err = v3.NewEntityTypesClient(ctx, options3...) if err != nil { return err } defer client3.Close() parent3 := fmt.Sprintf("projects/%s/locations/%s/agents/%s", *v3Project, *v3Region, *v3Agent) // Read each V2 entity type, convert, and write to V3 request2 := &proto2.ListEntityTypesRequest{ Parent: parent2, } it2 := client2.ListEntityTypes(ctx, request2) for { var et2 *proto2.EntityType et2, err = it2.Next() if err == iterator.Done { break } if err != nil { return err } fmt.Printf("Entity Type: %s\n", et2.DisplayName) if *dryRun { convertEntityType(et2) continue } request3 := &proto3.CreateEntityTypeRequest{ Parent: parent3, EntityType: convertEntityType(et2), } et3, err := client3.CreateEntityType(ctx, request3) entityTypeShortToLong[et3.DisplayName] = et3.Name if err != nil { return err } // ES and CX each have a quota limit of 60 design-time requests per minute time.Sleep(2 * time.Second) } return nil } // migrateIntents migrates intents to your CX agent func migrateIntents(ctx context.Context) error { var err error // Create ES client var client2 *v2.IntentsClient options2 := []option.ClientOption{} if len(*v2Region) > 0 { options2 = append(options2, option.WithEndpoint(*v2Region+"-dialogflow.googleapis.com:443")) } client2, err = v2.NewIntentsClient(ctx, options2...) if err != nil { return err } defer client2.Close() var parent2 string if len(*v2Region) == 0 { parent2 = fmt.Sprintf("projects/%s/agent", *v2Project) } else { parent2 = fmt.Sprintf("projects/%s/locations/%s/agent", *v2Project, *v2Region) } // Create CX client var client3 *v3.IntentsClient options3 := []option.ClientOption{} if len(*v3Region) > 0 { options3 = append(options3, option.WithEndpoint(*v3Region+"-dialogflow.googleapis.com:443")) } client3, err = v3.NewIntentsClient(ctx, options3...) if err != nil { return err } defer client3.Close() parent3 := fmt.Sprintf("projects/%s/locations/%s/agents/%s", *v3Project, *v3Region, *v3Agent) // Read each V2 entity type, convert, and write to V3 request2 := &proto2.ListIntentsRequest{ Parent: parent2, IntentView: proto2.IntentView_INTENT_VIEW_FULL, } it2 := client2.ListIntents(ctx, request2) for { var intent2 *proto2.Intent intent2, err = it2.Next() if err == iterator.Done { break } if err != nil { return err } fmt.Printf("Intent: %s\n", intent2.DisplayName) intent3 := convertIntent(intent2) if intent3 == nil { continue } if *dryRun { continue } request3 := &proto3.CreateIntentRequest{ Parent: parent3, Intent: intent3, } _, err := client3.CreateIntent(ctx, request3) if err != nil { return err } // ES and CX each have a quota limit of 60 design-time requests per minute time.Sleep(2 * time.Second) } return nil } // checkFlags checks commandline flags func checkFlags() error { flag.Parse() if len(*v2Project) == 0 { return fmt.Errorf("Need to supply es-project-id flag") } if len(*v3Project) == 0 { return fmt.Errorf("Need to supply cx-project-id flag") } if len(*v2Region) == 0 { fmt.Printf("No region supplied for ES, using default\n") } if len(*v3Region) == 0 { return fmt.Errorf("Need to supply cx-region-id flag") } if len(*v3Agent) == 0 { return fmt.Errorf("Need to supply cx-agent-id flag") } if len(*outFile) == 0 { return fmt.Errorf("Need to supply out-file flag") } return nil } // closeFile is used as a convenience for defer func closeFile(f *os.File) { err := f.Close() if err != nil { fmt.Fprintf(os.Stderr, "ERROR closing CSV file: %v\n", err) os.Exit(1) } } func main() { if err := checkFlags(); err != nil { fmt.Fprintf(os.Stderr, "ERROR checking flags: %v\n", err) os.Exit(1) } ctx := context.Background() if err := migrateEntities(ctx); err != nil { fmt.Fprintf(os.Stderr, "ERROR migrating entities: %v\n", err) os.Exit(1) } if err := migrateIntents(ctx); err != nil { fmt.Fprintf(os.Stderr, "ERROR migrating intents: %v\n", err) os.Exit(1) } csvFile, err := os.Create(*outFile) if err != nil { fmt.Fprintf(os.Stderr, "ERROR opening output file: %v", err) os.Exit(1) } defer closeFile(csvFile) csvWriter := csv.NewWriter(csvFile) if err := csvWriter.WriteAll(issues); err != nil { fmt.Fprintf(os.Stderr, "ERROR writing CSV output file: %v", err) os.Exit(1) } csvWriter.Flush() }
ãšã³ãã£ã㣠ã¿ã€ãã®ããŒã«ç§»è¡
Dialogflow ES ãšã³ãã£ã㣠ã¿ã€ããš äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãšã³ãã£ã㣠ã¿ã€ãã¯ãã䌌ãŠãããç§»è¡ãæãç°¡åãªããŒã¿åã§ããããŒã«ã«ãã£ãŠããšã³ãã£ã㣠ã¿ã€ããåã«ãã®ãŸãŸã³ããŒãããŸãã
ã€ã³ãã³ãã®ããŒã«ç§»è¡
Dialogflow ES ã®ã€ã³ãã³ããš äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã®ã€ã³ãã³ãã¯å€§ããç°ãªããŸãã
Dialogflow ES ã®ã€ã³ãã³ãã¯ãšãŒãžã§ã³ãã®æ§æèŠçŽ ãšããŠäœ¿çšããããã¬ãŒãã³ã° ãã¬ãŒãºãã¬ã¹ãã³ã¹ãäŒè©±å¶åŸ¡ã®ã³ã³ããã¹ããWebhook æ§æãã€ãã³ããã¢ã¯ã·ã§ã³ãã¹ãããå ¥åãã©ã¡ãŒã¿ãå«ãŸããŠããŸãã
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã§ã¯ããã®ããŒã¿ã®å€§éšåãä»ã®ãªãœãŒã¹ã«ç§»åãããŠããŸããäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã®ã€ã³ãã³ãã«ã¯ãã¬ãŒãã³ã° ãã¬ãŒãºãšãã©ã¡ãŒã¿ã®ã¿ãå«ãŸããããããšãŒãžã§ã³ãéã§ã€ã³ãã³ããåå©çšã§ããŸããããŒã«ã¯ããããã® 2 çš®é¡ã®ã€ã³ãã³ã ããŒã¿ã®ã¿ãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã®ã€ã³ãã³ãã«ã³ããŒããŸãã
ç§»è¡ããŒã«ã®å¶éäºé
ç§»è¡ããŒã«ã¯ã次ã®é ç®ããµããŒãããŠããŸããã
- ã¡ã¬ ãšãŒãžã§ã³ã: ããŒã«ã¯è€æ°ã®ãµããšãŒãžã§ã³ãããèªã¿åãããšã¯ã§ããŸããããåãµããšãŒãžã§ã³ãã«å¯ŸããŠããŒã«ãè€æ°ååŒã³åºãããšãã§ããŸãã
- å€èšèªãšãŒãžã§ã³ã: ããŒã«ã倿ŽããŠãå€èšèªã®ãã¬ãŒãã³ã° ãã¬ãŒãºãšãšã³ãã£ã㣠ãšã³ããªãäœæããå¿ èŠããããŸãã
- è±èªä»¥å€ã®èšèªã«é¢ããã·ã¹ãã ãšã³ãã£ãã£ã®ç¢ºèª: ããŒã«ã¯ãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã§ãµããŒããããŠããªãã·ã¹ãã ãšã³ãã£ãã£ãæ€åºãããšãTODO é ç®ãäœæããŸããè±èªãããã©ã«ãã®èšèªã§ãããç±³åœã®ãªãŒãžã§ã³ã䜿çšããŠããããšãåæãšããŠããŸããã·ã¹ãã ãšã³ãã£ãã£ã®ãµããŒãã¯ãèšèªãå°åã«ãã£ãŠç°ãªããŸãã ä»ã®èšèªãšå°åã®å Žåã¯ããã®ãã§ãã¯ãå®è¡ããããã«ããŒã«ã倿Žããå¿ èŠããããŸãã
å¿ é ã®ç§»è¡æé
以éã®ãµãã»ã¯ã·ã§ã³ã§ã¯ãç§»è¡æé ã®æŠèŠã説æããŸãããããã®æåã®æé ã¯ãé çªã«è¡ãå¿ èŠã¯ãããŸããããŸãããããã®ã¹ããããåæã«ããŸãã¯ç°ãªãé åºã§å®è¡ããããšãã§ããŸãã å®éã«å€æŽãå ããåã«ãæé å šäœãèªãã§å€æŽã®èšç»ãéå§ããŸãã
ç§»è¡ããŒã«ãå®è¡ããåŸãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãšãŒãžã§ã³ããåæ§ç¯ããŸãããã®æ®µéã§ãããªãã®éã®ç§»è¡äœæ¥ãæ®ã£ãŠããŸãããæåã§å ¥åããããŒã¿ã®å€§éšåã¯äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãšãŒãžã§ã³ããš TODO ãã¡ã€ã«å ã«ååšããŠããŸãã
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãšãŒãžã§ã³ããäœæãã
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãšãŒãžã§ã³ããäœæããŸãïŒãŸã äœæããŠããªãå ŽåïŒãDialogflow ES ãšãŒãžã§ã³ããšåãããã©ã«ãèšèªã䜿çšããŠãã ããã
ç§»è¡ããŒã«ãå®è¡ãã
ããŒã«ãå®è¡ããã«ã¯ãæ¬¡ã®æé ã«åŸããŸãã
- Go ããã·ã³ã«ã€ã³ã¹ããŒã«ããŸãïŒãŸã ã€ã³ã¹ããŒã«ããŠããªãå ŽåïŒã
- ããŒã«ã³ãŒãçšã®ãã£ã¬ã¯ããª
migrate
ãäœæããŸãã - äžèšã®ããŒã«ã³ãŒããããã®ãã£ã¬ã¯ããªã®
main.go
ãšãããã¡ã€ã«ã«ã³ããŒããŸãã - å¿ èŠã«å¿ããŠã³ãŒãã倿ŽããŸãã
ãã®ãã£ã¬ã¯ããªã« Go ã¢ãžã¥ãŒã«ãäœæããŸããæ¬¡ã«äŸã瀺ããŸãã
go mod init migrate
Dialogflow ES V2 ãšäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒV3 ã® Go ã¯ã©ã€ã¢ã³ã ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŸãã
go get cloud.google.com/go/dialogflow/apiv2 go get cloud.google.com/go/dialogflow/cx/apiv3
ã¯ã©ã€ã¢ã³ã ã©ã€ãã©ãªã®èªèšŒãèšå®ãããŠããããšã確èªããŸãã
ããŒã«ãå®è¡ããåºåããã¡ã€ã«ã«ä¿åããŸãã
go run main.go -es-project-id=<ES_PROJECT_ID> -cx-project-id=<CX_PROJECT_ID> \ -cx-region-id=<CX_REGION_ID> -cx-agent-id=<CX_AGENT_ID> -out-file=out.csv
ç§»è¡ããŒã«ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°
ããŒã«ã®å®è¡æã«ãšã©ãŒãçºçããå Žåã¯ã次ã®ç¹ã確èªããŠãã ããã
ãšã©ãŒ | 解決ç |
---|---|
ãã¬ãŒãã³ã° ãã¬ãŒãºã®äžéšã§ãã€ã³ãã³ãçšã«å®çŸ©ãããŠããªããã©ã¡ãŒã¿ãèšåãããŠãããšãã RPC ãšã©ãŒã | ããã¯ã以åã« Dialogflow ES API ã䜿çšããŠããã¬ãŒãã³ã° ãã¬ãŒãºãšäžèŽããªãæ¹æ³ã§ã€ã³ãã³ã ãã©ã¡ãŒã¿ãäœæããå Žåã«çºçããããšããããŸãããã®åé¡ã解決ããã«ã¯ãã³ã³ãœãŒã«ãã Dialogflow ES ãã©ã¡ãŒã¿ã®ååã倿Žãããã¬ãŒãã³ã° ãã¬ãŒãºããã©ã¡ãŒã¿ãæ£ãã䜿çšããŠããããšã確èªããŠããã[ä¿å] ãã¯ãªãã¯ããŸãããŸãããã¬ãŒãã³ã° ãã¬ãŒãºã§ååšããªããã©ã¡ãŒã¿ãåç §ããŠããå Žåã«ãçºçããããšããããŸãã |
ãšã©ãŒãä¿®æ£ããããç§»è¡ããŒã«ãå床å®è¡ããåã«ãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãšãŒãžã§ã³ãã®ã€ã³ãã³ããšãšã³ãã£ãã£ãæ¶å»ããå¿ èŠããããŸãã
Dialogflow ES ã®ã€ã³ãã³ã ããŒã¿ãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã«ç§»åãã
ãã®ããŒã«ã¯ãã€ã³ãã³ãã®ãã¬ãŒãã³ã° ãã¬ãŒãºãšãã©ã¡ãŒã¿ãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã®ã€ã³ãã³ãã«ç§»è¡ããŸãããæåã§ç§»è¡ããå¿ èŠããã Dialogflow ES ã€ã³ãã³ã ãã£ãŒã«ããä»ã«ãå€ããããŸãã
Dialogflow ES ã€ã³ãã³ãã«ã¯ã察å¿ããäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒããŒãžã察å¿ããäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã€ã³ãã³ãããŸãã¯ãã®äž¡æ¹ãå¿ èŠã«ãªãå ŽåããããŸãã
Dialogflow ES ã€ã³ãã³ãã®äžèŽã䜿çšããŠäŒè©±ãç¹å®ã®äŒè©±ããŒãããå¥ã®äŒè©±ããŒãã«é·ç§»ãããå Žåããã®ã€ã³ãã³ãã«é¢é£ãã以äžã® 2 ã€ã®ããŒãžããšãŒãžã§ã³ãã«ååšããå¿ èŠããããŸãã
- 次ã®ããŒãžã«é·ç§»ããã€ã³ãã³ã ã«ãŒããå«ãå ã®ããŒãž: å ã®ããŒãžã®ã€ã³ãã³ã ã«ãŒãã«ãDialogflow ES ã€ã³ãã³ãã®ã¬ã¹ãã³ã¹ãšåæ§ã®äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãã«ãã£ã«ã¡ã³ã ã¡ãã»ãŒãžãå«ãŸããŠããå ŽåããããŸãããã®ããŒãžã«ã¯å€ãã®ã€ã³ãã³ã ã«ãŒããååšããå ŽåããããŸãã å ã®ããŒãžãã¢ã¯ãã£ããªéããããã®ã€ã³ãã³ã ã«ãŒãã¯äŒè©±ãå€ãã®å¯èœãªãã¹ã«é·ç§»ã§ããŸãã å€ãã® Dialogflow ES ã€ã³ãã³ãã§ã察å¿ããåãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã®å ã®ããŒãžãå ±æããŠããŸãã
- å ã®ããŒãžã®ã€ã³ãã³ã ã«ãŒãã®é·ç§»ã¿ãŒã²ããã§ããæ¬¡ã®ããŒãž: 次ã®ããŒãžã®äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãšã³ã㪠ãã«ãã£ã«ã¡ã³ãã«ãDialogflow ES ã€ã³ãã³ãã®ã¬ã¹ãã³ã¹ãšåæ§ã®äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãã«ãã£ã«ã¡ã³ã ã¡ãã»ãŒãžãå«ãŸããŠããå ŽåããããŸãã
Dialogflow ES ã€ã³ãã³ãã«å¿ é ãã©ã¡ãŒã¿ãå«ãŸããŠããå Žåã¯ããã©ãŒã ã«åããã©ã¡ãŒã¿ãæã€å¯Ÿå¿ããäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒããŒãžãäœæããå¿ èŠããããŸãã
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã®ã€ã³ãã³ããšäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒããŒãžã§ã¯åããã©ã¡ãŒã¿ ãªã¹ããæã€ããã«ããã®ãäžè¬çã§ããã€ãŸãããã 1 ã€ã® Dialogflow ES ã€ã³ãã³ãã«ã¯ãããã«å¯Ÿå¿ããäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒããŒãžãšäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã€ã³ãã³ãã 1 ã€ãã€ããããšãæå³ããŸããã€ã³ãã³ã ã«ãŒãã®ãã©ã¡ãŒã¿ãæã€äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã€ã³ãã³ããäžèŽãããšãäŒè©±ã¯å€ãã®å Žååããã©ã¡ãŒã¿ãæã€ããŒãžã«é·ç§»ããŸããã€ã³ãã³ã ãããããæœåºããããã©ã¡ãŒã¿ã¯ãã»ãã·ã§ã³ ãã©ã¡ãŒã¿ã«äŒæãããŸãããã®ãã©ã¡ãŒã¿ã¯ãããŒãž ãã©ãŒã ãã©ã¡ãŒã¿ã®äžéšãŸãã¯å šäœã§äœ¿çšã§ããŸãã
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã«ã¯ããã©ãŒã«ãã㯠ã€ã³ãã³ããšäºåå®çŸ©ããããã©ããŒã¢ãã ã€ã³ãã³ãã¯ãããŸãããçµã¿èŸŒã¿ã€ã³ãã³ããã芧ãã ããã
次ã®è¡šã«ãDialogflow ES ããäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãªãœãŒã¹ã«ç¹å®ã®ã€ã³ãã³ã ããŒã¿ããããã³ã°ããæ¹æ³ã瀺ããŸãã
Dialogflow ES ã€ã³ãã³ã ããŒã¿ | 察å¿ããäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒããŒã¿ | å¿ èŠãªã¢ã¯ã·ã§ã³ |
---|---|---|
ãã¬ãŒãã³ã° ãã¬ãŒãº | ã€ã³ãã³ã ãã¬ãŒãã³ã° ãã¬ãŒãº | ããŒã«ã«ããç§»è¡ãããŸããããŒã«ã¯ã·ã¹ãã ãšã³ãã£ãã£ã®ãµããŒãã確èªãããµããŒããããŠããªãã·ã¹ãã ãšã³ãã£ãã£ã® TODO é ç®ãäœæããŸãã |
ãšãŒãžã§ã³ã ã¬ã¹ãã³ã¹ | ãã«ãã£ã«ã¡ã³ã ã¬ã¹ãã³ã¹ ã¡ãã»ãŒãž | ãšãŒãžã§ã³ãã®ã¬ã¹ãã³ã¹ãã芧ãã ããã |
äŒè©±ã®å¶åŸ¡ã®ã³ã³ããã¹ã | ãªã | æ§é ãšäŒè©±ãã¹ã®å¶åŸ¡ãã芧ãã ããã |
Webhook ã®èšå® | ãã«ãã£ã«ã¡ã³ã Webhook ã®æ§æ | Webhooks ãã芧ãã ããã |
ã€ãã³ã | ãããŒã¬ãã«ãŸãã¯ããŒãžã¬ãã«ã®ã€ãã³ã ãã³ãã© | ã€ãã³ããã芧ãã ããã |
ã¢ã¯ã·ã§ã³ | ãã«ãã£ã«ã¡ã³ã Webhook ã¿ã° | Webhooks ãã芧ãã ããã |
ãã©ã¡ãŒã¿ | ã€ã³ãã³ã ãã©ã¡ãŒã¿ããã³ / ãŸãã¯ããŒãžãã©ãŒã ãã©ã¡ãŒã¿ | ããŒã«ã«ããã€ã³ãã³ã ãã©ã¡ãŒã¿ã«ç§»è¡ãããŸãããã©ã¡ãŒã¿ãå¿ èŠãªå Žåã¯ãããŒã«ã«ããããŒãžã«ç§»è¡ããå¯èœæ§ã®ãã TODO ã¢ã€ãã ãäœæãããŸãããã©ã¡ãŒã¿ãã芧ãã ããã |
ãã©ã¡ãŒã¿ ããã³ãã | ããŒãžãã©ãŒã ãã©ã¡ãŒã¿ã®ããã³ãã | ãã©ãŒã å ¥åãã芧ãã ããã |
ãããŒãäœæãã
é«ã¬ãã«ã®äŒè©±ãããã¯ããšã«ãããŒãäœæããŸãã åãããŒå ã®ãããã¯ã¯åºå¥ããŠãäŒè©±ããããŒéã§é »ç¹ã«è¡ã£ããæ¥ããããªãããã«ããŸãã
ã¡ã¬ ãšãŒãžã§ã³ãã䜿çšããŠããå Žåã¯ãåãµããšãŒãžã§ã³ãã 1 ã€ä»¥äžã®ãããŒã«ããå¿ èŠããããŸãã
åºæ¬çãªäŒè©±ãã¹ããå§ãã
倿Žãå埩åŠçããªãããã·ãã¥ã¬ãŒã¿ã䜿çšããŠãšãŒãžã§ã³ãããã¹ãããããšãããããããŸãã ãã®ããã«ãäŒè©±ã®æ©ã段éã§åºæ¬çãªäŒè©±ãã¹ã«çŠç¹ãåœãŠã倿Žãå ãããã³ã«ãã¹ãããå¿ èŠããããŸãã ããããæ©èœãããããã詳现ãªäŒè©±ãã¹ã«é²ã¿ãŸãã
ãããŒã¬ãã«ãšããŒãžã¬ãã«ã®ç¶æ ãã³ãã©
ç¶æ ãã³ãã©ãäœæããéã¯ããããŒã¬ãã«ãŸãã¯ããŒãžã¬ãã«ã§é©çšããå¿ èŠããããã©ãããæ€èšããŠãã ããã ãããŒã¬ãã«ã®ãã³ãã©ã¯ããããŒïŒã€ãŸããããŒå ã®ããŒãžïŒãã¢ã¯ãã£ããªãšãã«åžžã«ã¹ã³ãŒãã«å«ãŸããŸãã ããŒãžã¬ãã«ã®ãã³ãã©ã¯ãç¹å®ã®ããŒãžãã¢ã¯ãã£ããªå Žåã«ã®ã¿ã¹ã³ãŒãã«å«ãŸããŸãã ãããŒã¬ãã«ã®ãã³ãã©ã¯ãå ¥åã³ã³ããã¹ããæããªã Dialogflow ES ã€ã³ãã³ãã«äŒŒãŠããŸããããŒãžã¬ãã«ã®ãã³ãã©ã¯ãå ¥åã³ã³ããã¹ããæã€ Dialogflow ES ã€ã³ãã³ãã«äŒŒãŠããŸãã
Webhook ã³ãŒã
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã§ã¯ãWebhook ã®ãªã¯ãšã¹ã ããããã£ãšã¬ã¹ãã³ã¹ ããããã£ãç°ãªããŸããWebhook ã®ã»ã¯ã·ã§ã³ãã芧ãã ããã
ãã¬ããž ã³ãã¯ã¿
äŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã§ã¯ããã¬ããž ã³ãã¯ã¿ã¯ãŸã ãµããŒããããŠããŸãããããããéåžžã®ã€ã³ãã³ããšããŠå®è£ ããããäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒã§ãã¬ããž ã³ãã¯ã¿ããµããŒãããããŸã§åŸ ã€å¿ èŠããããŸãã
ãšãŒãžã§ã³ãã®èšå®
Dialogflow ES ãšãŒãžã§ã³ãã®èšå®ã確èªããå¿ èŠã«å¿ããŠäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãšãŒãžã§ã³ãã®èšå®ã調æŽããŸãã
TODO ãã¡ã€ã«ã䜿çšãã
ç§»è¡ããŒã«ã¯ CSV ãã¡ã€ã«ãåºåããŸãã ãã®ãªã¹ãã®é ç®ã¯ã泚æãå¿ èŠãªããŒã¿ã«çŠç¹ãåœãŠãŠããŸãã ãã®ãã¡ã€ã«ãã¹ãã¬ããã·ãŒãã«ã€ã³ããŒãããŸããå®äºããŒã¯çšã®åã䜿çšããŠãã¹ãã¬ããã·ãŒãå ã®åé ç®ã解決ããŸãã
API 䜿çšã®ç§»è¡
ã·ã¹ãã ã§ã©ã³ã¿ã€ã ãŸãã¯èšèšæã®åŒã³åºãã« Dialogflow ES API ã䜿çšããŠããå Žåã¯ãäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒAPI ã䜿çšããããã«ãã®ã³ãŒããæŽæ°ããå¿ èŠããããŸããå®è¡æã«æ€åºã€ã³ãã³ãã®åŒã³åºãã®ã¿ã䜿çšããŠããå Žåã¯ããã®æŽæ°ã¯éåžžã«ç°¡åã§ãã
çµ±å
ãšãŒãžã§ã³ãã§çµ±åã䜿çšããå Žåã¯ãçµ±åã®ã»ã¯ã·ã§ã³ãåç §ããŠå¿ èŠã«å¿ããŠå€æŽããŠãã ããã
æšå¥šãããç§»è¡æé
以äžã®ãµãã»ã¯ã·ã§ã³ã§ã¯ãæšå¥šãããç§»è¡æé ã®æŠèŠã瀺ããŸãã
æ€èšŒ
ãšãŒãžã§ã³ãã®æ€èšŒã䜿çšããŠããšãŒãžã§ã³ãããã¹ã ãã©ã¯ãã£ã¹ãéµå®ããŠããããšã確èªããŸãã
ãã¹ã
äžèšã®æåç§»è¡æé ãå®è¡ããªãããã·ãã¥ã¬ãŒã¿ã䜿çšããŠãšãŒãžã§ã³ãããã¹ãããå¿ èŠããããŸãã ãšãŒãžã§ã³ããåäœããŠããããšã確èªã§ããã°ãDialogflow ES ãšãŒãžã§ã³ããšäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒãšãŒãžã§ã³ãã®éã®äŒè©±ãæ¯èŒããåäœãåç以äžã«ãªã£ãŠãããã確èªããå¿ èŠããããŸãã
ã·ãã¥ã¬ãŒã¿ã§ãããã®äŒè©±ããã¹ãããéã«ããã¹ãã±ãŒã¹ãäœæããŠå°æ¥ã®ååž°ãé²ãå¿ èŠããããŸãã
ç°å¢
Dialogflow ES ç°å¢ã確èªããå¿ èŠã«å¿ããŠäŒè©±ãšãŒãžã§ã³ãïŒDialogflow CXïŒç°å¢ãæŽæ°ããŸãã