免責事項:このボットは、ボットフレームワークとWit.aiを使用してボットを作成する方法のデモンストレーションであり、チューリングテストに合格するふりをしたり、複雑な会話を維持したりすることさえしません。 したがって、私はコメントでボットの知性をscらないことを提案します。 さらに、このボットの作成は、私たちが異世界のコミュニケーションのさまざまな技術を歓迎し奨励することを意味するものではありません。
Microsoft Bot Frameworkでボットの開発を開始する方法についてはすでに説明しました。 それ以降、Bot Frameworkのバージョンはわずかに更新されましたが、原則は同じままです。 ただし、前回は主要な質問を記事の外に残しました-自然言語で通信できるインテリジェントボットの作成方法。
これを行うには、最初にユーザーフレーズを認識すること、つまり 彼が何を達成したいのか。 ユーザーのこの意図は、彼が自分のフレーズで表現するものであり、 intentと呼ばれます。 LUIS ( Microsoft Cognitive Servicesの一部)やwit.aiなどの特別なツールは、自然言語から意図を分離するために使用されます。 LUISの使用についてはすでに書きましたが、ボットをwit.aiと統合することにしました。
wit.aiを使用します
まず、 wit.aiに登録し、そこでアプリケーションを作成する必要があります。
アプリケーション内では、ダイアログで認識したいすべての意図をリストする必要があります。 インテントは複雑な性質を持つことができ、さまざまなパラメーター(たとえば、「都市の天気を知る」インテントはパラメーターとして場所と日付を持つことができます)などがあります。 ただし、このケースでは、簡単にするために、単純な意図に限定しています。
次に、ボットのロジックを教え、フレーズの例を提供し、特定のフレーズがどの意図に対応するかを示す必要があります。 あなたが例として与えるフレーズが多ければ多いほど、ボットは最終的にあなたのスピーチをより良く理解します。
ボットフレームワークでボットを作成する
ボットを作成するには、次のものが必要です。
- Microsoft Visual Studio 2015 (最新アップデート付き)。
- ボットアプリケーションテンプレート (このファイルをダウンロードして、%USERPROFILE%\ Documents \ Visual Studio 2015 \ Templates \ ProjectTemplates \ Visual C#に解凍せずにコピーする必要があります)。
- ボットフレームワークチャネルエミュレーター 。
次に、Visual Studioで新しいボットを作成します:Visual Studio→ファイル→新規→プロジェクト→テンプレート→Visual C#→ボットアプリケーション。
名前:AdaBot→OK。
作成されたプロジェクトでは、ボットの最も単純なバージョンがすでに実装されており、入力されたフレーズを繰り返してその長さを出力します。 Controllersフォルダーの内容は、ボットのロジックを担当します。
エミュレータで実行して、すべてが正しく機能することを確認します。
- [デバッグ]→[デバッグの開始](または[F5]キー)。その結果、ブラウザーでWebページが開きます。
- ボットフレームワークチャネルエミュレーターを起動します。ボットURLフィールドが空の場合、以前に開いたWebページのアドレスをそこにコピーし、「api / messages」を追加します。
- テキストを入力して、ボットに送信します。
- 応答として、送信されたフレーズの繰り返しと、それが含まれる文字数を取得します。
ボットを書くには、答えの形成を担当するいくつかの行を変更するだけです。
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
では、行がこれを担当します。
// calculate something for us to return int length = (activity.Text ?? string.Empty).Length;
代わりに、ユーザーの意図を認識し、それに応じてこの意図に対応するメッセージオプションのいずれかを選択する必要があります。
回答オプションを設定するには、次のコンテンツの
Responses.xml
ファイルをアプリケーションに追加します。
<Responses> <Response intent="greeting"> <Text>, !</Text> <Text> !</Text> <Text> .</Text> <Text> .</Text> <Text> !</Text> <Text> !</Text> <Text> !</Text> <Text> . .</Text> <Text> ?</Text> <Text> ?</Text> <Text>! !</Text> <Text> ?</Text> </Response> ... </Responses>
そのため、各インテントにいくつかの回答オプションを設定する必要があります。そうすれば、ボットはさまざまな喜びを味わえます。
プロジェクトでwit.ai APIを使用するには、対応するnuget Wit.ai.netパッケージをそれに接続します。 ソリューションエクスプローラーで、AdaBot-> NuGetパッケージの管理->参照タブのコンテキストメニューを呼び出します。
次に、ボットのロジックを実装する必要があります。 プロジェクトファイルMessagesController.csで 、名前空間を接続します。
using com.valgut.libs.bots.Wit; using System.Text; using System.Xml.Linq;
インテントを検索するには、次のコードを使用します。
var wit = new WitClient("YOUR WIT SERVER ACCESS TOKEN"); var msg = wit.Converse(activity.From.Id, activity.Text); var intent = string.Empty; double conf = 0; try { var a = msg.entities["intent"]; if (a != null) { foreach (var z in msg.entities["intent"]) { if (z.confidence > conf) { conf = z.confidence; intent = z.value.ToString(); } } } } catch (System.Collections.Generic.KeyNotFoundException exc) { }
wit.aiがいくつかの考えられる意図とその信頼性の程度を私たちに返すことがわかります。そのため、それらすべてを整理し、最も可能性の高いものを選択します。 ところで、インテントがまったくない場合、インテント変数に空の文字列が残り、XMLファイルの空のインテントに対応する回答が選択されます。
次に、見つかった意図に対応する可能な回答の1つを選択するだけです。 これを行うには、LINQを使用します。
string res = " ..."; var doc = XDocument.Load(System.Web.HttpContext.Current.Request.MapPath("~/Responses.xml")); var r = (from x in doc.Descendants("Response") where x.Attribute("intent").Value == intent select x).FirstOrDefault(); if (r!=null) { var arr = (from x in r.Descendants("Text") select x.Value).ToArray(); if (arr!=null && arr.Length>0) { var rnd = new Random(); res = arr[rnd.Next(0, arr.Length)]; } }
これで、新しいメッセージを受信したボットは、その中の文字数をカウントするのではなく、意図の分類と回答の選択に従事します。 着信メッセージに選択した回答を提供するために、次の行を置き換えます。
// return our reply to the user Activity reply = activity.CreateReply($"You sent {activity.Text} which was {length} characters");
に
Activity reply = activity.CreateReply(res);
これでボットは会話できます! もちろん、以前に多数のフレーズを認識するように彼を訓練し、多くの回答を求めた場合。
ただし、さまざまなフレーズやwit.aiのトレーニングサンプルなしでサンプルコードを見つけることができます。 ノウハウをそのままにしてください。
ハロウィーンの前夜にAda Lovelaceボット自体と話したい場合は、電報で@Ada_Lovelace_Botを使用します。
楽しい休日を!