# OpenAI を使用して自分のナレッジベースチャットボットをデプロイする

## 概要

[AutoFlow](https://github.com/pingcap/autoflow) はTiDBベクトルストアとLlamaIndexで構築された、Graph 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)

### 所要時間

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

### タスク

+ [pingcap/autoflow](https://github.com/pingcap/autoflow) リポジトリを使用してナレッジベースアプリケーションをデプロイします。
+ あなたのナレッジベースアプリケーションを構成します。
+ ナレッジベースの情報を使用してAIチャットボットが質問に答えるかどうか確認するため、ランダムにチャットします。

### 前提条件

+ このハンズオン演習では、独自の OpenAI API キーを持参する必要があります。

> [!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` sourcesにリポジトリを追加します。

   ```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 switch --detach adb5f5483b83c5af98868b8a5f080b3a6f4f4116;
   ```

   ```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: OpenAI サービスを構成する

### 手順 1. アプリケーションにアクセスする

+ ブラウザで [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)

### 手順 2. LLMを構成します

+ <kbd>Models</kbd> をクリックし、次に <kbd>LLMs</kbd> タブをクリックして、<kbd>New LLM</kbd> ボタンをクリックします。
+ 次の情報を入力し、<kbd>Create LLM</kbd> ボタンをクリックします：

  + 名前：my-openai-llm
  + プロバイダー：OpenAI
  + モデル：gpt-4o
  + OpenAI APIキー：${YOUR_OPENAI_API_KEY}
  + デフォルトLLM：はい

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

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

### 手順 3. 埋め込みモデルを構成する

+ <kbd>Models</kbd> をクリックし、その後 <kbd>Embedding Models</kbd> タブをクリックし、<kbd>New Embedding Model</kbd> ボタンをクリックします。
+ 次の情報を入力し、<kbd>Create Embedding Model</kbd> ボタンをクリックします：

  + 名前：my-openai-embedding
  + プロバイダー：OpenAI
  + モデル：text-embedding-3-small
  + OpenAI APIキー：${YOUR_OPENAI_API_KEY}
  + ベクトル次元数：1536

  ![60%](https://lab-static.pingcap.com/quick-demo/setup-embedding-model-start.jpeg)

  ![60%](https://lab-static.pingcap.com/quick-demo/setup-embedding-model-done.png)

### 手順 4. ナレッジベースを作成する

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

  + 名前：tidb overview
  + 説明：tidb overview
  + LLM：my-openai-llm
  + 埋め込みモデル：my-openai-embedding
  + ナレッジグラフインデックス：はい

### 手順 5. データソースを作成する

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

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

  ![60%](https://lab-static.pingcap.com/quick-demo/setup-datasource-start.jpeg)

  ![60%](https://lab-static.pingcap.com/quick-demo/setup-datasource-done.jpeg)

### 手順 6. インデックスの進行状況を確認する

+ <kbd>Index Progress</kbd> タブをクリックして、インデックスの進行状況ページに移動し、インデックスタスクの進行状況を確認します。
+ もう少しで終わりです！ 今、アプリはバックグラウンドタスクを実行して、提供したURLからコンテンツをダウンロードしています。
    + 円の色が青の場合、コンテンツがダウンロード中です。
    + 円の色が緑の場合、コンテンツが正常にダウンロードおよびインポート（インデックス化）されていることを意味し、これでAIチャットボットでのチャットを開始できます。

  ![60%](https://lab-static.pingcap.com/quick-demo/build-index-done.jpeg)

### 手順 7. デフォルトのチャットエンジンを構成する

+ <kbd>Chat Engines</kbd> タブをクリックし、その後 <kbd>default</kbd> チャットエンジンをクリックします。
+ <kbd>Retrieval</kbd> タブをクリックし、先ほど作成したナレッジベースを選択して <kbd>Save</kbd> ボタンをクリックします。

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

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

  ![60%](https://lab-static.pingcap.com/quick-demo/chat-start.jpeg)

  ![60%](https://lab-static.pingcap.com/quick-demo/chat-done.jpeg)

## 結論

この演習では、[https://tidb.ai](https://tidb.ai)のようなナレッジベースチャットボットをデプロイする方法を学びました。自身の知識をナレッジベースにインポートし、チャットボットを使用してナレッジベース内の情報を検索できます。

ただし、この演習環境に保存されるデータが永続的であるという保証がないことをお知らせします。演習セッション終了後にリリースされます。

このAIチャットボットを作業環境で使用したい場合は、自分のサーバーにデプロイできます。必要なことは：

+ [pingcap/autoflow](https://github.com/pingcap/autoflow) でソースコードを取得します。
+ [https://tidbcloud.com](https://tidbcloud.com)でTiDB Cloud Serverless クラスタを取得します。
+ [https://platform.openai.com](https://platform.openai.com)でOpenAI APIキーを取得します。