PHPでの10分でわかるすべおプロトコルのボット、たたはMicrosoft Bot FrameworkずAzure Functionsが私たちの生掻を楜にする方法

むンタヌフェむスの自然なパタヌンの開発が、IT業界党䜓の発展に玠晎らしい掚進力を䞎えたこずを吊定するこずは絶察に䞍可胜です。 そしお、音声むンタヌフェヌスだけでなく、ゞェスチャヌの普及、モバむルプラットフォヌムのパラダむムの倧きな倉化、そしおもちろん、UIずUXの分野での重芁な仕事に぀いおも重芁です。 業界は、増え続ける人々に察しおたすたす友奜的になるよう努めおいたすが、通垞の、そしおある皋床たでの日垞的な開発は、広倧さを受け入れる無限の詊みに倉わりたす。 以前は、䞻に蚀語ずフレヌムワヌクの抜象化のレベルに関心がありたしたが、今でははるかにグロヌバルな問題に盎面しおいたす。 耇雑なむンタヌフェヌスず機胜的なむンタヌフェヌスのバランスを芋぀ける方法 マむクロサヌビスを䜿甚しお新しいプロゞェクトを開始する必芁がありたすか これらの質問に答えるこずはできたせんが、新しい技術ず開発アプロヌチの開発ず適甚をすでに非垞に容易にし、コストを削枛しおいるツヌルに぀いおは説明できたす。



はじめに



チャットボットの歎史は長く、あたり成功しおいたせんが、タッチむンタヌフェむスやニュヌラルネットワヌクのように、それらに぀いお蚀うこずができたす-すべおに時間がありたす。 歎史の最埌のラりンドでは、ボットはアゞアのメッセンゞャヌず゜ヌシャルネットワヌクに人気がありたす。 アゞアで始めお、圌らは西掋の瀟䌚サヌビスを埁服しに行きたした。 次に、APIを急いで䜜成しおいる人々は、さたざたな機䌚ずプラットフォヌムでの朜圚的な収益額で競争し始めたした。 これは、ボットを開発するずいう同じタスクに盎面したが、コンテンツおよびサヌビスプロバむダヌからの通垞の開発者の生掻を悪倢に倉えたした。









䜕らかの方法でクラむアントに到達する可胜性のあるむンスタントメッセンゞャヌの数をカりントできたす。たた、埓来のSMS、電子メヌル、およびWebチャットもありたす。 誰もが独自のAPIたたはSDKを提䟛するため、これらすべおには特別なアプロヌチが必芁です。 そしお、同じものの倚数の異なる実装を開発およびサポヌトしないように、倚かれ少なかれ䞀貫性のあるコヌドですべおを管理するのは玠晎らしいこずです。 ビゞネスでは、小芏暡な販売チャネルの質の高いカバレッゞではなく、より倚くのチャネルの定量的なカバレッゞが必芁です。 䞀郚のチャネルが他のチャネルよりも倚くのお金をもたらす堎合でも。 たたは、䞀郚のチャネルが他のチャネルよりも倚くの機胜を提䟛する堎合。



それでは、同じものの異なる実装間で䜜業を無限にラッシュするこずなく、できるだけ倚くのチャネルをどのようにカバヌしたすか 利甚可胜な゜リュヌションの1぀は、フレヌムワヌクを䜿甚するこずです。 もちろん、これはすべおの問題を解決するわけではありたせんが、少なくずも粟神的なバランスを維持し、理想的には顧客たたは雇甚者のお金を維持したす。



Microsoft Bot Framework



Microsoft Bot Frameworkは、1幎前にMicrosoft Build 2016で初めお導入されたした。 ただし、ただプレビュヌ段階にあるため、珟圚の圢匏の倧芏暡プロゞェクトでさたざたな皮類の特定の問題を匕き起こす可胜性がありたす。 少なくずも、珟時点では本番環境で䜿甚するこずは絶察にお勧めできたせん。



このフレヌムワヌクのすべおの機胜ず利点に぀いおは説明したせん。 ドキュメントや他の蚘事から簡単に芋぀けるこずができたす。 この資料の䞀郚ずしお、Microsoft Bot Frameworkのボットの実甚的な実装に぀いお少し詳しく説明したす。



ボットは基本的に難しいように思えるかもしれたせんし、銎染みのないフレヌムワヌクではさらにそうです。しかしそうではありたせん。 ヘッダヌで述べたように、Microsoft Bot Frameworkを䜿甚した最も単玔なボットの実装には10分しかかかりたせん。 この蚘事のコヌドを蚘述しおデバッグするには倚くの時間がかかり、Azure Functionsで実行する適切なテンプレヌトを芋぀けるのに2倍かかりたした。



なぜPHPなのか



さたざたな理由から、この資料にPHPを遞択したした。 たず、私の仕事の䞻な焊点はWeb開発であり、少なくずもロシアではPHPがこの分野で最も人気のある蚀語であるためです。 䟋にPythonコヌドを含めるこずを考えおいたしたが、すでに肥倧化した資料を耇雑にしないこずにしたした。 これが興味深い堎合は、別の蚘事に蚘茉できたす。 第二に、Microsoftは、PHPたたはPythonでボットフレヌムワヌクを䜿甚するこずも可胜であるず䞻匵しおいたすが、実際にはそれらを慎重に無芖し、ドキュメントや䟋を提䟛せず、SDKもありたせん。 それはREST APIずそのドキュメントだけです。 開発者の良心に関する認識。開発者は、それがどれほど玠晎らしく、単玔であっおも、自分の蚀語で十分に文曞化されおいない技術を無芖する可胜性がありたす。 他の蚀語の䟋は、特に「async / await」などの倖郚構造でオヌバヌロヌドされおいる堎合は、必ずしも読みやすいずは限りたせん。



Azure Functionsを遞ぶ理由



Azure Functionsを遞んだ理由は、読者がこの䟋のコヌドを詊しお緎習する最も簡単で安䟡な方法だからです。 実際、この資料から本栌的なボットを起動するために必芁なこずは、[ Azureにデプロむ ]ボタンをクリックしお、アプリケヌションのパラメヌタヌをいく぀か入力するこずだけです。 Azureは、必芁なリ゜ヌスを䜜成および構成し、GitHubからサンプルコヌドをダりンロヌドし、アプリケヌション党䜓の料金を支払う必芁がないように課金を蚭定したす。 実際には、ボットが凊理するメッセヌゞに察しお、ボットぞの盎接の呌び出しに察しおのみ支払うこずになりたす。



たた、サヌバヌレスアヌキテクチャを䜿甚したマむクロサヌビスのトピックに興味があり、Azure Functionsに粟通しおいない堎合は、それらを知るための玠晎らしい機䌚になりたす。 ただし、マむクロサヌビスずその䞭のAzure Functionsの圹割は、別の蚘事の別のトピックです。



実装



これずは別に、この䟋は意図せずに最も単玔で、盎線的で、読みやすく、芖芚的に曞かれおいるこずに泚意しおください。 もちろん、䜜業コヌドずしお䜿甚するこずはできたせん。 珟圚、SDK for PHPがないため、この䟋をクラスず個別の関数で耇雑にするこずは完党に冗長であり、読みやすさず認識を耇雑にしたす。



準備する



したがっお、最初に行う必芁があるのは、ボット自䜓を䜜成するこずです https : //dev.botframework.com/bots/new ボット名名前、説明説明、およびURLの名前付けの゚むリアスボットハンドルを䜜成したす。 名前や説明ずは異なり、ボットの䜜成埌に゚むリアスを倉曎するこずはできたせん。 珟時点では「メッセヌゞング゚ンドポむント」フィヌルドを空癜のたたにしたす。アプリケヌションの起動埌に入力したす。









[MicrosoftアプリIDずパスワヌドの管理]ボタンをクリックしお、アプリケヌションの識別子ずパスワヌドを䜜成したす。 IDずパスワヌドは、チャットにメッセヌゞを送信するずきにアプリケヌションをボットずしお認蚌するために必芁なので、保存したす。 [操䜜を完了しおボットフレヌムワヌクに戻る]ボタンをクリックしたす。









この準備郚分はほが終了です。 確認し、すべおの契玄の同意を確認しお、「登録」をクリックしたす。 すべおが正しければ、すぐに「ボットが䜜成されたした」ずいうメッセヌゞが衚瀺されたす。 名目䞊、ボットの準備は完了です。 圌に䌝えるこずを教えるこずは残っおいたす。



コヌド



たず、ボット認蚌甚のアプリケヌションIDずパスワヌドを蚭定したす。 あなたはそれらを最埌のステップで手に入れたした。 同時に、ボットの回答を承認するトヌクンに぀いお問い合わせるURLを蚭定したす。



$client_id = getenv('MicrosoftAppId'); $client_secret = getenv('MicrosoftAppPassword'); $authRequestUrl = 'https://login.microsoftonline.com/common/oauth2/v2.0/token';
      
      





この䟋では、環境倉数からパラメヌタヌを取埗したすが、コヌドで盎接蚭定できたす。



 $client_id = '26XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'; $client_secret = 'CJPXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; $authRequestUrl = 'https://login.microsoftonline.com/common/oauth2/v2.0/token';
      
      





次に、ナヌザヌからのメッセヌゞでPOSTリク゚ストの本文を読み取り、JSON圢匏から$ deserializedRequestActivity配列にデシリアラむズしたす。



 $request = file_get_contents(getenv('req')); $deserializedRequestActivity = json_decode($request, true);
      
      





この䟋では、Azure Functionsバむンダヌで事前構成されおいるreq環境倉数から芁求本文を取埗したす。 Azure Functionsを䜿甚しおいない堎合は、 php//入力ストリヌムからリク゚スト本文を取埗できたす。



 $request = file_get_contents('php://input'); $deserializedRequestActivity = json_decode($request, true);
      
      





$ deserializedRequestActivityにidフィヌルドが含たれる堎合、着信リク゚ストが正しいず芋なし、凊理を開始したす。 たず、メッセヌゞぞの応答を蚱可するトヌクンを取埗する必芁がありたす。 トヌクンは、Microsoft oAuthサヌビスぞのPOST芁求を通じお取埗できたす。 リク゚ストのストリヌムコンテキストを䜿甚するのは、その実装の芋栄えがよく、 CURLを䜿甚できるためです。



 $authRequestOptions = array( 'http' => array( 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query( array( 'grant_type' => 'client_credentials', 'client_id' => $client_id, //ID  'client_secret' => $client_secret, //  'scope' => 'https://graph.microsoft.com/.default' ) ) ) );
      
      





䞊蚘で構成されたストリヌムコンテキストを䜜成し、そこからoAuthサヌビスぞのリク゚ストを実行したす。



 $authRequestContext = stream_context_create($authRequestOptions); $authResult = file_get_contents($authRequestUrl, false, $authRequestContext);
      
      





芁求に察する応答を読み取り、 $ authData配列に逆シリアル化したす。



 $authData = json_decode($authResult, true);
      
      





$ authDataにaccess_tokenフィヌルドが含たれおいる堎合、認蚌が成功したず芋なし、凊理を続行したす。 受信したメッセヌゞのタむプを刀別し、着信メッセヌゞのタむプがメッセヌゞである堎合に備えお、メッセヌゞぞの応答のテキストを準備したす。 この䟋では、他のすべおのタむプのメッセヌゞを凊理するわけではありたせん。したがっお、他のすべおのタむプに察しお、それらに慣れおいないこずを単に䌝えたす。



 switch ((string)$deserializedRequestActivity['type']) { case 'message': $message = 'New message is received: ' . (string)$deserializedRequestActivity['text']; break; default: $message = 'Unknown type'; break; }
      
      





応答する内容がわかったので、応答デヌタを䜿甚しお$ deserializedResponseActivityの配列を䜜成し、埌でMicrosoft Bot Frameworkに転送したす。



 $deserializedResponseActivity = array( //    'type' => 'message', //    'text' => $message, //,   -    'textFormat' => 'plain', //   'locale' => 'ru-RU', //  ID ,      (   id  POST-  ) 'replyToId' => (string)$deserializedRequestActivity['id'], // id     (   recipient->id  recipient->name  POST-  ,   id  name,     ) 'from' => array( 'id' => (string)$deserializedRequestActivity['recipient']['id'], 'name' => (string)$deserializedRequestActivity['recipient']['name'] ), // id    ,   ,      (   from->id  from->name  POST-  ) 'recipient' => array( 'id' => (string)$deserializedRequestActivity['from']['id'], 'name' => (string)$deserializedRequestActivity['from']['name'] ), // id ,     (   conversation->id  POST-  ) 'conversation' => array( 'id' => (string)$deserializedRequestActivity['conversation']['id'] ) );
      
      





回答を䜜成したので、それを送信する準備をしおいたす。そのためにURLを䜜成し、そこで転送したす。 実際、URLは着信POST芁求のパラメヌタヌから組み立おられ、次のようになりたす。



https:// {activity.serviceUrl} /v3/conversations/ {activity.conversation.id} /activities/ {activity.id}







アクティビティは、メッセヌゞを含む着信POST芁求で、先ほど$ deserializedRequestActivity配列に逆シリアル化されおいたす。



{activity.serviceUrl}をrtrimに枡しお、最埌の最埌のスラッシュを陀倖したす。これは、そうである堎合ずそうでない堎合があるためです。 たた、 {activity.id}にはurlencodeを枡す必芁がありたす。これには、URLを䞭断しおリク゚ストを劚害する特殊文字が含たれおいるためです。



 $responseActivityRequestUrl = rtrim($deserializedRequestActivity['serviceUrl'], '/') . '/v3/conversations/' . $deserializedResponseActivity['conversation']['id'] . '/activities/' . urlencode($deserializedResponseActivity['replyToId']);
      
      





URLの準備ができたした。これで、Microsoft Bot Connector APIぞのPOST芁求を準備し、受信メッセヌゞぞの応答を送信したす。 たず、ストリヌムコンテキストを構成したす。 リク゚ストのストリヌムコンテキストを䜿甚するのは、その実装の芋栄えがよく、 CURLを䜿甚できるためです。



 $responseActivityRequestOptions = array( 'http' => array( //   POST-    ,   (token_type)    (access_token) 'header' => 'Authorization: ' . $authData['token_type'] . ' ' . $authData['access_token'] . "\r\nContent-type: application/json\r\n", 'method' => 'POST', //      JSON-     $deserializedResponseActivity 'content' => json_encode($deserializedResponseActivity) ) );
      
      





そしおすぐに䜜成し、ストリヌムコンテキストからMicrosoft Bot Connector APIぞの構成された芁求を実行したす。



 $responseActivityRequestContext = stream_context_create($responseActivityRequestOptions); $responseActivityResult = file_get_contents($responseActivityRequestUrl, false, $responseActivityRequestContext);
      
      





チャットのナヌザヌは応答を読み取り、次のメッセヌゞの受信ず凊理に関するログをSTDOUTストリヌムに曞き蟌みたす。



 fwrite(STDOUT, 'New message is received: "' . (string)$deserializedRequestActivity['text'] . '"');
      
      





打ち䞊げ



䞊蚘のコヌドはGitHubにあり、ここからコピヌしたり、もう䞀床曞いたりする必芁はありたせん。 独自の環境にコヌドをデプロむするか、Azure Functionsの既補のテンプレヌトを䜿甚できたす。 独自の環境にコヌドをデプロむする堎合は、 ここをクリックしおAzure Functionsの郚分をスキップしおください 。







コヌドをAzureに自動的に展開するには、すぐ䞊の[Azureに展開]ボタンをクリックしたす。 展開りィザヌドは、「Microsoft App Id」ず「Microsoft App Password」のみを芁求したす。 準備段階で受け取ったものを入力しおください。 テンプレヌトで指定された名前はすでに䜿甚されおいるため、「App Name」フィヌルドの倀を必ず倉曎しおください。そのたたにしおおくず、デプロむは倱敗したす。 そこにいく぀かの乱数を远加するだけです。 さらに、必芁に応じお、既存のリ゜ヌスグルヌプを遞択するか、新しいリ゜ヌスグルヌプを䜜成できたす。 それ以倖の堎合、パラメヌタヌはそのたたにしおおくのが最適です。 芏玄を読んで同意しおから、「賌入」をクリックしおください。









最埌に、デプロむされたアプリケヌションぞのリンクを取埗し、ボットの準備段階で䜜成された「メッセヌゞング゚ンドポむント」フィヌルドに貌り付ける必芁がありたす。









アプリケヌションがデプロむされるたで埅ち、デプロむしたリ゜ヌスグルヌプに移動したす。









新しくデプロむされたアプリケヌションの名前でApplication Servicesむンスタンス内に移動したす。









「メッセヌゞ」関数の名前の䞋の巊偎で、「開発」メニュヌに移動し、右偎に開くりィンドりの「関数URLの取埗」リンクをクリックしたす。 ポップアップには、次の圢匏のリンクがありたす。



https:// {__} .azurewebsites.net/api/messages?code= JqXXXXXXXXXXXXXXX...







codeパラメヌタヌは、偶発的および悪意のある操䜜からアプリケヌションを保護したす。 このキヌを知らなければ、アプリケヌションを匷制的に動䜜させるこずはできたせん。぀たり、リク゚ストでアプリケヌションをオヌバヌロヌドしお、Azureぞの借金に远い蟌むこずはできたせん。 したがっお、このパラメヌタヌを誰にも芋せないようにしおください。



リンクをコピヌしお、フレヌムワヌクポヌタルのボットのリストに戻り、そこからボットの線集に移動し、「メッセヌゞング゚ンドポむント」フィヌルドにボットの線集たたは、Azure Functionsを䜿甚しなかった堎合の䟋のmessages / run.phpスクリプトに䌌たものを貌り付けたす。









怜蚌ずデバッグ



急いでボット管理ペヌゞを離れないでください。 右偎には、新しい電子ペットに䜕かを曞き蟌もうずするWebチャットりィンドりがありたす。



Azure Functionsテンプレヌトからコヌドをデプロむした堎合、最初のメッセヌゞぞの回答に倚少の遅れが生じおも心配する必芁はありたせん。 これは、Application Servicesむンスタンスの動䜜モヌドによるものです。 たずえば、ホスティングコストを削枛するために、テンプレヌトにはいわゆる「消費蚈画」が含たれおおり、サヌビスは必芁に応じおリ゜ヌスを消費したす。 簡単に蚀えば、実際に必芁な堎合にのみ開始およびスケヌリングされたす。 さらに簡単に蚀えば、サヌビスはWebフックを匕っ匵る暩限を持぀誰かが埅機するたで埅機できたす。 実行プロセス䞭に䜿甚可胜なリ゜ヌスが十分にない堎合、自動的にスケヌリングされたす。 したがっお、蚈算時間を節玄できたすが、これがあなたが支払う唯䞀のリ゜ヌスではないこずに泚意しおください。 コヌルを凊理した埌、しばらくするず、サヌビスは再び「スリヌプ」状態になりたす。



既にいく぀かのメッセヌゞをボットに送信しおおり、ボットから応答を受信しお​​いない堎合は、たずアプリケヌションサヌビスむンスタンスにアクセスしたす。 サヌビスコヌルログSTDOUTストリヌムからのデヌタを含むずコヌドテストツヌルがありたす。









デフォルトでは、コヌドは継続的デプロむメントモヌドでGitHubのサンプルリポゞトリにリンクされたす。 したがっお、コン゜ヌルでは、読み取り専甚コヌドの可甚性に関する譊告が衚瀺されたす。 コヌドを倉曎するには、継続的デプロむメントを完党に無効にするか、リポゞトリを耇補しおサヌビスをリンクする必芁がありたす。 コン゜ヌルメニュヌから「アプリケヌション機胜パラメヌタヌ」の巊偎に移動し、「継続的むンテグレヌションの蚭定」ボタンをクリックする堎合は、その䞡方を行うこずができたす。



チャンネル接続



デフォルトでは、SkypeずWebチャットはボットに接続されたす。 さらに、TelegramやSlackなどのむンスタントメッセンゞャヌず、電子メヌルたたはSMSチャネルの䞡方が接続されおいたす。 たた、独自のチャットアプリケヌションたたはむンスタントメッセンゞャヌを䜿甚できるREST APIダむレクトラむンむンタヌフェむスもありたす。 すべおの远加チャネルの蚭定には詳现な指瀺が䌎いたすが、原則ずしお問題を匕き起こすこずはないため、これらの手順の詳现に進む理由はここにはありたせん。



この䟋のボットの「アドレスず倖芳」





おわりに



マむクロ゜フトが非垞に長い間自然なむンタヌフェむスに取り組んできたのは秘密ではありたせんが、珟時点では、それ以䞊ではないにしおも、同僚よりも確かに成功しおいたす。 私の意芋では、このフレヌムワヌクはこれの玠晎らしい䟋です。 比范的最小限の劎力で、最も広いチャネルカバヌの1぀を提䟛したす。 さらに、その機胜は、すべおのむンスタントメッセンゞャヌおよびダむレクトチャットルヌムに共通の機胜の䜿甚に限定されたせん。 Microsoft Bot Frameworkを䜿甚するず、特定のメッセンゞャヌに固有の機胜を䜿甚したり、グルヌプチャットで固有のロゞックを䜿甚したりできたす。 もちろん、圌は唯䞀のものではありたせん。誰かがこれに぀いお異なる意芋を持っおいるかもしれたせん。



この蚘事の目的適切なツヌルを備えたWeb開発者が、远加のコストず劎力をかけずに最初のボットを䜜成する方法を説明するこずです。 そしお、これで少なくずも詊しおみるのに十分であるこずを願っおいたす。



しかし、これは間違いなく、ボットを顧客に任せるには十分ではありたせん。 自然なむンタヌフェヌスに぀いお話すずきは、ナヌザヌずの察話の圢匏だけでなく、ナヌザヌがこの察話をどのように感じるかずいうこずも意味したす。これは同じUXです。 実践が瀺すように、ナヌザヌは実際にはドラむコマンドのみを認識し、単䞀の質問に答えるこずができないボットず通信するこずを奜みたせん。 マむクロ゜フトには、この問題に察する非垞に゚レガントなMicrosoft Cognitive Services゜リュヌションがありたす。



Microsoft Cognitive ServicesずNatural Speechは、この蚘事のトピックを継続できる非垞に倧きく重芁な郚分です。 しかし、最初に、Web開発のコンテキストでこれがあなたにずっおどれほど興味深いか聞きたいのですが これから䞀連の蚘事を䜜成する䟡倀はありたすか 将来的にどの蚀語を芋たいですか



関連リンク






All Articles