会話型 AI が簡単に: RasaとDockerを使用してML FAQモデルのデモをゼロから開発する

今日のペースの速いデジタル時代において、会話型AIチャットボットは、効率的でパーソナライズされたユーザーインタラクションを提供するゲームチェンジャーとして浮上しています。 これらの人工知能仮想アシスタントは、人間の会話を模倣するように設計されており、クエリに対する迅速で適切な応答をユーザーに提供します。

成功するチャットボットを構築するための重要な側面は、よくある質問(FAQ)をシームレスに処理できることです。 FAQは、カスタマーサポート、eコマース、情報検索など、さまざまなドメインでのユーザークエリの重要な部分を形成します。 一般的な質問に正確かつ迅速に回答できることで、ユーザーの満足度が向上するだけでなく、人間のエージェントがより複雑なタスクに集中できるようになります。 

この記事では、オープンソース のRasa フレームワークとDockerを使用して、コンテナ化された会話型AIチャットボットを構築およびデプロイする方法について説明します。

濃い紫色の背景にドッカーとラサのロゴ

ラサに会う 

FAQ処理の課題に取り組むために、開発者はオープンソースの会話型AIフレームワークであるRasaなどの高度なテクノロジーに目を向けています。 Rasa は、開発者が自然言語理解(NLU)機能を備えたインテリジェントなチャットボットを作成できるようにする包括的なツールとライブラリのセットを提供します。 Rasaを使用すると、ユーザーの意図を理解し、関連情報を抽出し、会話フローに基づいてコンテキストに応じた応答を提供するチャットボットを構築できます。

Rasa を使用すると、開発者は会話型AIチャットボットを構築および展開でき、柔軟なアーキテクチャと強力なNLU機能を提供します(図1)。

rasa SDK、ダイアログポリシー、nluパイプライン、エージェント、入出力チャネルなどの接続を示すrasaアーキテクチャの図。
図1: ラサの概要。

Rasaは、いくつかの理由から、チャットボットや仮想アシスタントなどの会話型AIアプリケーションを構築するための人気のある選択肢です。 たとえば、Rasaはオープンソースフレームワークであり、開発者が自由に使用、変更、および貢献できることを意味します。 柔軟でカスタマイズ可能なアーキテクチャを提供し、開発者がチャットボットの動作と機能を完全に制御できるようにします。 

RasaのNLU機能を使用すると、ユーザーメッセージからインテントとエンティティ情報を抽出できるため、チャットボットは適切に理解して対応できます。 Rasaは、正確で文脈を意識した言語理解のために、さまざまな言語モデルと機械学習(ML)アルゴリズムをサポートしています。 

RasaにはML技術も組み込まれており、時間の経過とともにチャットボットのパフォーマンスをトレーニングおよび改善します。 独自のトレーニング データを使用してモデルをトレーニングし、反復的なフィードバック ループを通じてモデルを改良することで、各対話でより正確かつ効果的なチャットボットを実現できます。 

さらに、Rasaは大量の会話を処理するように拡張でき、カスタムアクション、API、および外部サービスで拡張できます。 この機能により、データベースアクセス、外部API呼び出し、ビジネスロジックなどの追加機能をチャットボットに統合できます。

Rasaのコンテナ化が重要な理由

Rasaをコンテナ化することで、会話型AIチャットボットの開発と展開のプロセスにいくつかの重要なメリットがもたらされます。 Rasaのコンテナ化が重要である4つの主な理由は次のとおりです。

1. Dockerは、アプリケーションを実行するための一貫性のある移植可能な環境を提供します。

Rasaをコンテナ化することで、チャットボットアプリケーション、その依存関係、ランタイム環境を自己完結型のユニットにパッケージ化できます。 このアプローチにより、コンテナ化されたRasaチャットボットを開発マシン、ステージングサーバー、本番クラスターなどのさまざまな環境にデプロイでき、構成や互換性の問題を最小限に抑えることができます。 

Dockerは、Rasaチャットボットの依存関係の管理を簡素化します。 必要なすべてのライブラリ、パッケージ、および構成をコンテナー内にカプセル化することで、他のシステム依存関係との競合を回避し、チャットボットが必要な特定のバージョンのライブラリにアクセスできるようにすることができます。 このコンテナ化により、異なるシステムへの依存関係を手動でインストールおよび構成する必要がなくなり、デプロイプロセスがより合理化され、信頼性が高くなります。

2. Dockerは、Rasaチャットボットの環境の再現性を保証します。

コンテナ内の正確な依存関係、ライブラリ、構成を定義することで、チャットボットが異なるデプロイ間で一貫して実行されることを保証できます。 

3. Dockerは、Rasaチャットボットのシームレスなスケーラビリティを可能にします。

コンテナを使用すると、チャットボットのインスタンスを複数のノードまたはサーバーに簡単に複製および分散できるため、大量のユーザーインタラクションを処理できます。 

4. Dockerは、チャットボットとホストシステム間、および同じホスト上で実行されている異なるコンテナ間の分離を提供します。

この分離により、チャットボットの依存関係とランタイム環境がホストシステムや他のアプリケーションに干渉することがなくなります。 また、依存関係とバージョン管理を簡単に管理できるため、競合を防ぎ、チャットボットが動作できるクリーンで分離された環境を確保できます。

ML FAQ モデルのデモ アプリケーションの構築

RasaとDockerのパワーを組み合わせることで、開発者はよくある質問の処理に優れたML FAQモデルのデモを作成できます。 デモは、一般的なクエリとそれに対応する回答のデータセットでトレーニングできるため、チャットボットは同様の質問を高精度で理解して応答できます。

このチュートリアルでは、Rasa と Docker を使用して ML FAQ モデルのデモを構築する方法を学習します。 モデルをトレーニングするための開発環境を設定し、Docker を使用してモデルをデプロイします。 また、WebChat UIフロントエンドを統合してユーザーとの対話を容易にする方法についても説明します。 飛び込みましょう。

はじめ

このチュートリアルを完了するには、次の主要コンポーネントが不可欠です。

ローカルフォルダ、アプリフォルダ、プレインストールされたrasa依存関係などの間の接続を示す図。
図2: Rasaの依存関係とボリュームマウントポイントがプリインストールされたDockerコンテナ。

ML FAQ デモ アプリのデプロイは、次の手順を含む簡単なプロセスです。

  • リポジトリをクローンします。 
  • 構成ファイルをセットアップします。 
  • ラサを初期化します。
  • モデルをトレーニングして実行します。 
  • ウェブチャット UI アプリを起動します。 

これらの各手順について、以下で説明します。

プロジェクトのクローン作成

開始するには、次のコマンドを実行してリポジトリのクローンを作成できます。

https://github.com/dockersamples/docker-ml-faq-rasa
docker-ml-faq-rasa % tree -L 2
.
├── Dockerfile-webchat
├── README.md
├── actions
│   ├── __init__.py
│   ├── __pycache__
│   └── actions.py
├── config.yml
├── credentials.yml
├── data
│   ├── nlu.yml
│   ├── rules.yml
│   └── stories.yml
├── docker-compose.yaml
├── domain.yml
├── endpoints.yml
├── index.html
├── models
│   ├── 20230618-194810-chill-idea.tar.gz
│   └── 20230619-082740-upbeat-step.tar.gz
└── tests
    └── test_stories.yml

6 directories, 16 files

次のステップに進む前に、各ファイルを1つずつ見ていきましょう。

ファイル: domain.yml

このファイルは、チャットボットのドメインを記述し、インテント、エンティティ、アクション、回答などの重要なデータを含みます。 ユーザーの入力を含む会話の構造と、ボットの応答のテンプレートの概要を示します。

version: "3.1"

intents:
  - greet
  - goodbye
  - affirm
  - deny
  - mood_great
  - mood_unhappy
  - bot_challenge

responses:
  utter_greet:
  - text: "Hey! How are you?"

  utter_cheer_up:
  - text: "Here is something to cheer you up:"
    image: "https://i.imgur.com/nGF1K8f.jpg"

  utter_did_that_help:
  - text: "Did that help you?"

  utter_happy:
  - text: "Great, carry on!"

  utter_goodbye:
  - text: "Bye"

  utter_iamabot:
  - text: "I am a bot, powered by Rasa."

session_config:
  session_expiration_time: 60
  carry_over_slots_to_new_session: true

前に示したように、この構成ファイルには、ボットが理解できるさまざまな種類のユーザー入力を表すインテントが含まれています。 また、さまざまな状況に対するボットの事前定義されたメッセージである応答も含まれます。 たとえば、ボットはユーザーに挨拶したり、元気づける画像を提供したり、前の応答が役に立ったかどうかを尋ねたり、幸せを表現したり、さよならを言ったり、Rasaを搭載したボットであることを言及したりできます。

セッション構成では、セッションの有効期限 (この場合は 60 秒) を設定し、ボットが前のセッションから新しいセッションにスロット (データ) を引き継ぐかどうかを指定します。

ファイル: nlu.yml

NLU トレーニング データは、このファイルで定義されます。 これには、入力サンプルと、それらに伴う意図とエンティティが含まれます。 ユーザー入力を適切なアクションに結び付ける NLU モデルは、このデータを使用してトレーニングされます。

version: "3.1"

nlu:
- intent: greet
  examples: |
    - hey
    - hello
    - hi
    - hello there
    - good morning
    - good evening
    - moin
    - hey there
    - let's go
    - hey dude
    - goodmorning
    - goodevening
    - good afternoon

- intent: goodbye
  examples: |
    - cu
    - good by
    - cee you later
    - good night
    - bye
    - goodbye
    - have a nice day
    - see you around
    - bye bye
    - see you later

- intent: affirm
  examples: |
    - yes
    - y
    - indeed
    - of course
    - that sounds good
    - correct

- intent: deny
  examples: |
    - no
    - n
    - never
    - I don't think so
    - don't like that
    - no way
    - not really

- intent: mood_great
  examples: |
    - perfect
    - great
    - amazing
    - feeling like a king
    - wonderful
    - I am feeling very good
    - I am great
    - I am amazing
    - I am going to save the world
    - super stoked
    - extremely good
    - so so perfect
    - so good
    - so perfect

- intent: mood_unhappy
  examples: |
    - my day was horrible
    - I am sad
    - I don't feel very well
    - I am disappointed
    - super sad
    - I'm so sad
    - sad
    - very sad
    - unhappy
    - not good
    - not very good
    - extremly sad
    - so saad
    - so sad

- intent: bot_challenge
  examples: |
    - are you a bot?
    - are you a human?
    - am I talking to a bot?
    - am I talking to a human?

この設定ファイルは、チャットボットが認識できるさまざまなタイプのユーザー入力を表すいくつかのインテントを定義します。 各インテントには、ユーザーがその特定のインテントを表現するために入力または発声する可能性のあるサンプルフレーズまたは文の例のリストがあります。

この構成をカスタマイズして拡張するには、チャットボットのドメインとユースケースに関連するインテントと例を追加します。

ファイル: stories.yml

このファイルは、ユーザーとチャットボットの相互作用の例として役立つトレーニングストーリーを定義するために使用されます。 一連のユーザー入力、ボットの回答、および付随する意図とエンティティが各ストーリーを構成します。

version: "3.1"

stories:

- story: happy path
  steps:
  - intent: greet
  - action: utter_greet
  - intent: mood_great
  - action: utter_happy

- story: sad path 1
  steps:
  - intent: greet
  - action: utter_greet
  - intent: mood_unhappy
  - action: utter_cheer_up
  - action: utter_did_that_help
  - intent: affirm
  - action: utter_happy

- story: sad path 2
  steps:
  - intent: greet
  - action: utter_greet
  - intent: mood_unhappy
  - action: utter_cheer_up
  - action: utter_did_that_help
  - intent: deny
  - action: utter_goodbye

stories.yml 提供したファイルには、Rasaチャットボットのトレーニングストーリーがいくつか含まれています。これらのストーリーは、ユーザーとチャットボットの間のさまざまな会話パスを表します。 各ストーリーは一連のステップで構成され、各ステップはインテントまたはアクションに対応します。

ファイル内のトレーニング ストーリーの手順の内訳を次に示します。

ストーリー:ハッピーパス

  • ユーザーが意図を持って挨拶する: greet
  • ボットはアクションで応答します: utter_greet
  • ユーザーは意図を持って前向きな気分を表現します:mood_great
  • ボットはアクションで前向きな気分を認めます:utter_happy

ストーリー:悲しい道1

  • ユーザーが意図を持って挨拶する: greet
  • ボットはアクションで応答します: utter_greet
  • ユーザーは意図を持って不幸な気分を表現します:mood_unhappy
  • ボットは、次のアクションでユーザーを元気づけようとします。 utter_cheer_up
  • ボットは、前の応答がアクションに役立ったかどうかを尋ねます。 utter_did_that_help
  • ユーザーは、それが意図に役立ったことを確認します:肯定します
  • ボットはアクションで確認を確認します: utter_happy

ストーリー:悲しい道2

  • ユーザーが意図を持って挨拶する: greet
  • ボットはアクションで応答します: utter_greet
  • ユーザーは意図を持って不幸な気分を表現します:mood_unhappy
  • ボットは、次のアクションでユーザーを元気づけようとします。 utter_cheer_up
  • ボットは、前の応答がアクションに役立ったかどうかを尋ねます。 utter_did_that_help
  • ユーザーは、それが意図に役立ったことを否定します:拒否
  • ボットはアクションで別れを告げます:utter_goodbye

これらのトレーニングストーリーは、さまざまな会話パスでRasaチャットボットをトレーニングし、ユーザーの意図に基づいてユーザー入力に適切に応答する方法を教えるために使用されます。

ファイル: config.yml

Rasaプロジェクトの設定パラメータは、このファイルに含まれています。

# The config recipe.
# https://rasa.com/docs/rasa/model-configuration/
recipe: default.v1

# The assistant project unique identifier
# This default value must be replaced with a unique assistant name within your deployment
assistant_id: placeholder_default

# Configuration for Rasa NLU.
# https://rasa.com/docs/rasa/nlu/components/
language: en

pipeline:
# # No configuration for the NLU pipeline was provided. The following default pipeline was used to train your model.
# # If you'd like to customize it, uncomment and adjust the pipeline.
# # See https://rasa.com/docs/rasa/tuning-your-model for more information.
#   - name: WhitespaceTokenizer
#   - name: RegexFeaturizer
#   - name: LexicalSyntacticFeaturizer
#   - name: CountVectorsFeaturizer
#   - name: CountVectorsFeaturizer
#     analyzer: char_wb
#     min_ngram: 1
#     max_ngram: 4
#   - name: DIETClassifier
#     epochs: 100
#     constrain_similarities: true
#   - name: EntitySynonymMapper
#   - name: ResponseSelector
#     epochs: 100
#     constrain_similarities: true
#   - name: FallbackClassifier
#     threshold: 0.3
#     ambiguity_threshold: 0.1

# Configuration for Rasa Core.
# https://rasa.com/docs/rasa/core/policies/
policies:
# # No configuration for policies was provided. The following default policies were used to train your model.
# # If you'd like to customize them, uncomment and adjust the policies.
# # See https://rasa.com/docs/rasa/policies for more information.
#   - name: MemoizationPolicy
#   - name: RulePolicy
#   - name: UnexpecTEDIntentPolicy
#     max_history: 5
#     epochs: 100
#   - name: TEDPolicy
#     max_history: 5
#     epochs: 100
#     constrain_similarities: true

Rasaプロジェクトの設定パラメータは、このファイルに含まれています。 構成ファイルの内訳は次のとおりです。

1. アシスタント ID:

  • Assistant_id:placeholder_default
  • このプレースホルダー値は、アシスタントの一意の識別子に置き換える必要があります。

2. ラサNLU構成:

  • 言語: ja
    • 自然言語の理解に使用する言語を指定します。
  • パイプライン:
    • NLU 処理に使用されるコンポーネントのパイプラインを定義します。
    • パイプラインは現在コメント アウトされており、既定のパイプラインが使用されます。
    • 既定のパイプラインには、トークナイザー、特徴抽出器、分類子、応答セレクターなどのさまざまなコンポーネントが含まれています。
    • パイプラインをカスタマイズする場合は、行のコメントを解除し、パイプライン構成を調整できます。

3. ラサコア構成:

  • 檄:
    • ダイアログ管理に使用するポリシーを指定します。
    • ポリシーは現在コメント アウトされており、既定のポリシーが使用されます。
    • デフォルトのポリシーには、メモ化ポリシー、ルールベースポリシー、および TED (トランスフォーマー埋め込みダイアログ) ポリシーが含まれます
    • ポリシーをカスタマイズする場合は、行のコメントを解除し、ポリシー構成を調整できます。

ファイル: actions.py

チャットボットが実行できるカスタムアクションは、このファイルに含まれています。 API からのデータの取得、データベースとの通信、またはその他の固有のビジネス ロジックの実行はすべて、アクションの例です。

# This files contains your custom actions which can be used to run
# custom Python code.
#
# See this guide on how to implement these action:
# https://rasa.com/docs/rasa/custom-actions


# This is a simple example for a custom action which utters "Hello World!"

# from typing import Any, Text, Dict, List
#
# from rasa_sdk import Action, Tracker
# from rasa_sdk.executor import CollectingDispatcher
#
#
# class ActionHelloWorld(Action):
#
#     def name(self) -> Text:
#         return "action_hello_world"
#
#     def run(self, dispatcher: CollectingDispatcher,
#             tracker: Tracker,
#             domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
#
#         dispatcher.utter_message(text="Hello World!")
#
#         return []

コードの説明:

  • このクラスは ActionHelloWorld 、rasa_sdkによって提供される Action クラスを拡張します。
  • name メソッドは、カスタム動作の名前 (この場合は "action_hello_world") を定義します。
  • このメソッドは run 、カスタム アクションのロジックが実装される場所です。
  • run メソッド内では、 dispatcher オブジェクトを使用してユーザーにメッセージを送り返します。 この例では、送信されるメッセージは "Hello World!" です。
  • このステートメントは return [] 、カスタム アクションの実行が完了したことを示します。

ファイル: endpoints.yml

チャットボットのエンドポイントは、外部サービスやカスタムアクションの Webhook URL など、このファイルで指定されます。  

ラサの初期化

このコマンドは、現在のディレクトリ($(pwd))にある新しいRasaプロジェクトを初期化します。

docker run  -p 5005:5005 -v $(pwd):/app rasa/rasa:3.5.2 init --no-prompt

基本的なディレクトリ構造を設定し、次のようなRasaプロジェクトに不可欠なファイルを作成します。 config.ymldomain.yml, と data/nlu.yml。 このフラグは -p 、コンテナ内のポート5005をホスト上の同じポートにマッピングし、Rasaサーバーにアクセスできるようにします。 <IMAGE>:3.5.2 は、使用する特定のバージョンの Rasa の Docker イメージを指します。

モデルのトレーニング

次のコマンドは、プロジェクトディレクトリで指定されたデータと設定を使用して Rasa モデルをトレーニングします。

docker run -v $(pwd):/app rasa/rasa:3.5.2 train --domain domain.yml --data data --out models

このフラグは -v 、コンテナー内の現在のディレクトリ ($(pwd)) をマウントし、プロジェクト ファイルへのアクセスを許可します。 このフラグは --domain domain.yml 、ドメイン構成ファイルを指定し、トレーニング データを含むディレクトリを指し、 --data data --out models トレーニング済みモデルを保存する出力ディレクトリを指定します。

モデルの実行

このコマンドは、トレーニング済みのRasaモデルをインタラクティブモードで実行し、チャットボットの応答をテストできるようにします。

docker run -v $(pwd):/app rasa/rasa:3.5.2 shell

このコマンドは、現在のプロジェクトディレクトリ()のmodelsディレクトリからトレーニング済みモデルをロードします。$(pwd)チャットボットはターミナルからアクセスできるため、インタラクティブな会話をしたり、モデルの応答を確認したりできます。

Rasaが実行されていることを確認します。

curl localhost:5005
Hello from Rasa: 3.5.2

これで、メッセージを送信し、curl を使用してモデルをテストできます。

curl --location 'http://localhost:5005/webhooks/rest/webhook' \
--header 'Content-Type: application/json' \
--data '{
 "sender": "Test person",
 "message": "how are you ?"}'

ウェブチャットの実行

次のコマンドは、トレーニング済みの Rasa モデルを WebChat UI からアクセスできるサーバーとしてデプロイします。

docker run -p 5005:5005 -v $(pwd):/app rasa/rasa:3.5.2 run -m models --enable-api --cors "*" --debug

このフラグは -p 、コンテナ内のポート5005をホスト上の同じポートにマッピングし、Rasaサーバーにアクセスできるようにします。 models フラグは -m 、トレーニング済みのモデルを含むディレクトリを指定します。 このフラグは --enable-api Rasa APIを有効にし、外部アプリケーションがチャットボットと対話できるようにします。 このフラグを使用すると --cors "*" 、クロスオリジンリソース共有 (CORS) で異なるドメインからの要求を処理できます。 このフラグは --debug 、拡張ロギングとトラブルシューティングのためのデバッグモードを有効にします。

docker run -p 8080:80 harshmanvar/docker-ml-faq-rasa:webchat

ブラウザで開きます http://localhost:8080 (図3)。

ブラウザーでのチャットボットの会話のサンプルのスクリーンショット。
図3: ウェブチャットUI。

作成ファイルを使用したサービスの定義

Docker 作成 ファイル内でサービスがどのように表示されるかを次に示します。

services:
  rasa:
    image: rasa/rasa:3.5.2
    ports:
      - 5005:5005
    volumes:
      - ./:/app
    command: run -m models --enable-api --cors "*" --debug
  Webchat:
    image: harshmanvar/docker-ml-faq-rasa:webchat 
    build:
      context: .
      dockerfile: Dockerfile-webchat
    ports:
      - 8080:80

サンプル アプリケーションには、次の部分があります。

  • rasaサービスは画像に基づいています rasa/rasa:3.5.2 。 
  • これは、Rasa API との通信を公開します port 5005 。 
  • 現在のディレクトリ(./)はコンテナ内のボリュームとしてマウントされ、Rasaプロジェクトファイルにアクセスできます。 
  • このコマンドは run -m models --enable-api --cors "*" --debug 、指定されたオプションでRasaサーバーを起動します。
  • Webチャットサービスは画像に基づいています harshmanvar/docker-ml-faq-rasa:webchat 。 現在のコンテキスト (.) にある Dockerfile-webchat ファイルを使用してイメージをビルドします。 Port 8080 ホストでは、Webチャットインターフェイスにアクセスするためにコンテナ内のポート80にマップされます。

リポジトリを複製するか、 docker-compose.yml GitHub から直接ファイルをダウンロードできます。

コンテナサービスの起動

WebChat アプリケーションを起動するには、次のコマンドを実行します。

docker compose up -d --build

次に、コマンドを使用して、 docker compose ps スタックが正しく実行されていることを確認します。 端末は以下の出力を生成します。

docker compose ps
NAME                            IMAGE                                  COMMAND                  SERVICE             CREATED             STATUS              PORTS
docker-ml-faq-rassa-rasa-1      harshmanvar/docker-ml-faq-rasa:3.5.2   "rasa run -m models …"   rasa                6 seconds ago       Up 5 seconds        0.0.0.0:5005->5005/tcp
docker-ml-faq-rassa-webchat-1   docker-ml-faq-rassa-webchat            "/docker-entrypoint.…"   webchat             6 seconds ago       Up 5 seconds        0.0.0.0:8080->80/tcp

Docker ダッシュボードを使用したコンテナーの表示

また、Docker ダッシュボードを利用してコンテナーの ID を表示し、アプリケーションに簡単にアクセスまたは管理することもできます (図 4)。

Docker ダッシュボードで実行中のコンテナーを示すスクリーンショット。
図4: Docker ダッシュボードでコンテナーを表示します。

結論

万丈!Docker を使用して Rasa アプリケーションをコンテナ化する方法を学習しました。 1 つの YAML ファイルで、Docker Compose を使用して ML FAQ デモ モデル アプリを数秒ですばやくビルドしてデプロイする方法を示しました。 いくつかの追加手順を実行するだけで、このチュートリアルを適用しながら、さらに複雑なアプリケーションを構築できます。 幸せな開発。

DockerHub で Rasa をチェックしてください。