IBMの簡単に試せるらしいRAG（Chat with Docment）を触ってみた -前半

### 背景
RAGって、データの取り込みや、チャンクサイズ、embedding modelやLLMなどを考慮しつつ、それらをPythonで書くのって結構大変。そんなときにIBMから、ノーコードで簡単に、そして自分で修正することもできるから玄人にもおすすめできる、Chat with Documentをご紹介いただいたので、簡単に記事を書いてみました。

### 前提
watsonx.ai、watsonx.data Milvus、IBM Cloud Object Storageが払い出し済み

### 手順
IBM Cloudにログイン後、「リソース・リスト」から「watsonx.ai studio」を選択し、「Launch in」の「IBM watsonx」を選択してください。（私は一回目ここで迷いました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/538082b1-9b62-71ec-aa95-e4fc26a5da3c.png)

ログインすると以下のような画面になります。その後下にスクロールしていき、プロジェクトから「新規プロジェクトの作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/b02325cb-75d9-b96b-e69e-7c35c4e32a33.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/baa0838e-c243-6a4a-8869-33a32617cfe4.png)
プロジェクトは、名前やストレージなどを入力する必要があります。その後作成を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/8c072587-1e55-81dd-e6c9-3231d0813f99.png)

プロジェクト作成後は、「管理」タブから「サービスおよび結合」を選択し、「サービスの関連付け」でWMLを紐付けます。
IBMはプロジェクトごとにWMLを結びつけるんですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/6f832128-ec88-fc8c-9cd3-8f85a2884c66.png)

WMLは基本的にデフォルトで出てくるとは思いますが、出てこない場合は、「位置」でリージョンを確認してみてください。（私は一度ここで心が折れました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/5a25459e-ae78-edb3-f624-b9013a526821.png)
続けて、「アセット」タブから新規資産を選択して、「ベクトル化されたドキュメントを使ったAI」を選択ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/3546f032-340b-7393-1922-23a9a97d5ac6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/afce4235-6b9c-53b4-a70f-cf72015bb3ef.png)
選択肢として、「メモリー内」「watsonx.data Milvus」「Elasticsearch」があります。今回は、「watsonx.data Milvus」を選択していきます。
事前に払い出してあるwatsonx.data Milvusに接続をしていきます。「接続の作成」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/32fb412d-9d56-c417-d94d-84f26fa07a2e.png)
作成後以下のような入力画面にいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/83a03ee3-956e-37be-6352-8f0871ed77bb.png)
名前 (必須)：適当、今回はniwa-demo
ホスト名(必須)：gRPCホストのポート前まで
ポート(必須)：gRPCのポート
ユーザー名(必須)：ibmlhapikey
パスワード(必須)：watsonx.data Milvusが払い出されているアカウントへのAPIキー
を入力してください。
gRPCホストなどの情報取得方法はこちらの参考[Qiita](https://qiita.com/Tiger-Kid/private/761f3fa5bbe4e23ffb4d)をぜひ！
すべての情報を入力後、「接続のテスト」で確認してから、「作成」で進めていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/caf49fdd-736f-be48-4514-56f5b2776b08.png)
先ほどまで「接続の作成」だった箇所が、Milvusの名前に変わっています。データベースはdefaultにして、埋め込みモデルを選定します。埋め込みモデルは言語やユースケースによって異なりますが、今回は、「multilingual-e5-large」を試します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/92a74b97-bd13-4bea-16d4-e33ae4fd3874.png)
Milvusではコレクションごとにベクトルを管理することができます。今回は「新規コレクション」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/db7c43d6-5c1d-a95a-5f83-3cc52da314a4.png)
コレクションの名前をつけ、その後ファイルを追加していきます。
ファイルは、PPTX(300MBまで)、DOCX(10MBまで)、PDF(50MBまで)、TXT(5MBまで)、JSON(5MBまで)、HTML(5MBまで)、CSV(5MBまで)、XLSX(5MBまで)から参照することができます。
また、アップロードする文書に応じて、チャンクサイズやオーバーラップの値を設定してください。チャンクにより、生成AIの参考文書として適切な大きさに分けます。チャンクが小さすぎて意味が途中で切れてしまうと、生成AIは当然正しく文章を生成することはできませんし、チャンクが大きすぎると、生成AIは、参考する箇所が多すぎて関係ない情報過多になり、混乱しちゃいます。センター試験の国語を思い出しますね。
まぁ、実施した後にこのチャンクサイズなども再調整できるので、最初はデフォルトで実施します。
今回使用する資料は[Db2 12.1とIBM Database Assistantの提供開始](https://ibm.box.com/s/7hgyrc64q1z4jdn02t5853eq327orl1l)です。その後、「作成」を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/68886cf2-808b-592a-5b89-73e1793cc244.png)

作成後、以下のような画面に変遷するので、下にスクロールしていき、ビルドの詳細→ジョブ実行がCompletedしたことを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/5ff8358a-e335-953e-ff6c-0a9efbf50edf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/b9db44df-eddb-3cc7-c920-f0d531ea7f5f.png)

「データ」タブからはアップロードしたPDFのデータを、「質問の例」タブでは質問に対する回答を確認することができます。「質問の例」をいくつか試してみます。「サンプル質問の追加」を押して、気になる質問を記入してみてください。今回は、以下の質問で試してみます。
「新しく提供されたDb2のバージョンはいくつですか？」
「新しいDb2ではどんな機能が追加されましたか？」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/15137907-f4f2-3d9a-4c62-0e925bac898c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/80250ea3-9a83-675e-4d81-4d591f365b2c.png)
「新しく提供されたDb2のバージョンはいくつですか？」に対しての結果は以下のとおりです。
なお、スコアは、取得されたコンテンツが質問にどの程度類似しているか、を示しており、0に近いスコアは、文書コンテンツと質問の間の類似度が高いことを表します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/10c5ed27-2087-bdb0-60ba-c7ba76ca4541.png)
検索結果の数を調整することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/b77e8067-2c07-0ed3-3714-03444efaf3d5.png)

続いて、「新しいDb2ではどんな機能が追加されましたか？」を試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/ee4bd325-cf77-e360-0eba-065cc397512f.png)

今回は１ページしか追加していないので、該当箇所が多くないため、上位kはデフォルトの３のままにしたいと思います。
チャンク・サイズを変えてみましょう。
「詳細」タブの右上にある「ベクトル検索の編集」を選択し、「埋め込みモデル」の変更箇所はそのままで、「次へ」を選択し、「テキスト・チャンク・サイズ」を500、「テキスト・チャンクのオーバーラップ」を50に変更して実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/ad5fe4cf-5ca7-8795-7dd8-daaaa7792b8c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/6b5619a8-b5de-051d-ed01-12afddf050e7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/262733eb-95aa-7831-629d-f895d9fa4a51.png)

「質問の例」から「新しく提供されたDb2のバージョンはいくつですか？」についてテストを実行してみると、今回は上位３つのスコアが0.26、0.26、0.27になりました。チャンク・サイズが2000のときは、上位３つが、0.26、0.27、0.3だったので、改善されたことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/4aabb749-549e-8abf-33d9-1b7d61609187.png)
同様に、「新しいDb2ではどんな機能が追加されましたか？」についてテストを実行してみると、上位３つのスコアが、0.25、0.25、0.29となりました。チャンク・サイズが2000のときは、上位３つが、0.26、0.28、0.3だったので、改善されたことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2505349/f858106a-8237-52bb-19fb-ce6c265c498f.png)

最適な結果を求めすぎると沼りそうな気がしたので、一旦こちらのチャンク・サイズ数で進めていきます。では、後半からは、実際に生成AIにこのTok3を返して文章を生成してみたいと思います。
LLMはモデルに応じて、文章の生成能力が異なるため、いくつか実際に試してみます。
では、右下の「プロンプト・ラボで開く」を選択して後半の記事に向かいましょう。

[後半](https://qiita.com/Tiger-Kid/private/346043ef8eacd9ba601d)に続く