# Azure OpenAI を活用して独自のナレッジベースチャットボットを展開する

## 概要

[AutoFlow](https://github.com/pingcap/autoflow) は、TiDB ベクトルストアと LlamaIndex を用いて構築されたグラフRAGベースの会話型ナレッジベースチャットアシスタントです。オープンソースで自由に使用できます。

+ この演習では次のことを学びます：
  + 独自の知識（Word/PDF/TXT/Markdownなど）をナレッジベースにインポートする方法。
  + チャットボットを活用してナレッジベース内の情報を検索する方法。
  + TiDB Cloud Serverlessクラスタに接続し、クエリを実行する方法。このクラスタはベクトルストア兼グラフデータベースとして機能します。
  + 下記リンクのように独自のナレッジベースチャットボットを展開します：[こちら](https://tidb.ai):

  ![70%](https://lab-static.pingcap.com/quick-demo/taa-example-does-tidb-support-fk.jpeg)

### 所要時間

+ この演習は約 60 分程度かかります。

### タスク

+ [pingcap/autoflow](https://github.com/pingcap/autoflow) リポジトリを用いてナレッジベースアプリケーションを展開します。
+ ナレッジベースアプリケーションを構成します。
+ ナレッジベースから情報を用いてAIチャットボットとランダムな会話をしてその回答を確認します。

> [!TIP]
> 演習環境を起動するには、**開始**をクリックしてください。
> 環境の準備が整ったら、下部のツールバーで **次のモジュール** を選択して **モジュール 1** に進みます。
> そして、ステップバイステップの演習ガイドに従って、ハンズオン環境に接続し、タスクを開始してください。

## モジュール 1: ランタイム環境の準備と AutoFlow サービスの初期化

### 手順 1. アプリケーションサーバーの VM にログイン

+ ここをクリック - [ターミナル 1](ssh://monitor1-ssh#1) で、ハンズオン演習用に割り当てられた仮想マシンに接続された新しいターミナルを開きます。

+ ログイン後に表示されるバナーは次のようになります。

  ```output
  ubuntu@ip-10-90-1-154:~$ 
  ```

### 手順 2. Docker、Docker Compose、MySQL クライアントなどの必要なパッケージをインストール

+ 旧バージョンの Docker と Docker Compose をアンインストールします。

   ```bash
   for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
   ```

   ```output
   Reading package lists... Done
   Building dependency tree... Done
   Reading state information... Done
   ...
   Reading state information... Done
   Package 'runc' is not installed, so not removed
   0 upgraded, 0 newly installed, 0 to remove and 30 not upgraded.
   ```

+ Docker 公式の GPG キーを追加します。

   ```bash
   sudo apt-get update -y
   sudo apt-get install ca-certificates curl -y
   sudo install -m 0755 -d /etc/apt/keyrings
   sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
   sudo chmod a+r /etc/apt/keyrings/docker.asc
   ```

   ```output
   Hit:1 http://us-west-2.ec2.archive.ubuntu.com/ubuntu noble InRelease
   Get:2 http://us-west-2.ec2.archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
   ...
   Get:15 http://us-west-2.ec2.archive.ubuntu.com/ubuntu noble-updates/main Translation-en [151 kB]
   Fetched 30.6 MB in 5s (6133 kB/s)               
   Reading package lists... Done
   Reading package lists... Done
   Building dependency tree... Done
   Reading state information... Done
   ca-certificates is already the newest version (20240203).
   ca-certificates set to manually installed.
   curl is already the newest version (8.5.0-2ubuntu10.4).
   curl set to manually installed.
   0 upgraded, 0 newly installed, 0 to remove and 33 not upgraded.
   ```

+ リポジトリを `apt` のソースに追加します。

   ```bash
   echo \
     "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
     $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
     sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
   sudo apt-get update -y
   ```

   ```output
   Reading package lists... Done
   ...                   
   Get:6 https://download.docker.com/linux/ubuntu noble/stable amd64 Packages [15.3 kB]
   Fetched 64.2 kB in 1s (79.9 kB/s)   
   Reading package lists... Done
   ```
  
+ Docker パッケージをインストールします。

   ```bash
   sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
   ```

   ```output
   Reading package lists... Done
   Building dependency tree... Done
   Reading state information... Done
   ...
   No VM guests are running outdated hypervisor (qemu) binaries on this host.
   ```

+ `hello-world` イメージを実行して Docker が正しくインストールされているか確認します。

   ```bash
   sudo docker run hello-world
   ```

   ```output
   Unable to find image 'hello-world:latest' locally
   latest: Pulling from library/hello-world
   c1ec31eb5944: Pull complete 
   Digest: sha256:d211f485f2dd1dee407a80973c8f129f00d54604d2c90732e8e320e5038a0348
   Status: Downloaded newer image for hello-world:latest

   Hello from Docker!
   ...
   To try something more ambitious, you can run an Ubuntu container with:
    $ docker run -it ubuntu bash

   Share images, automate workflows, and more with a free Docker ID:
    https://hub.docker.com/

   For more examples and ideas, visit:
    https://docs.docker.com/get-started/
   ```

+ MySQL クライアントをインストールします。

   ```bash
   sudo apt-get install -y mysql-client-core-8.0
   ```
   ```output
   Reading package lists... Done
   Building dependency tree... Done
   Reading state information... Done
   The following NEW packages will be installed:
     mysql-client-core-8.0
   0 upgraded, 1 newly installed, 0 to remove and 33 not upgraded.
   Need to get 2794 kB of archives.
   After this operation, 61.6 MB of additional disk space will be used.
   Get:1 http://us-west-2.ec2.archive.ubuntu.com/ubuntu noble-updates/main amd64 mysql-client-core-8.0 amd64 8.0.39-0ubuntu0.24.04.2 [2794 kB]
   Fetched 2794 kB in 0s (34.7 MB/s)
   Selecting previously unselected package mysql-client-core-8.0.
   (Reading database ... 68102 files and directories currently installed.)
   Preparing to unpack .../mysql-client-core-8.0_8.0.39-0ubuntu0.24.04.2_amd64.deb ...
   Unpacking mysql-client-core-8.0 (8.0.39-0ubuntu0.24.04.2) ...
   Setting up mysql-client-core-8.0 (8.0.39-0ubuntu0.24.04.2) ...
   Processing triggers for man-db (2.12.0-4build2) ...
   Scanning processes...
   Scanning linux images...

   Running kernel seems to be up-to-date.

   No services need to be restarted.

   No containers need to be restarted.

   No user sessions are running outdated binaries.

   No VM guests are running outdated hypervisor (qemu) binaries on this host.
   ```

### 手順 3. AutoFlow をクローンして構成する

+ pingcap/autoflowリポジトリをクローンし、`autoflow` ディレクトリに移動します。

   ```bash
   git clone https://github.com/pingcap/autoflow;
   cd autoflow;
   git fetch origin v0.4.1;
   git checkout v0.4.1;
   git switch --detach d2300a3a9f43c8d3545d057c2943c9ecbf4b6b8a;
   ```

   ```output
   Cloning into 'autoflow'...
   remote: Enumerating objects: 12041, done.
   remote: Counting objects: 100% (538/538), done.
   remote: Compressing objects: 100% (264/264), done.
   remote: Total 12041 (delta 312), reused 446 (delta 268), pack-reused 11503 (from 1)
   Receiving objects: 100% (12041/12041), 4.33 MiB | 22.07 MiB/s, done.
   Resolving deltas: 100% (7431/7431), done.
   ```

+ 以下の値で `.env` ファイルを更新します：

   ```bash
   cat > .env <<'EOF'
   ENVIRONMENT=production

   SECRET_KEY="some_secret_key_that_is_at_least_32_characters_long"

   TIDB_HOST=serverless_host
   TIDB_PORT=serverless_port
   TIDB_USER='serverless_username'
   TIDB_PASSWORD='serverless_password'
   TIDB_DATABASE=tidbai_test
   TIDB_SSL=true

   EMBEDDING_DIMS=1536
   EMBEDDING_MAX_TOKENS=8191
   EOF
   cat .env
   ```

   ```output
   ENVIRONMENT=production

   SECRET_KEY="some_secret_key_that_is_at_least_32_characters_long"

   TIDB_HOST=serverless_host
   TIDB_PORT=serverless_port
   TIDB_USER='serverless_username'
   TIDB_PASSWORD='serverless_password'
   TIDB_DATABASE=tidbai_test
   TIDB_SSL=true

   EMBEDDING_DIMS=1536
   EMBEDDING_MAX_TOKENS=8191
   ```

### 手順 4. データベースがクリアであることを確認し、次のステップに進む準備をします

+ 次のコマンドを使って TiDB Cloud Serverless クラスタに接続します。

   ```bash
   mysql \
      --comments -u 'serverless_username' -p'serverless_password' \
      -h serverless_host -P serverless_port \
      --ssl-mode=VERIFY_IDENTITY --ssl-ca=/etc/ssl/certs/ca-certificates.crt
   ```
   ```output
   mysql: [Warning] Using a password on the command line interface can be insecure.
   Welcome to the MySQL monitor.  Commands end with ; or \g.
   Your MySQL connection id is 2168969
   Server version: 5.7.28-TiDB-Serverless TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible

   Copyright (c) 2000, 2024, Oracle and/or its affiliates.

   Oracle is a registered trademark of Oracle Corporation and/or its
   affiliates. Other names may be trademarks of their respective
   owners.

   Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

   mysql>
   ```

+ 既存のデータベースを削除し、新しいデータベースを作成します。

   ```bash
   DROP DATABASE IF EXISTS tidbai_test;
   CREATE DATABASE tidbai_test;
   EXIT;
   ```
   ```output
   mysql> DROP DATABASE IF EXISTS tidbai_test;
   Query OK, 0 rows affected (0.00 sec)

   mysql> CREATE DATABASE tidbai_test;
   Query OK, 0 rows affected (0.12 sec)

   mysql> EXIT;
   Bye
   ```

### 手順 5. スキーマを作成

+ データマイグレーションを実行してテーブルスキーマを作成し、初期管理者ユーザーを設定します。<span style="color: Red">出力の赤字の行に生成される管理者パスワードを注意深く確認してください。</span>

   ```bash
   sudo docker compose run backend /bin/sh -c "alembic upgrade head";
   sudo docker compose run backend /bin/sh -c "python bootstrap.py";
   ```

   ```output
   [+] Creating 1/0
   ✔ Container tidb-ai-redis-1  Running                                                                                                                                   0.0s
   INFO  [alembic.runtime.migration] Context impl MySQLImpl.
   INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
   INFO  [alembic.runtime.migration] Running upgrade  -> 2fc10c21bf88, empty message
   INFO  [alembic.runtime.migration] Running upgrade 2fc10c21bf88 -> 94b198e20946, empty message
   INFO  [alembic.runtime.migration] Running upgrade 94b198e20946 -> 04d4f05116ed, empty message
   INFO  [alembic.runtime.migration] Running upgrade 04d4f05116ed -> 197bc8be72d1, empty message
   INFO  [alembic.runtime.migration] Running upgrade 197bc8be72d1 -> ac6e4d58580d, empty message
   INFO  [alembic.runtime.migration] Running upgrade ac6e4d58580d -> a8c79553c9f6, empty message
   INFO  [alembic.runtime.migration] Running upgrade a8c79553c9f6 -> bd17a4ebccc5, empty message
   INFO  [alembic.runtime.migration] Running upgrade bd17a4ebccc5 -> e32f1e546eec, empty message
   INFO  [alembic.runtime.migration] Running upgrade e32f1e546eec -> 04d81be446c3, empty message
   INFO  [alembic.runtime.migration] Running upgrade 04d81be446c3 -> 041fbef26e3a, empty message
   INFO  [alembic.runtime.migration] Running upgrade 041fbef26e3a -> 10f36e8a25c4, empty message
   INFO  [alembic.runtime.migration] Running upgrade 10f36e8a25c4 -> 00534dc350db, empty message
   INFO  [alembic.runtime.migration] Running upgrade 00534dc350db -> eb0b85608c0a, empty message
   INFO  [alembic.runtime.migration] Running upgrade eb0b85608c0a -> dfee070b8abd, empty message
   WARN[0000] Found orphan containers ([tidb-ai-backend-run-d4d35b6b5909]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
   [+] Creating 1/0
   ✔ Container tidb-ai-redis-1  Running                                                                                                                                   0.0s
   Bootstrapping the application...
   /usr/local/lib/python3.11/site-packages/pydantic/_internal/_config.py:341: UserWarning: Valid config keys have changed in V2:
   * 'orm_mode' has been renamed to 'from_attributes'
    warnings.warn(message, UserWarning)
   User 019309f5-2a8f-7e9d-b848-cc81312e598a has registered.

   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   [IMPORTANT] Admin user created with email: admin@example.com and password: <your admin password will be displayed here>
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

   None of PyTorch, TensorFlow >= 2.0, or Flax have been found. Models won't be available and only tokenizers, configuration and file/data utilities can be used.
   Default chat engine created.
   Bootstrapping completed.
   ```

### 手順 6. ナレッジベースアプリケーションを起動するには、次の `docker compose` コマンドを実行します

   ```bash
   sudo docker compose up -d
   ```

   ```output
   [+] Running 43/33
   ✔ backend Pulled                    51.9s
   ✔ background Pulled                 51.9s
   ✔ redis Pulled                       6.5s
   ✔ frontend Pulled                   36.8s

   [+] Running 5/5
   ✔ Network tidb-ai_default         Created              0.3s
   ✔ Container tidb-ai-redis-1       Started             35.0s
   ✔ Container tidb-ai-backend-1     Started              0.7s
   ✔ Container tidb-ai-background-1  Started              0.7s
   ✔ Container tidb-ai-frontend-1    Started              0.9s
   ```

## モジュール 2: Azure OpenAI の構成

+ このモジュールでは、Azure OpenAI Service、埋め込みモデル、および Azure OpenAI Serviceにおける大規模言語モデルの構成を紹介します。
+ 詳細は、以下を参照してください：

  + [Azure OpenAI ドキュメンテーション](https://learn.microsoft.com/en-us/azure/ai-services/openai/reference)
  + [Azure OpenAI サービスリソースを作成してデプロイする](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/create-resource?pivots=web-portal)

### 手順 1. Azure OpenAI サービスを作成

+ 最初のステップでは、Azure OpenAIサービスを作成します。最初に [Azure portal](https://portal.azure.com/#home) にログインします。初めてログインする場合は、以下のページが表示されます。

  ![Azure Empty Portal](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/azure-empty-portal.jpg)

+ <kbd>Azure AI services</kbd> ボタンをクリックします。
+ Azure OpenAI アカウントセクションで <kbd>Create</kbd> ボタンをクリックします。

  ![Azure AI Services](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/azure-ai-services.jpg)

+ 手順に従って、Azure OpenAI サービスを作成します。

> **注記**:
>
> + Azure OpenAI モデルは Azure OpenAI サービスの地域に制限されています。たとえば、`Southeast Asia` 地域で Azure OpenAI サービスを作成した場合、Azure OpenAI モデルは作成できない可能性が高いです。
> + ネットワークセクションで「すべてのネットワーク（インターネットを含む）がこのリソースにアクセスできる。」オプションを選択してください。これにより、Azure OpenAI サービスはインターネットからアクセス可能になります。
> + Azure OpenAI サービスは無料で使用できます。詳しくは [Azure OpenAI 価格](https://azure.microsoft.com/en-us/pricing/details/cognitive-services/) を参照してください。

+ Azure OpenAIサービスが作成された後、以下のページが表示されます。

  ![Azure Created Portal](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/azure-created-portal.jpg)

+ Azure OpenAI サービスを作成したら、Embedding Model をデプロイできます。Azure OpenAI サービスはある種のコンテナのようなものであるため、Embedding Model と Large Language Model を Azure OpenAI サービスにデプロイする必要があります。

### 手順 2. Embedding Model のデプロイ

+ このステップでは、Azure OpenAI サービスに Embedding モデルをデプロイします。他のページ [Azure AI Foundry](https://ai.azure.com/resource/deployments) に移動して、Embedding モデルをデプロイする必要があります。

  ![Azure AI Foundry](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/azure-ai-foundry-deployment.jpg)

+ <kbd>Deploy model</kbd>　をクリックしてから <kbd>Deploy base model</kbd> ボタンをクリックします。
+ `text-embedding-3-small` モデルを選択します。
+ <kbd>Confirm</kbd> ボタンをクリックします。
+ ポップアップウィンドウで <kbd>Deploy</kbd> ボタンをクリックします。

  ![Azure AI Foundry Embedding Model Deployment](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/azure-ai-foundry-embedding-deploy.jpg)

+ おめでとうございます！Azure OpenAI サービスに Embedding モデル をデプロイすることに成功しました。

### 手順 3. Large Language Model のデプロイ

+ このステップでは、Azure OpenAI サービスに Large Language Model をデプロイします。Embedding モデルと同様に `gpt-4o` モデルを Azure AI Foundry にデプロイします。
+ ページ左サイドの <kbd>Deployments</kbd> タブをクリックして **Model deployments** ページに戻ります。
+ <kbd>Deploy model</kbd> をクリックしてから <kbd>Deploy base model</kbd> ボタンをクリックします。
+ `gpt-4o` モデルを選択します。
+ <kbd>Confirm</kbd> ボタンをクリックします。
+ ポップアップウィンドウで <kbd>Deploy</kbd> ボタンをクリックします。
+ おめでとうございます！Azure OpenAI サービスに Large Language Model をデプロイすることに成功しました。

### 手順 4. パラメータを収集する

+ 次に、Azure OpenAI サービス、Embedding モデル、および Large Language Model のパラメータを収集して、後で AutoFlow アプリケーションで使用します。
+ `text-embedding-3-small` モデル をクリックすると、`text-embedding-3-small` モデルページが表示されます。

  ![Azure AI Foundry Parameters Collecting - Embedding Model](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/azure-ai-foundry-embedding-collection.jpg)

+ `gpt-4o` モデル をクリックすると、`gpt-4o` モデルページが表示されます。

  ![Azure AI Foundry Parameters Collecting - Large Language Model](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/azure-ai-foundry-llm-collection.jpg)

+ これで、Azure OpenAI サービス、Embedding モデル、および Large Language Model のパラメータを収集しました。後で AutoFlow アプリケーションでこれらのパラメータを使用します。

  + Azure OpenAI エンドポイント
  + Azure OpenAI API キー
  + Embedding API バージョン
  + LLM API バージョン
  + LLM デプロイメント名

## モジュール 3: ナレッジベースの構成と投入

### 手順 1. LLMを構成

+ ブラウザで [http://monitor1_address:3000](http://monitor1_address:3000) にアクセスし、ナレッジベースアプリケーションを構成します。次のページが表示されます。

+ 初期設定の管理者ユーザー `admin@example.com` と <span style="color: Red">モジュール1, ステップ5</span> で受け取ったパスワードでログインします。

  ![60%](https://lab-static.pingcap.com/quick-demo/taa-app-credentials.jpeg)

+ <kbd>Models</kbd> をクリックしてから <kbd>LLMs</kbd> タブをクリックし、次に <kbd>New LLM</kbd> ボタンをクリックします。
+ 以下の情報を入力し、<kbd>Create LLM</kbd> ボタンをクリックします。<span style="color: Red">モジュール2, ステップ4</span>で収集したパラメータをプレースホルダの代わりに使用してください:

  + 名前: my-azure-openai-llm
  + プロバイダー: Azure OpenAI
  + モデル: gpt-4o
  + Azure OpenAI API キー: ${Azure OpenAI API Key}
  + Is Default LLM: Yes
  + 高度な設定:

    ```json
    {
      "azure_endpoint": "${Azure OpenAI Endpoint}",
      "api_version": "${LLM API Version}",
      "engine": "${LLM Deployment Name}"
    }
    ```

  ![Autoflow LLM Creation](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/autoflow-config-llm.jpg)

### 手順 2. Embedding モデルの構成

+ <kbd>Models</kbd> をクリックしてから <kbd>Embedding Models</kbd> タブをクリックし、次に <kbd>New Embedding Model</kbd> ボタンをクリックします。
+ 以下の情報を入力し、<kbd>Create Embedding Model</kbd> ボタンをクリックします。<span style="color: Red">モジュール2, ステップ4</span>で収集したパラメータをプレースホルダの代わりに使用してください:

  + 名前: my-azure-openai-embedding
  + プロバイダー: Azure OpenAI
  + モデル: text-embedding-3-small
  + Azure OpenAI API キー: ${Azure OpenAI API Key}
  + ベクトル次元: 1536
  + 高度な設定:

    ```json
    {
      "azure_endpoint": "${Azure OpenAI Endpoint}",
      "api_version": "${Embedding API Version}"
    }
    ```

  ![Autoflow Embedding Model Creation](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/autoflow-config-embedding.jpg)

### 手順 3. ナレッジベースの投入

+ <kbd>Knowledge Base</kbd> タブをクリックし、次に <kbd>New Knowledge Base</kbd> ボタンをクリックします。
+ 以下の情報を入力し、<kbd>Create</kbd> ボタンをクリックします:

  + 名前: tidb overview
  + 説明: tidb overview
  + LLM: my-azure-openai-llm
  + Embedding モデル: my-azure-openai-embedding
  + ナレッジグラフインデックス: Yes

  ![Autoflow Knowledge Base Creation](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/autoflow-config-kb.jpg)

### 手順 4. データソースの作成

+ ナレッジベースページで、<kbd>Data Sources</kbd> タブをクリックし、次に <kbd>Web Pages</kbd> ボタンをクリックします。
+ Page URL セクションで <kbd>New Item</kbd> ボタンをクリックし、以下の情報を入力して <kbd>Create</kbd> ボタンをクリックします:

  + Page URL: https://docs.pingcap.com/tidb/stable/overview
  + データソース名: tidb overview

  ![Autoflow Data Source Creation](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/autoflow-config-data-source.jpg)

### 手順 5. インデックスの進捗状況を確認

+ <kbd>Index Progress</kbd> タブをクリックし、インデックス処理状況の進捗ステータスページに移動してインデックスタスクの進捗状況を確認します。

+ 既に終わりに近づいています！アプリはURLからコンテンツをダウンロードするバックグラウンドタスクを実行しています。 
    + サークルの色が青であれば、コンテンツがダウンロードされています。
    + サークルの色が緑であれば、コンテンツがダウンロードされインポート（インデックス化）に成功しました。それにより、AIチャットボットとチャットを始めることができます。

  ![Built Index](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/autoflow-built-index.jpg)

### 手順 6. デフォルトチャットエンジンの設定

+ 現在、ナレッジベース、LLM、およびEmbedding モデルをすでに持っており、チャットエンジンを設定し、AIチャットボットとのチャットを行うことができます。
+ <kbd>Chat Engines</kbd> タブをクリックし、次に <kbd>default</kbd> チャットエンジンをクリックします。
+ <kbd>Retrieval</kbd> タブをクリックし、作成したナレッジベースを選択して <kbd>Save</kbd> ボタンをクリックします。

  ![Autoflow Default Chat Engine Configuration](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/autoflow-chat-engine-config.jpg)

### 手順 7. 作成したチャットボットを使用する

+ ブラウザで [http://monitor1_address:3000](http://monitor1_address:3000) を開くか <kbd>Home</kbd> をクリックして AIチャットボットとのチャットを開始します! 「TiDBとは何ですか？」と尋ねてみてください:

+ 自身のAIチャットボットを楽しんでください！

  ![Autoflow Chat Start](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/autoflow-chat-start.jpg)

  ![Autoflow Chat Done](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/autoflow-chat-done.jpg)

## モジュール 4: 実際のシナリオ

実際のシナリオでは、資料が通常より複雑です。autoflowの顧客からの実際の顧客事例をお見せします。

> **免責事項**:
>
> 以下の質問は autoflow の実際の顧客に基づいていますが、機密情報を削除し認識できないように洗練しました。インポートが必要な資料も自作であり、顧客からの実際の資料では **ありません**。

### 手順 1. 質問の範囲を決定する

これは、ファーストフード業界の顧客からのものであり、従業員が標準業務手順(SOP)、レシピ、食品の保存ガイドライン、その他の知識を確認するためのナレッジベースを構築したいと考えています。

そのため、顧客からの通常の質問には以下のようなものがあります:

+ チップの支払いをお客様にお願いすることはできますか？
+ サーフ＆ターフの作り方は？
+ 生のサーモンフィッシュはいつ廃棄されるべきですか？

### 手順 2. 資料をダウンロード

これらの質問に回答するには、ナレッジベースに資料をインポートする必要があります。これは架空の食品業界の資料リポジトリで、[リリースページ](https://github.com/Icemap/fake-food-industry-material/releases)からローカルマシンにダウンロードできます。

![dataset release page](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/demo-403/dataset-release-page.jpg)

zip ファイルまたは tar.gz ファイルをダウンロードし、ローカル マシンに解凍することができます。

結果は `fake-food-industry-material-<バージョン>` という名前のフォルダーであり、フォルダ構造は以下のようになります:

```output
.
├── recipes
│   ├── chicken_nuggets.md
│   ├── chicken_sandwich.md
│   ├── classic_hamburger.md
│   ├── crispy_fried_chicken.md
│   ├── fish_and_chips.md
│   ├── french_fries.md
│   ├── hot_dogs.md
│   ├── milkshakes.md
│   ├── onion_rings.md
│   ├── pizza.md
│   ├── soft_serve_ice_cream.md
│   └── surf_and_turf.md
├── sop.md
└── storage_guidelines
    ├── bread_products.md
    ├── dry_goods.md
    ├── frozen_foods.md
    └── prepared_foods.md
```

### 手順 3. 資料をナレッジベースにインポートする

+ <kbd>Knowledge Base</kbd> タブをクリックし、次に <kbd>New Knowledge Base</kbd> ボタンをクリックします。
+ 以下の情報を入力し、<kbd>Create</kbd> ボタンをクリックします:

  + 名前: Food Industry Knowledge Base
  + ナレッジグラフインデックス: Yes

  ![food industry knowledge base](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/demo-403/food-industry-kb.jpg)

+ ナレッジベースが作成されたら、<kbd>Data Sources</kbd> タブをクリックし、次に <kbd>Files</kbd> ボタンをクリックします。
+ <kbd>Select files...</kbd> ボタンをクリックし、<span style="color: Red">モジュール4, ステップ2</span>でダウンロードした `fake-food-industry-material-<バージョン>` フォルダーを選択します。

  ![food industry data source](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/demo-403/food-industry-data-source.jpg)

+ データソース名を `Food Industry Data Source` と入力し、<kbd>Create</kbd> ボタンをクリックします。
+ データソースが作成されたら、<kbd>Index Progress</kbd> タブに移動してインデックスの進捗状況を確認します。
+ インデックスの進行が完了するのを待ちます。

  ![food industry index complete](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/demo-403/food-industry-index-complete.jpg)

### 手順 4. Food Industry Knowledge Base を使用してチャットエンジンを作成

+ <kbd>Chat Engines</kbd> タブをクリックし、次に <kbd>New Chat Engine</kbd> ボタンをクリックします。
+ 名前のセクションに `Food Industry Chat Engine` を入力し、<kbd>Retrieval</kbd> タブをクリックし、Knowledge Base セクションで `Food Industry Knowledge Base` を選択し、<kbd>Create Chat Engine</kbd> ボタンをクリックします。

  ![food industry chat engine](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/demo-403/food-industry-chat-engine.jpg)

### 手順 5. チャットボットを利用して質問に回答

+ ホームタブをクリックし、次に <kbd>Select Chat Engine</kbd> ボタンをクリックします。
+ その後、`Food Industry Chat Engine` を選択します。

  ![food industry chat engine select](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/demo-403/food-industry-chat-engine-select.jpg)

+ <span style="color: Red">モジュール 4, 手順 1</span>で挙げた質問を入力し、チャットボットとのチャットを開始します。

+ 質問: Can I ask customers to pay a tip?

  ![food industry conversation 1](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/demo-403/food-industry-conversation-1.jpg)

+ 質問: How to make a Surf and Turf?

  ![food industry conversation 2](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/demo-403/food-industry-conversation-2.jpg)

+ 質問: When should raw salmon fish be discarded?

  ![food industry conversation 3](https://public-pingcap-innovation.s3.us-west-2.amazonaws.com/demo-403/food-industry-conversation-3.jpg)

これで、顧客からの実際の質問に対処することができます。

## 結論

この演習で、[https://tidb.ai](https://tidb.ai) のような独自のナレッジベースチャットボットを展開する方法を学びました。ナレッジベースに独自の知識をインポートし、チャットボットを使用してナレッジベース内の情報を検索し、顧客からの実際の質問に対応できます。

このAIチャットボットを作業環境で使用するには、自分のサーバーに展開する必要があります。

+ [pingcap/autoflow](https://github.com/pingcap/autoflow) でソースコードを取得します。
+ [https://tidbcloud.com](https://tidbcloud.com) で独自の TiDB Cloud Serverless クラスタを取得します。
+ 独自の [Azure OpenAI Service](https://azure.microsoft.com/en-us/products/ai-services) を取得します。