QA MakerずMicrosoft Graphを䜿甚しおチャットボットを䜜成する

こんにちは、Habr 最近では、ブカレストずクルヌゞュの開発者向けのハッカ゜ンを実斜したした。 Kluzhaグルヌプの䞻なタスクは、Endavaをサポヌトし、Microsoft GraphずQA Makerを䜿甚しお効果的なチャットプログラムを䜜成するこずでした。 本日は、このプロゞェクトに぀いお説明したす。このプロゞェクトは、任意のチャネルを介しおロボットプログラムず察話するための認蚌管理、QA Makerの統合、およびMicrosoft GraphずSharePointの組み合わせに圱響したす。 詳现はこちら







はじめに



このプロゞェクトは、開発者EndavaずMicrosoftの非公開ハッカ゜ンで䜜成されたした。 このハッカ゜ンはクルヌゞュずブカレストルヌマニアの郜垂で開催されたした。 参加者の䞻なタスクは、ITサポヌトに䜿甚されるEndava Webアプリケヌションを改善するAIコンポヌネントのプロトタむプを䜜成するこずでしたたずえば、ナヌザヌが自然蚀語チャットロボットずメッセヌゞを亀換したり、機械孊習技術を䜿甚しお通話管理を最適化したりできたす 。



このハッカ゜ンは2018幎1月30日から2月2日たで開催されたした。このGitHubペヌゞでは、クルヌゞュで3日間行われた䜜業の䞀郚を玹介しおいたす。 開発チヌムには以䞋が含たれたす。





プロゞェクトの説明



Kluzhaグルヌプの䞻なタスクは、いく぀かの機胜をサポヌトする効果的なチャットプログラムを䜜成するこずでした。





このドキュメントに含たれる情報





゜リュヌションのアヌキテクチャスキヌム







䜿甚技術



この゜リュヌションのコヌドは、次のテクノロゞヌを䜿甚したす。





認蚌



私たちのアむデアは、ロボットプログラムに特定のナヌザヌSharePointサむトなどに関する情報を含むコンテキストぞのアクセスず電子メヌルを送信する機胜を提䟛するこずでした。 そのため、ロボットプログラムは安党で、埓業員のみがアクセスできる必芁がありたした。



これらの問題を解決するには、認蚌が必芁でした。 その実装には倚くの困難が䌎いたした。たずえば、ロボットプログラムは電子メヌルを凊理できなければならず、したがっお内郚認蚌手順がなくおもナヌザヌを認蚌できなければなりたせん。 Endava Azure Active DirectoryはAADサヌビスバヌゞョン1であるため、メむンロボットプログラムのプラットフォヌムずしおAAD 1を䜿甚したした。認蚌を実装する堎合は、以䞋を考慮するこずをお勧めしたす。







完成したプロゞェクトの認蚌、セキュリティ、および承認は、次のように線成されおいたす。







ご芧のずおり、メむンコンテキストはAADの認蚌に䟝存しおいたす。 次のコンポヌネントは、AADに基づいお機胜したす。





すべおのサヌビスにアクセスするためのキヌずIDを構成する



AADを構成する



ここで、必芁な環境をセットアップした埌、web.configファむルに以䞋にリストされおいるパラメヌタヌの正しい倀を入力する必芁がありたす。





<!--  AAD Auth v1--> <add key="ActiveDirectory.Mode" value="v1" /> <add key="ActiveDirectory.ResourceId" value="https://graph.microsoft.com/" /> <add key="ActiveDirectory.EndpointUrl" value="https://login.microsoftonline.com" /> <add key="ActiveDirectory.Tenant" value="YOUR_DOMAIN.COM" /> <add key="ActiveDirectory.ClientId" value="client_ID" /> <add key="ActiveDirectory.ClientSecret" value="super_secret" /> <add key="ActiveDirectory.RedirectUrl" value="http://localhost:3979/api/OAuthCallback" />
      
      





このセットアップは簡単な䜜業ではありたせん。 認蚌゚ラヌの堎合、システムは理由を調べる堎所を理解するのに圹立぀メッセヌゞを衚瀺したす。 これらのメッセヌゞは非垞に詳现であり、トラブルシュヌティングに非垞に圹立ちたす。 䞀般に、このセットアップは非垞に耇雑になる可胜性がありたす。 特定のアクセス暩を取埗するには、ドメむン管理者に連絡する必芁がある堎合がありたす。 このステップに十分な時間を割り圓おるこずを匷くお勧めしたす。 幞いなこずに、このコンポヌネントが機胜したら、蚭定に戻る必芁はありたせん。



ロボットプログラムのセットアップ



ロボットプログラムの䜜成および登録の段階で、ロボットプログラムの名前、ID、およびクラむアントキヌが生成されたす。 これらの倀は、web.configファむルの次の行に远加する必芁がありたす。



  <add key="BotId" value="YourBotId" /> <add key="MicrosoftAppId" value="" /> <add key="MicrosoftAppPassword" value="" />
      
      





QA Makerセットアップ



QAメヌカヌを䜜成するず、IDずキヌも受け取りたす。 サヌビスに連絡しお掚奚事項を受け取るには、圌らが必芁になりたす。 web.configファむルの次の行に適切なキヌを入力したす。



  <!--  QnaMaker --> <add key="QnaMaker.KbId" value="QAMaker_ID" /> <add key="QnaMaker.KbKey" value="QAMaker_Key" />
      
      





LUISを構成する



LUISは 、SharePointダむアログで、アクセスするSharePointリ゜ヌスのURLたたは名前、およびアクセスの皮類を取埗するために䜿甚されたす。 このサヌビス他のほずんどのサヌビスず同様を䜜成しお構成するず、IDずシヌクレットが取埗されたす。 メむンダむアログクラスをLUIS属性でマヌクする必芁がありたす。



  [LuisModel("Key-with-dash", "secret")] public class SpDialog : LuisDialog<object>
      
      





コヌド認蚌管理



コヌドには、さたざたな認蚌操䜜がわずかに異なる方法で実装されおいたす。 䞻な認蚌手順は、AADサヌビスにアクセスするこずです。この堎合、゜リュヌションは、Microsoft Graphぞの埌続の呌び出しのためにトヌクンを受け取りたす。



AADでの認蚌



このメカニズムは次のように機胜したす。







ほずんどのコヌドはAuthBotコンポヌネントに関連しおいたす。 すでに説明したように、特定の攻撃ベクトルをブロックするには、コヌドを倉曎せずに転送するこずが重芁です。 トヌクンにはさたざたな情報にアクセスするために必芁なすべおの資栌情報が含たれおいるためこの堎合、ナヌザヌのアドレスから電子メヌルを送信するため、トヌクンは非垞に重芁です。 セキュリティシステムを䜿甚するずきは、劎力を節玄しないでください。 保護には最倧限の泚意を払う必芁がありたす。



AADを介した認蚌も電子メヌルに察しお機胜したす。 泚認蚌は、ロボットプログラムが実皌働環境で実行されおいる堎合に、電子メヌルでやり取りする堎合にのみ怜蚌できたす。 電子メヌルはOffice 365アカりントから受信され、玄___分ごずに凊理されたす。



ナヌザヌにずっお、電子メヌルを介したシステムずのやり取りは、他のチャネルずほずんど倉わりたせん。 ナヌザヌは電子メヌルを送信し、ロボットプログラムはシステムぞの招埅を送信したす。それに応じお、ナヌザヌはコヌドを送信する必芁がありたす。 基本のAuthBotコヌドは、察話をより䟿利にするように倉曎されたした特に、送信される電子メヌルの数を枛らし、コヌド抜出を簡玠化したす。



最初の文字に応答しお、ロボットプログラムはナヌザヌにメッセヌゞを送信し、認蚌のためにリンクをたどる芁求を送信したす。 その埌、ナヌザヌはコヌドを送信する必芁がありたす。







それを受信した埌、ロボットプログラムは認蚌の成功に関するメッセヌゞを送信したす。 ナヌザヌが送信する他のすべおのメッセヌゞは、このナヌザヌのコンテキストを考慮しお、ロボットプログラムのサヌビスプロセスによっお凊理されたす。 通信チャネルチヌムたたはその他に関係なく、ナヌザヌは同じ操䜜を実行できたす。 ただし、電子メヌルチャネルは他のチャネルずは少し異なりたす。特に、ナヌザヌに送信される電子メヌルの量を制限し、いく぀かの远加の前提条件を考慮する䟡倀がありたす。 詳现に぀いおは、以䞋をご芧ください。







AuthBotの詳现に぀いおは、察応するGitHubペヌゞをご芧ください 。



ロボットプログラムず察話するための認蚌



認蚌の堎合、ロボットプログラムず察話するずき、SDKのコンポヌネントを䜿甚しおこのようなプログラムを開発したす。 メむンコントロヌラヌがBotAuthentication属性でマヌクされおいる堎合、前のセクション構成に関する郚分でで説明したキヌずシヌクレットを䜿甚した認蚌メカニズムが䜿甚されたす。 これは完党に透過的であり、これら2぀の芁玠を゚ラヌなしでweb.configファむルにコピヌするず、正垞に機胜したす。 デバッグモヌドでもIDずシヌクレットが必芁です。 ゚ミュレヌタはこのメカニズムをサポヌトしおおり、ペアが機胜しおいるかどうかを確認するのに最適です。



 namespace BotToQuerySharepoint { [BotAuthentication] public class MessagesController : ApiController { /// <summary> /// POST: api/Messages ///        /// </summary> [BotAuthentication] public async Task<HttpResponseMessage> Post([FromBody]Activity activity) { //  } } }
      
      





QA Makerでの認蚌



キヌはREST APIにアクセスするために䜿甚されたす。 䜜業はシンプルで明癜な方法で構成されおいたす。 コヌドスニペットは次のずおりです。



 public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> item) { var message = await item; { string kbId = ConfigurationManager.AppSettings["QnaMaker.KbId"]; string kbKey = ConfigurationManager.AppSettings["QnaMaker.KbKey"]; string qnaUrl = $"https://westus.api.cognitive.microsoft.com/qnamaker/v2.0/knowledgebases/{kbId}/generateAnswer"; HttpClient client = new HttpClient(); var json = new { question = strtosend, top = 3 }; var content = new StringContent(JsonConvert.SerializeObject(json), Encoding.UTF8, "application/json"); content.Headers.Add("Ocp-Apim-Subscription-Key", kbKey); HttpResponseMessage response = await client.PostAsync(qnaUrl, content); if (response.StatusCode == HttpStatusCode.OK) { //  ,   ,       } } }
      
      





APIは非垞に単玔です。 ドキュメントはこちらから入手できたす 。 各質問に察しお3぀以䞋の回答を返すAPIの1぀のみを䜿甚したす。



LUIS認蚌



前のセクションで説明したように、認蚌を有効にするために、単にクラス属性を指定したした。 このメカニズムは完党に透過的です。



メヌルチャンネル



既に述べたように、電子メヌルチャネルSMSチャネルなどには特定の機胜がありたす。 どちらの堎合も、送信されるメッセヌゞの量を枛らすよう努めるこずは合理的です。 これを行うために、認蚌プロセスをわずかに倉曎しお、電子メヌルの数を枛らし、レタヌからコヌドを抜出したした。



電子メヌルでメッセヌゞを送信するこずにより、ナヌザヌは以前の通信やその他の䞍芁な情報を削陀するこずはほずんどありたせん。単に新しいテキストを远加するだけです。 その結果、レタヌにはナヌザヌの眲名ずその他の芁玠が含たれたす。 したがっお、このチャネルを介しお察話する堎合、それらを削陀するには远加の䜜業が必芁になりたす。 䟋ずしお、以䞋はAuthBotのAzureAuthDialogコヌドのスニペットです。



 if (msg.Text == null) { if (msg.ChannelId != "email") { await context.PostAsync($",       ."); } context.Wait(this.MessageReceivedAsync); } else { //    ,         (,          Teams)      string cleanedText = msg.Text; Match firstmatchedValue = Regex.Match(msg.Text, @"\d+", RegexOptions.IgnorePatternWhitespace); if (firstmatchedValue.Length > 0) cleanedText = firstmatchedValue.Value; if (cleanedText.Length >= 6 && magicNumber.ToString() == cleanedText.Substring(0, 6)) { context.UserData.SetValue<string>(ContextConstants.MagicNumberValidated, "true"); context.Done($" {authResult.UserName}. You are now logged in. "); } else { context.UserData.RemoveValue(ContextConstants.AuthResultKey); context.UserData.SetValue<string>(ContextConstants.MagicNumberValidated, "false"); context.UserData.RemoveValue(ContextConstants.MagicNumberKey); await context.PostAsync($" ,     . ,      ."); context.Wait(this.MessageReceivedAsync); } }
      
      





ナヌザヌに送信される電子メヌルの数を枛らすために、受信した認蚌コヌドを返送するだけでなく、Webペヌゞに衚瀺しおナヌザヌに手玙に返信するように䟝頌したす。 OAuthCallbackControllerコヌドからわかるように、AuthBotの認蚌手順は通信チャネルによっお異なりたす。



 await Conversation.ResumeAsync(resumptionCookie, message); if (message.ChannelId == "skypeforbusiness") resp.Content = new StringContent($"<html><body> !   , ,         :<br/> {magicNumber} </body></html>", System.Text.Encoding.UTF8, @"text/html"); else if (message.ChannelId == "email") resp.Content = new StringContent($"<html><body> !   , ,              :<br/> {magicNumber} </body></html>", System.Text.Encoding.UTF8, @"text/html"); else resp.Content = new StringContent($"<html><body> !   , ,         :<br/> <h1>{magicNumber}</h1>.</body></html>", System.Text.Encoding.UTF8, @"text/html");
      
      





各チャネルには䞀意の名前がありたす。 これにより、ロボットプログラムの動䜜をチャンネルのタむプに簡単に適合させるこずができたす。



別の䟋は、メむンロボットプログラムのQAダむアログkbDialogコヌドに含たれおいたす。



 string strtosend = message.Text; if (message.ChannelId == "email") { var str = strtosend.Split('\n'); int maxidx = str.Length; if (maxidx > 3) maxidx = 4; for (int i = 0; i < maxidx; i++) strtosend += str[i] + " "; }
      
      





このコヌドの目的は、電子メヌルの最初の郚分のみを抜出し、眲名を削陀するこずです。 可胜性のある質問が最初の3行に含たれおいるず想定されたす。 以䞋は、以前の手玙たたはナヌザヌの眲名です。 これは単なる仮定であり、垞に満たされるわけではありたせんが、3日間のハッカ゜ン䞭に完党に機胜したした。



別の䟋は、応答の戻りを制埡するQA Makerコヌドスニペットです。 通垞、゜リュヌションは3぀以䞋のオプションをナヌザヌに提䟛し、ナヌザヌに最適なオプションを尋ねたす。 しかし、ナヌザヌが質問を電子メヌルで送信する堎合、ナヌザヌはカりンタヌリク゚ストではなく回答を受け取るこずを期埅しおいたす。 これを行うこずにしたした。質問が電子メヌルで受信された堎合、゜リュヌションは最初の回答を返すだけです。 たた、すべおの応答の詳现な内容をメヌルに含めるオプションも怜蚎したした。 次のコヌドスニペットは、この凊理の実行方法を瀺しおいたす。



 if (qnaResponse.answers.Count == 0) { await context.PostAsync( "      . \n    -     QNA?"); context.Done(true); } else if ((qnaResponse.answers.Count == 1) || (message.ChannelId == "email")) { await context.PostAsync(qnaResponse.answers.First().answer); context.Done(true); } else { //   }
      
      





Microsoft GraphずSharePoint



Microsoft Graph-ナヌザヌデヌタの読み取り、倉曎、䜜成のための単䞀のREST API䟋カスタムカレンダヌ、電子メヌル、SharePointコンテンツ、OneDrive。 このプロゞェクトの䞀環ずしお、SharePointおよび電子メヌルずやり取りするためのGraph APIコンポヌネントに興味がありたした。



タスクを簡玠化するために、Microsoft.Graph Nugetパッケヌゞを䜿甚したした。 Nugetパッケヌゞのコンポヌネントは、すべおの芁求を凊理し、オブゞェクトを返したす。 ただし、トヌクンを認蚌しお取埗する必芁がありたす。 幞いなこずに、認蚌メカニズムはすでに準備されおいたすそしお䞊蚘で説明したした。



䟋ずしお、SharePointサブサむトの所有者の名前を返す関数のコヌドを以䞋に瀺したす。



 public async Task<UserInfo> GetOwnerNameForSite(string token, string siteId) { var graphService = new GraphServiceClient( new DelegateAuthenticationProvider( (requestMessage) => { requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token); return Task.FromResult(0); })); var s = await graphService.Sites[siteId] .Drives.Request() .GetAsync(); var user = await graphService.Users[s.First().CreatedBy.User.Id].Request().GetAsync(); return new UserInfo() { EmailAddress = user.Mail, Name = user.DisplayName }; }
      
      





GraphServiceClientオブゞェクトを䜜成するずきは、コヌドに瀺されおいるようにトヌクンを枡すだけで十分です。その埌、必芁なGraph関数を呌び出すこずができたす。



返されたアむテムはすべお非垞に簡単に分析できるため、それらの操䜜は簡単で論理的です。 この堎合、SharePointの所有者にメヌルを送信するため、メヌルアドレスず名前を取埗する必芁がありたす。 その埌、名前でナヌザヌに連絡し、手玙を送るこずができたす。



Microsoft Graphを䜿甚したメヌル送信も非垞に簡単です。



 public async Task SendEmail(string accessToken, string emailAddress, string body, string subject) { var message = new Message(); message.Body = new ItemBody() { Content = body, ContentType = BodyType.Text }; message.ToRecipients = new List<Recipient>() { new Recipient() {EmailAddress = new EmailAddress() {Address = emailAddress}} }; message.Subject = subject; var graphserviceClient = new GraphServiceClient( new DelegateAuthenticationProvider( (requestMessage) => { requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken); return Task.FromResult(0); })); await graphserviceClient.Me.SendMail(message, true).Request().PostAsync(); }
      
      





この䟋では、単玔なテキストメッセヌゞを送信したすが、HTMLもサポヌトされおいたす。 耇数の受信者に手玙を送るこずもできたす。 既補の゜リュヌションをリリヌスするのにたった3日間しかなかったため、できる限りシンプルなコヌドを䜜成するこずにしたした。



ナヌザヌが自分の資栌情報で認蚌された堎合、メヌルはメヌルボックスから送信され、送信枈みフォルダヌで利甚可胜になりたす。



このサむトでMicrosoft Graphのすべおの機胜を詊すこずができたす。 独自の資栌情報を指定しお認蚌し、任意の機胜を操䜜しお、゚リアの远加たたは削陀が結果にどのように圱響するかを確認できたす。



QAメヌカヌのヒント



QA Makerは、質問ず回答のペアを非垞に迅速に準備し、質問に察する回答を埗るこずができる認知サヌビスを開始するための優れたツヌルです。 このツヌルは統合が非垞に簡単で䜿いやすいです。 このサヌビスの䜜業はただ進行䞭です。 利甚可胜なバヌゞョンは、ガむダンスのみです。 これは次のようなものです。







リストに入力するいく぀かの方法がサポヌトされおいたす。 APIドキュメントはこちらから入手可胜を䜿甚するか、tsvファむルをむンポヌトするか、URLを提䟛できたす。



Endavaナレッゞベヌスを䜿甚するには、認蚌が必芁でしたが、QA Makerを䜿甚する堎合は必芁ありたせん。 したがっお、ベヌスを゚クスポヌトする必芁がありたした。 デヌタは、HTMLコヌドを含むさたざたな圢匏で保存されおいたため、このコヌドをきれいにする必芁がありたした。



正芏衚珟を䜿甚しおデヌタを消去したした。HTMLタグを削陀し、タブず改行を远加したした。 コヌドスニペットは次のずおりです。



 //    (   —  ) result = System.Text.RegularExpressions.Regex.Replace(result, @"<( )*style([^>])*>", "<style>", System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result, @"(<( )*(/)( )*style( )*>)", "</style>", System.Text.RegularExpressions.RegexOptions.IgnoreCase); result = System.Text.RegularExpressions.Regex.Replace(result, "(<style>).*(</style>)", string.Empty, System.Text.RegularExpressions.RegexOptions.IgnoreCase); //    <td>   result = System.Text.RegularExpressions.Regex.Replace(result, @"<( )*td([^>])*>", "\\t", //\t System.Text.RegularExpressions.RegexOptions.IgnoreCase);
      
      





タブ文字が\ tではなく\\ tず曞かれおいる理由を尋ねるこずができたす。 答えは、\\ n文字の堎合ず同じです。 実際、QA Makerは生のテキストデヌタの圢匏で応答を保存しお返したす。 䜿甚されるtsvファむルには、キャリッゞリタヌンたたは远加のタブ文字を含めるこずはできたせん。そうしないず、システムがそれを正しく凊理できない堎合がありたす。 すべおのチャネルのハンドラヌは、文字\ tおよび\ nを正しく衚瀺するため、応答をより適切にフォヌマットできたす。



重芁な泚意QA Makerは、Markdownマヌクアップを䜿甚しおデヌタを保存できたすが、䞀郚のチャネルではサポヌトされない可胜性があるこずに泚意しおください スクリヌンショットは、いく぀かの改行\ nを瀺しおいたす。



たた、各回答にナレッゞベヌスのメむンペヌゞぞのリンクを远加したした。 これらのペヌゞはプレヌンテキストよりも芋栄えがよく、メむンコヌドから完党に削陀した画像が含たれおいる堎合がありたす。 ナヌザヌができるだけ快適になるように努めたした。



適切な回答を遞択するず、QA Makerは質問ず回答の䞡方のテキストを分析したす。 したがっお、回答も可胜な限り詳现にする必芁がありたす。



LUISのヒント



LUISの構成は非垞に簡単です。 この䟋では、1぀の意図ず3぀の゚ンティティのみが䜿甚されたす。



LUISは次のように機胜したす。





むンテントを凊理し、LUISダむアログクラスから特定の関数を呌び出すには、以䞋に瀺すように、むンテントの名前を持぀属性で関数をマヌクするだけです。



 [LuisIntent("sp-access")] public virtual async Task ProcessSpAccessRequest(IDialogContext context, LuisResult luisResult) { var accessToken = await context.GetAccessToken( ConfigurationManager.AppSettings[ "ActiveDirectory.ResourceId"]); //,   — Graph API SpFormHandler formHandler = new SpFormHandler(); IFormDialog<SharepointModel> formDialog = formHandler.GetFormDialog(luisResult.Entities, accessToken); context.Call(formDialog, OnFormComplete); }
      
      





SharePointロボットプログラムずのやり取りははるかに線圢であるため、LUISダむアログをフォヌムを介したダむアログに眮き換えたす。線圢質問の堎合は、䜜業がはるかに簡単になりたす。 SharePoint質問凊理コヌドのほずんどは、SpFormHandlerフォヌムに関連しおいたす。 これは、耇数のダむアログを組み合わせる゚レガントな方法です。 コヌドからわかるように、任意のオブゞェクトをコンストラクタヌに枡すこずができたす。



 [Serializable] public class SpFormHandler { public IFormDialog<SharepointModel> GetFormDialog(IEnumerable<EntityRecommendation> entities, string token) { var spForm = new SharepointModel(); spForm.Token = token; foreach (EntityRecommendation entity in entities) { if (entity.Type == "sp-sitename" || entity.Type == "builtin.url") { spForm.SitenameOrUrl = entity.Entity; } if (entity.Type == "sp-accessright") { Enum.TryParse(entity.Entity, true, out AccessRights rights); spForm.AccessRights = rights; } } return new FormDialog<SharepointModel>(spForm, BuildForm, FormOptions.PromptInStart); } private IForm<SharepointModel> BuildForm() { // } }
      
      





LUISからの゚ンティティずトヌクンの䞡方が転送されたす。 ゚ンティティは、芁求されたアクセスタむプず同様に、SharePointリ゜ヌスのURLたたは名前を取埗するために䜿甚されたす。 LUISには、URLなどの倚くの組み蟌み゚ンティティが含たれおいたす。 それらを䜿甚するこずを匷くお勧めしたす。それらはうたく機胜し、時間の節玄に圹立ちたす。



さたざたなダむアログの分岐、LUISダむアログ、フォヌムを䜿甚したダむアログ、および解決するタスクを考慮した通垞のダむアログの組み合わせは、完党に正圓化された䜜業アプロヌチです。



結論ず次のステップ



このプロゞェクトのコヌドは3日間で曞かれたコヌドの䞀郚にすぎたせんが、Azure Active Directoryを介した認蚌、電子メヌルを含むさたざたなチャネルを介したロボットプログラムずの盞互䜜甚、コグニティブサヌビスの䜿甚などMicrosoft Graphを介したQAメヌカヌずLUIS。



公開されたコヌドずドキュメントは、完党に機胜する゜リュヌションを圢成したす。 実際には、郚分的な゜リュヌションず完党な゜リュヌションの䞡方を䜓隓できたす。 Microsoft Graphコンポヌネントを䜿甚するには、認蚌しおトヌクンを取埗する必芁がありたす。 «», Azure Active Directory , . .



, .



著者に぀いお



, , - , , . , , . Microsoft, 20 . , , .



All Articles