こんにちは 特にチャットボット、および一般的な対話インテリジェンスシステムに対する一般的な関心をきっかけに、しばらくの間、このトピックに関連するプロジェクトに従事していました。 今日は、書かれたライブラリの1つをオープンソースに入れたいと思います。 私はまず開発のアルゴリズム的側面に特化することを留保します。したがって、この問題に関してより知識のある専門家によるコーディングの性質の決定を建設的に批判することを嬉しく思います。
このライブラリは、テキスト要求への応答を返すアルゴリズムとTelegramメッセンジャーAPIの間のインターフェースの構築専用です。 機械学習アルゴリズムの柔軟な適用のために設計されています。
ちなみに、私よりも知識が豊富な専門家は、応答機能への単一のエントリポイントを使用して、さまざまな通信チャネル(インスタントメッセンジャー、Webウィジェットなど)のインターフェースを統合する成功したオプションを提供できます。コメントでそれを議論できてうれしいです。 個人的には、やがて、Flaskで独自に作成されたモジュールを使用し、http-requestsを介してアルゴリズムにアクセスする必要がありました。 各ユーザーインターフェース(Telegram、Facebookなど)と対話するには、通信に関与する別のプログラムを作成し、要求をFlask APIで理解できるように記述された統一形式に変換し、最後に、受信した応答をユーザーインターフェースで理解できる形式に変換し直す必要がありました。 この設計はやや厄介に見えるので、繰り返しますが、このトピックの経験豊富な同僚とコメントでこの問題を議論することを嬉しく思います。
ライブラリの
main_loop_webhooks()
時に外部から呼び出されるメイン関数
main_loop_webhooks()
は、メタモデルを生成する関数[1]、モデルの適用結果に基づいて応答を生成する関数、設定の更新(特定の商品の天気予報や価格の定期的な更新など
main_loop_webhooks()
を受け取ります、特定の形式のリソースのリスト(現在、Telegramに返信を送信し、ボットが機能し、クラッシュしていないことを外部スクリプトに定期的に警告するために使用されます)。
メタモデルの生成と最終的な回答は、メタモデルの設定、検証、テストの利便性を高めると同時に、本質的にメタモデルの出力値をユーザーフレンドリーなものに変換するUX部分の記述とテストの単純さの理由から、2つの異なる関数に分けられますフォーマット。
ライブラリに含まれる関数について簡単に説明します。
main_loop_webhook(generate_model_func, generate_response_func, updates_settings, **kwargs)
ライブラリを使用してスクリプトから呼び出されるメイン関数。 キャッシュファイルをロードし、パラレルストリームでデータを更新する関数を起動し、ポーリングして、Telegramとボットの状態を監視するサービスに応答を送信します。
get_last_message_data(token)
ボットユーザーから最新のメッセージを取得します。
message_to_input(message_data)
受信したメッセージを処理し、さらに処理するのに便利な形式に変換します。
write_message(message, chat_id, token)
Telegramチャットにメッセージを送信する機能。 歴史的な理由から、メッセージキー引数のタイプは、str(単純な単一メッセージの場合)、list(メッセージスレッドの場合)、またはdict(埋め込みキーボードを含むメッセージの場合)になります。
write_log(**kwargs)
ダイアログのログを記録する機能。
to_request(message, chat_id, token, reply_markup)
この関数は、メッセージ、チャット番号、トークン、および応答マークアップ(通常、組み込みキーボードに関する情報を含む)に基づいて、Telegram APIへの要求を生成します。
update_data(updates_settings)
サードパーティのソースからのデータを更新します
update_cash_file(new_data, cash_file_name)
キャッシュファイルの内容を更新します。 次回プログラムを起動するとき(たとえば、クラッシュ後または新しいバージョンをデプロイするとき)に便利です。データサービスは使用できません。
is_update_time(new_datetime, last_update_datetime, updates_settings)
サードパーティAPIからデータを更新するときかどうかを確認します。
update_data_thread_function(updates_settings, cash_file_name)
並列スレッドで実行され、サードパーティのAPIデータを更新する関数。 一部のAPIは数十秒間リクエストに応答でき、その間メインプログラムは一時停止し、ユーザーリクエストに応答しなかったため、マルチスレッドプログラミングの基本を思い出さなければなりませんでした。
このライブラリは主に機械学習アルゴリズムとの相互作用を目的としていますが、その議論はこの記事の範囲をはるかに超えています。 どのように機能するかを示すために、2つの簡単な関数を作成し、それらをサンプルモデルのジェネレーターと出力インタープリターとして使用します。
ライブラリを使用したサンプルスクリプト。
TOKEN = '123456789:abcdefghijklmnopqrstuvwxyzABCDEFGHI'
Telegramでボットを認証するためのトークン。 特定のボット用にBotFatherによって発行されたものに置き換える必要があります。
REGISTER_TOKEN = '12:abcdef'
ボットが実行されていることをスクリプトに警告するトークン。 この関数が不要な場合は、ランダムな文字列に置き換えることができます。
class HelloWorldMetaModel(object)
着信メッセージを処理するためのロジックを担当するクラスの簡単な代替。 いつか複雑なAIが登場しますが、残念ながらまだありません。 少なくともこの記事にはありません。 そして、機械学習アルゴリズムを迅速に記述し、それを本番環境に導入する方法について読みたい場合は、
ここでそれを行うことができ
ます generate_meta_model()
モデルを生成する関数。
generate_response(instance, model, user_id, updating_data)
モデルを適用した結果に基づいて回答を形成するロジックを担当する関数。 この単純な例では、答えはHelloWorldMetaModelクラスのpredict()関数で指定されたユーザーメッセージの考えられる意味の1つに一意に対応しています。
update_datetime()
外部の変化するデータを引き付ける関数の例。
作業の例(写真はクリック可能):

githubのコードは
こちらです。
ビットパックのコードは
こちらです。
TOKEN定数の値を変更した後、単純に
python3 example.py
を
python3 example.py
するには。
用語集(トレーニング済み)機械学習モデルは、固定長の数値の配列(数学者の場合はn次元空間の点)を入力として受け取り、クラス識別子(分類問題を解決する場合)または数値(回帰問題を解決する場合)を返す関数です。
[1]メタモデルは、機械学習モデルの概念を一般化したものです。 任意の性質のオブジェクト(たとえば、画像、文字列、ウェブサイトユーザーの説明などをエンコードする配列)を取り、任意の性質のオブジェクト(通常、クラス識別子、番号、辞書、または文字列)を与えるという点で異なります。 抽象化は、通常、前処理、モデルの適用、および後処理を単一のエンティティに含める機械学習パイプラインをカプセル化するのに役立ちます(著者用語)。