チャットボットビルダープラットフォームのコーディング、パート1:ダムチャットボットの作成方法

プログラムで「会話」を作成するという課題にどのように取り組んだか。

UnsplashのRock'n Roll Monkeyによる「青いプラスチックロボットグッズ」

先週、ボットビルダーアプリケーションを構築することにしました。目標は、すべてのレベルのユーザーが簡単なチャットボットを構築し、サイトでホストするためのプラットフォームとして機能するアプリを作成することでした(そして、プロジェクトは来週準備が整う予定です)。この2部構成のブログ投稿では、ボットのプラットフォームを構築するためのプロセスといくつかの貴重な情報源について説明します。最初は愚かなもの、次に機能ごと、よりスマートなものです。 (私が愚かなことを書くとき、私は足の不自由や悪いことを意味しません。私のチャットボットはクールですが、彼らは知性からはほど遠いです)

最小の実行可能なチャットボットを構成するものは何ですか?

簡単に言えば、メッセージに対する適切な応答を見つけることは、最終的にフォールバックの回答「わからない」を提供する前に、可能な限り多くのチェックを通過します。私はこの方法でチャットボットを構築することにしました。こうすることで、「ボットが知っているもののこの部分にメッセージが一致するか」というレイヤーを、最低限必要なチャットボットに追加し続けることができます。私の最初の目標は次のとおりです。

  1. ユーザーは、独自のダイアログをスクリプト化できます。ユーザーは、ボットが応答する単語または文章を意味する「トリガー」を追加できます。さまざまな応答の配列を好きなだけ指定できます。ボットが受信したメッセージをトリガーに一致させることができる場合、ボットはランダムな応答を選択します。これにより、各ボットの「スクリプト」が形成されます。
  2. ボットは、一般的なスクリプト(挨拶や一般的な質問への回答など)と、ユーザーがそれらを含めることを選択した場合のフォールバック「わからない」応答を提供できます。
  3. ボットは、既知のトリガーと完全に一致していなくても、ユーザーが何を伝えているのかを理解するのに十分なはずです。

この優れた記事で説明されているように、これらの特性により、ボットは「検索ベース」になります。検索ベースの会話型モデルは、事前定義された応答といくつかのルールのリポジトリを使用して選択するため、実装が簡単です。もう1つのオプションは、独自の応答を生成できるチャットボットを構築することでしたが、そのアプローチははるかに時間がかかり、文法エラーが発生しやすくなりました。カスタム入力を使用してこれらのボットのスクリプトを作成する機会をユーザーに提供する方法は、私には不明確だったでしょう。

ボットビルダーの構築

単純な目標は、実際のインクリメンタルな技術的特徴にうまく変換されました。 Reactで実装したスクリプトプラットフォームは、基本的にはユーザーの選択に応じて増減する動的なフォームです。追加できるトリガーまたは応答の数に制限はありません。スクリプトフェーズでは、ユーザーはボットをテストし、スクリプトに満足したらボットを保存できます。ボットは私のサイトでホストされているため、ボットを編集したり、チャットしたり、リンクを共有してボットとチャットしたりできます。ボットが受信するすべてのメッセージは、Ruby on Railsバックエンドに送信され、そこで一致するプロセスが正しい応答を見つけようとして、フロントエンド(ユーザー)に送信します。

この段階では、アルファベット以外の文字や空白を削除するなど、いくつかの単純な文字列「クリーニング」を既に実装していましたが、ボットは非常に正確な一致以外を理解するのは悲惨でした。彼らは「わからない」とよく言いましたが、これは素晴らしいユーザーエクスペリエンスではありませんでした。単純な人間の対話でさえプログラムで模倣するのがどれほど難しいかという事実を本当に強調しました。

すべてのボットが実装する基本ロジックを選択した後、デフォルトのトリガーと応答のスクリプトを作成するように設定しました。フロントエンドボットスクリプティングプラットフォームでは、ユーザーは挨拶、さようなら、簡単な質問(例:「お元気ですか?」)や実存的な質問(例:「お元気ですか?」)などの小さなデフォルトスクリプトをオプトインできます。この単純な追加の後、ボットは少し愚かになりました。

シンプルなデフォルトスクリプト

勝利のためのファジー文字列マッチング

ダムボットメーカーの最後のステップは、「ファジー文字列マッチング」を実装することでした。そのための素晴らしいルビーの宝石とライブラリがあります。 string1 == string2であるかどうかを比較する代わりに、ファジー文字列一致では2つの文字列間の距離が計算されます。 gemは、Jaro-Winkler距離アルゴリズムを使用して0〜1の値を返し、文字列間の類似性を表します。 1は単語が同じであることを意味し、0はまったく類似していないことを意味します。ボットのデフォルトの一致しきい値を0.8に設定しました。これは、意味のある違いを完全に見逃すことなく、過去のタイプミスや余分なフィラー語を取得したように見えるためです。比較インスタンスの初期化は簡単で(fuzzy_match = FuzzyStringMatch :: JaroWinkler.create(:native))、それを使用していました。

gemの初期化後に「fuzzy-string-match」を使用します。

私の最後の「このメッセージに対する正しい応答を見つける」方法には、これら3つのチェックすべてが含まれます。何らかのユーザーメッセージが複数のトリガーに一致する場合に備えて、応答の優先順位を設定するためのルールを作成しました。この時点で、これらのルールは単にマッチング方法の順序で現れます。

1)ユーザーのスクリプトに一致

2)デフォルトのスクリプト一致

3)前の会話から手がかりを見つける(まだ実装されていない)

3つの基本的な機能により、ボットは非常に適切なレベルになりました。ボットがタイプミスに悩まされず、ユーザーのスクリプトに優先順位を付け、いくつかの一般的なメッセージにデフォルトの回答を提供することを知っていたことを嬉しく思いました。私はボットビルダーにさらに理解を深めるために、基本的で初心者に優しい機械学習の実装を試しました。これについては、このブログ投稿の次の部分で説明します。