Google Cloud × GPTsでお手軽RAGチャットボットを作ろう！

## 概要
GPT Actionsを使えば簡単にRAGチャットボットを作れるかもしれない！と友人が教えてくれたので、個人的に最推しな検索システムVertex AI Agent Builderを使ってRAGチャットボットを作ってみました。
GoogleアカウントとChatGPTのアカウントがあれば、簡単に作れます。

友人が教えてくれた技術記事：[RAGで独自知識を回答~GPTs Actionsで簡単チャットbot開発](https://zenn.dev/knkmt/articles/29fedd0c9f7f68)

## GPTs作成手順
### 1. 検索システムの準備
参考：[Vertex AI Search の検索ウィジェットを埋め込んだ Web アプリを構築してみた](https://zenn.dev/cloud_ace/articles/a6e4095e780f38)

#### 1-1. 検索システムに投入するドキュメントを用意します
PDFやOffice形式(WordやPowerPoint)、TXTファイル、JSONLファイルなど。
参考：[アプリとデータストアについて | Vertex AI Agent Builder | Google Cloud](https://cloud.google.com/generative-ai-app-builder/docs/create-datastore-ingest?hl=en#documents)
今回、私は以下のような料理のレシピを格納したJSONLファイルを用いました。
```json
{
  "title": "レシピ名",
  "ingredients": [
    { "name": "材料名1", "amount": "量" },
    { "name": "材料名2", "amount": "量"},
    // 中略
    { "name": "材料名X", "amount": "量" }
  ],
  "steps": [
    "1. 手順1",
    "1. 手順2",
    // 中略
    "1. 手順X",
  ],
  "cooking_time": "20分",
  "description": "レシピの説明"
}
{
  "title": "レシピ名",
  "ingredients": [
    { "name": "材料名1", "amount": "量" },
    { "name": "材料名2", "amount": "量"},
    // 中略
    { "name": "材料名X", "amount": "量" }
  ],
  "steps": [
    "1. 手順1",
    "1. 手順2",
    // 中略
    "1. 手順X",
  ],
  "cooking_time": "20分",
  "description": "レシピの説明"
}
// 以下省略

```

#### 1-2. Google Cloud Storage(GCS)にファイルをアップロードします
GCS上に適当なバケットを作成し、1.のファイルをアップロードします
![GCS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/2f48df35-8eeb-a629-fe30-ce981d9dfaac.png)


#### 1-3. Vertex AI Agent BuilderのWebコンソール画面から検索アプリを作成します
1. 「アプリを作成する」→「検索」を選択します
2. 構成の設定は以下の通りです
    - 内容：汎用
    - Enterpriseエディションの機能：OFF
    - 高度なLLM機能：OFF
    - アプリ名：適当
    - 会社または組織名：適当(「test」等でOK)
    - アプリのロケーション：global(グローバル)
3. 「データストアを作成」→Cloud Storageを「SELECT」します
4. 設定項目は以下の通りです
    - 1-1.のファイルが
        - PDFやOffice形式(WordやPowerPoint)、TXTファイル：「非構造化ドキュメント(PDF、HTML、TXTなど)」
        - JSONL：「構造化データ(JSONL)」
    - 同期の頻度：1回限り
    - 2.でアップロードしたファイルもしくはファイルを配置したフォルダを選択
5. 「構造化データ(JSONL)」を選択すると、スキーマの確認が挟まります。JSONL作成時に意図したスキーマであれば、「続行」
6. データストア名を入力して「作成」
1-1.のファイルがPDFやOffice形式(WordやPowerPoint)場合は、「ドキュメント処理オプション」で「ドキュメントの解析」と「ドキュメントのチャンキング」を以下のように設定すると良さそうです。
    - ドキュメントの解析
        - テキストと画像を含むPDF：OCR Parser
        - HTML、PDF(恐らく、テキストのみの場合)、または DOCX：Layout Parser
        - (特に以上2つを選択しない場合はDigital Parserが選択される模様)
    - 高度なチャンク構成を有効にする：ON
参考：[Parse and chunk documents  |  Vertex AI Agent Builder  |  Google Cloud](https://cloud.google.com/generative-ai-app-builder/docs/parse-chunk-documents)
7. 画面が戻るので、作成したデータストアにチェックを入れて「作成」
8. データストアの画面に遷移するので、「アクティビティ」タブからドキュメントのインポートが正常に完了しているかどうかを確認します
![Vertex_AI_Agent_Builder_datastore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/6396c0ea-d418-d95e-434b-7d4827fa1ceb.png)


### 2. OAuth 2.0 クライアント IDの用意
#### 2-1. OAuth同意画面を作成します
1. 左上のハンバーガーメニューから「APIとサービス > OAuth同意画面」を選択
2. 「User Type」は「外部」を選択
![OAuth認証画面1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/eed291a8-cea9-aa12-d69f-165bd73947ad.png)

3. アプリ情報は以下を登録
    - アプリ名：適当
    - ユーザーサポートメール：自分のメールアドレス
    - デベロッパーの連絡先情報：自分のメールアドレス(ユーザーサポートメールと同一でも可)
![OAuth認証画面2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/fb0b5af4-859d-4959-5458-8a643177b525.png)
![OAuth認証画面3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/ca0760c8-a4c2-d1fb-d498-94c31f3813bf.png)

4. 「スコープ」「テストユーザー」はデフォルトのまま「保存して次へ」
4. 入力内容を一通り確認し、「ダッシュボードへ戻る」をクリック
5. 遷移後の画面で「公開ステータス」の「アプリを公開」をクリック
![OAuth認証画面4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/636150a5-7d68-f4d1-3655-5dfb02c63c29.png)

#### 2-2. 認証情報の作成
1. サイドバーから「認証情報」を選択
2. 画面上部の「認証情報を作成 > OAuthクライアントID」を選択
![GCP_OAuthクライアント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/a18cb5da-ad04-55ae-d1e6-6882baf95352.png)

3. 以下の項目を設定します
    - アプリケーションの種類：ウェブアプリケーション
    - 名前：適当
![OAuth_client作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/2c4eba13-56fc-ed37-a95f-b69187366624.png)

4. ポップアップ画面の「JSONをダウンロード」をクリック
![OAuth_ポップアップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/19556941-a579-69e1-c750-2a0c5ac75530.png)


### 3. GPTsの設定
#### 3-1. GPTsを新規作成し、 各項目を設定する(actions以外)
1. 以下のURLにアクセスし、左上の「GPTを探す」を選択します
![GPTs_新規作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/c55c3329-3688-92c4-c009-fbae1b52d70f.png)

2. 遷移した画面右上の「作成する」をクリックします
3. 以下の項目を設定します
    - 名前：適当
    - 説明：適当
    - 指示：システムプロンプトを入力します
    - 機能：すべてチェックを外します
![GPTs_設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/684b879c-3c4d-c5c6-4506-0b75a0409c71.png)

4. 「コールバックURL」をコピーし、GCPのWebコンソールに戻り、2-2.で作成した認証情報を選択する。承認済みの「リダイレクトURI」で「URIを追加」をクリックし、コピーしたURIを貼り付け、「保存」をクリックします
![GPTs_コールバックURL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/71acea1f-68f4-d87e-2178-b20d4d1e7daf.png)

![コールバックURL登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/fcd16486-9cdf-9302-2101-ca1591d67b7c.png)



#### 3-2. actionsを設定します
1. アクションの項目をクリックします
2. 遷移した画面の「認証」をクリックし、以下の通りに設定します
    - 認証タイプ：OAuth
    - クライアントID：「2-2. 認証情報の作成」の項番4でダウンロードしたJSONファイルの「client_id」の値
    - クライアントシークレット：「2-2. 認証情報の作成」の項番4でダウンロードしたJSONファイルの「client_secret」の値
    - 認証URL：「2-2. 認証情報の作成」の項番4でダウンロードしたJSONファイルの「auth_url」の値
    - トークンURL：「2-2. 認証情報の作成」の項番4でダウンロードしたJSONファイルの「token_url」の値
    - スコープ：https://www.googleapis.com/auth/cloud-platform
    - トークン交換メソッド：デフォルト(POST リクエスト)
![認証情報の設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/f65eb33d-5406-61ee-70d8-125105a6c8e1.png)
参考：[Cloud Storage OAuth 2.0 スコープ  |  Google Cloud](https://cloud.google.com/storage/docs/oauth-scopes?hl=ja)

3. スキーマを以下の通りに設定します
    ```json
    {
      "openapi": "3.1.0",
      "info": {
        "title": "Get recipe data",
        "description": "Retrieves Japanese home-cooked recipe.",
        "version": "v1.0.0"
      },
      "servers": [
        {
          "url": "https://discoveryengine.googleapis.com"
        }
      ],
      "paths": {
        "/v1/projects/[プロジェクトID]/locations/global/collections/default_collection/engines/[検索アプリID]/servingConfigs/default_search:search": {
          "post": {
            "description": "Search for Japanese home-cooked recipe based on search query",
            "operationId": "GetRecipe",
            "parameters": [
              {
                "name": "query",
                "in": "query",
                "description": "Ingredients used in recipes",
                "required": true,
                "schema": {
                  "type": "string"
                }
              },
              {
                "name": "pageSize",
                "in": "query",
                "description": "The number of recipes to retrieve",
                "required": true,
                "schema": {
                  "type": "number"
                }
              }
            ],
            "deprecated": false
          }
        }
      },
      "components": {
        "schemas": {}
      }
    }
    ```
`paths`に記載しているパスの[プロジェクトID]と[検索アプリID]は適宜置き換えてください。
プロジェクトIDはコンソール画面左上のプロジェクト名のボタンから確認できます。
![GCP_console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/232c972e-19a9-287b-70c9-13711c916053.png)

検索アプリIDはVertex AI Agent Builderのアプリ一覧から確認できます。
![Vertex_AI_Agent Builder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/f7f965bd-bf73-813a-3f4f-9b232f9a2b67.png)

4. 「利用可能なアクション」の「テストする」をクリックします
![GPTs_テストする.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/808ef930-9163-c405-c626-c17798faa293.png)


5. 「discoveryengine.googleapis.comでサインインする」をクリックします
(画像は異なるタイミングのスクリーンショットですが、参考までに)
![Actions_テスト1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/45938758-6131-45c5-394e-cdd228f5279b.png)


6. Googleの認証画面が表示されるので、GCPアカウントでログインします
7. 画面が自動で遷移し、「接続しました」と表示されたら成功です
8. もう一度「利用可能なアクション」の「テストする」をクリックします
9. 「確認する」をクリックして、APIが正常に叩かれていることを確認します
![Actions_テスト2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/81168da5-2d42-f2fd-6e02-a09354d88307.png)
![テスト成功.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/71efa535-972b-a74a-a79d-e50709c39d11.png)


## 成果物
お母さんの優しさが胸に染み入ります。
![成果物.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118714/2fdd378b-40a8-7d18-f243-e642077eaa34.png)


## 感想
OAuth 2.0で沼るかと思いましたが、思ったより簡単に実装できて驚きました。
プロンプトエンジニアリングや検索システムのチューニングなど、RAG実装の重要なポイントはカスタマイズできる余地があり、RAGのエッセンスを学ぶ良い教材になると思いました