【Google Cloud】Vertex AIのグラウンディングに独自のデータを利用する

## はじめに   
企業における生成AIの活用が急速に広がる中、RAG（Retrieval-Augmented Generation）技術への期待が高まっています。   
一般的な対話型生成AIにおいても、独自のデータを根拠（グラウンディング）にした回答をさせることで、その活用範囲は更に向上するのではないでしょうか。   
過去の会話履歴からの推察や、プロンプトとの組み合わせによって、より高精度で多様な業務への応用が期待されます。   

[前回の記事](https://qiita.com/yuto-watanabe-basic/items/046187d8cc7190914d38)では、Agent Builder を用いた RAG の構築までを行いました。   
今回は RAG を Vertex AI Studio と組み合わせ、会話の根拠付けとして独自データを利用させる事を検証しました。   

## STEP1: Vertex AI Search のデータストアを作成   
[前回の記事のSTEP1](https://qiita.com/yuto-watanabe-basic/items/046187d8cc7190914d38#step1-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B9%E3%83%88%E3%82%A2%E3%81%AE%E4%BD%9C%E6%88%90)を参照してください   

## STEP2: グラウンディングソースを設定   
Vertex AI Studio のプロンプト作成画面に移動します。   
画面右側のパネルにおける「ツール」内の「グラウンディング」を有効化します。  
（Googleのロゴがついている「Grounding」を有効にするとGoogle検索によるグラウンディングが可能となります。）  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119315/99bc5885-c5da-46d8-bc30-ecb52dfda2d3.png)

グラウンディングのカスタマイズメニューが表示されますので「Vertex AI Search」を選択します。   
データストアのパスを設定する事で、グラウンディングの設定が完了します。   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119315/df86c8c0-4f7c-4c0d-88ea-a37419e81cb9.png)

#### 注意点
GUIでデータストアを作成した場合、collectionは「default_collections」となります。   
そのため、データストアIDを取得の上、以下のように設定します。   
`projects/{プロジェクト名}/locations/{データストアのロケーション名}/collections/default_collection/dataStores/{データストアID}`   

## STEP3: モデルの変更   
グラウンディングは最新のモデルでは未サポートです。   
https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/ground-gemini?hl=ja#private-ground-gemini   
そのため、以下からサポート対象のモデルに変更します。   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119315/f3fb08b3-4905-4f5d-b21d-f41f96f9f1e6.png)
今回はその中でも gemini-1.5-flash-002 を選択します。（理由は後述します）   


## STEP4: システム指示の作成   
Vertex AI とチャットをする際の前提条件として「システム指示」を作成します。   
実際のプロンプトを処理する前に、この指示が読み込まれることで、モデルの動作や応答方法を指定する事が出来ます。   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119315/70ad189a-0a6a-4aa6-88cc-c67db2b67ef7.png)
グラウンディングのデータソースには、いくつかDLしたQiitaの記事を利用しています。   
そのため、今回は以下のように設定しました。   

> あなたは、エンジニアの初学者を優しくサポートするAIアシスタントです。    
> あなたの役割は、エンジニアリングに関する利用者の疑問や質問に対して、丁寧で分かりやすい言葉で答えることです。   
> 
> グラウンディングで提供されている情報は、Webアプリ開発に関わる技術記事です。   
> 質問の内容に関連する技術記事が提供された場合、その記事の内容をよく理解し、記事の情報に基づいて回答してください。   
> 記事の内容をそのまま伝えるだけでなく、初学者が理解しやすいように、具体的な例を交えたり、補足説明を加えたりすることを心がけてください。   
> もし技術記事の内容と矛盾する情報や、記事に記載されていない情報を提供する場合は、その旨を明示し、混乱を招かないように注意してください。   
> 
> 回答の際は、以下の点に注意してください。   
> * **優しい口調:** 友達や先輩が話すような、親しみやすく温かい言葉遣いを心がけてください。「～だよ」「～だね」「～だよ！」のような肯定的な語尾や、疑問を投げかけるような語尾を適度に使うと良いでしょう。   
> * **丁寧な説明:** 初学者が専門用語に戸惑わないよう、難しい言葉は避け、簡単な言葉で説明してください。必要に応じて、例え話や図解などを活用することも検討してください。   
> * **段階的な回答:** 複雑な質問に対しては、一度に全てを説明するのではなく、段階的に情報を提示することを心がけてください。   

## 質問してみる   
質問してみると、以下のように返答を得ることができました。   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119315/5f069939-2919-4039-a171-af9c101bf0aa.png)
スクロールの都合で内容は省略しますが、グラウンディングに利用したソースも示されています。   
文章の中には[1][2]...などの数字があり、これらはグラウンディングのソースの番号と対応しています。   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119315/109278b2-7cbd-48a7-8948-b58773c5c336.png)

これにより、独自データを基にした対話型生成AIが作成できました。   
更にシステム指示やプロンプトを調整する事で、回答精度の向上や利用用途に沿ったカスタマイズが可能となります。   

また、グラウンディングがサポートされているはずの gemini-2.0-flash-001 ではグラウンディングソースが提示される確率が低く、独自データのグラウンディングができているか不明確でした。   
明示的にグラウンディングソースを示させたい場合、 gemini-1.5-flash-002 の利用をお勧めします。