Vector Database を DataRobot Python API でスマートに更新！デプロイ連携で常に最新情報を

　　　　　　　　<img width="400" alt="Gemini_Generated_Image_z4iuknz4iuknz4iu.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864834/f1d16a8c-ef6d-48ab-b049-d0bb3cb5ec15.jpeg">


DataRobotで、製造業およびヘルスケア業界のお客様を中心に担当しているシニアデータサイエンティストの畑 遼介です。

LLM(Large Langegue Model: 大規模言語モデル)の進化に伴って、社内データとLLMの活用のために、RAG（Retrieval Augmented Generation）、他の応用などが盛んに活用され続けています。RAGでは、社内データの検索のために**VDB(Vector DataBase)** の採用例が多いため、VDBはLLMの活用の重要な基盤技術として注目を集めています。

RAGを運用していく際に、VDB に格納された情報を常に最新に保つのは、システム運用における重要な課題です。一方で、大元のデータソースの更新に合わせて VDB の手動更新は手間がかかり、ミスも起こりやすくなります。

そこで本記事では、**DataRobot の Python APIを活用し、デプロイメントと連携しながら VDB をスマートに更新する方法**を解説します。さらに、**DataRobot Notebooks のスケジューリング機能を利用して、この更新プロセスを自動化する方法**もご紹介します。これにより、データソースの更新を自動的に VDB に反映させ、常に最新の情報に基づいた GenAI アプリケーションを運用することが可能になります。

### なぜデプロイメント連携が重要なのか？
DataRobot でデプロイしたモデルに参照するVDB が古い情報のままでは、生成AI アプリケーションの品質低下に直結します。

デプロイメント連携を行うことで、以下のメリットが得られます。
- **常に最新の情報**: データソースの更新に合わせて VDB が自動的に更新されるため、常に最新の情報に基づいた回答が可能になります。
- **運用負荷の軽減**: 手動更新の必要がなくなり、運用チームの負担を大幅に軽減できます。
- **高い信頼性**: 自動化により、人為的なミスを減らし、システムの信頼性を向上させます。

### 実装ステップ：デプロイ ID から VDB 情報を取得し、BigQuery データで更新

本記事では
- **データソース（BigQuery: 一例）からのデータ取得**
- **DataRobotデプロイIDを元にVDB情報の取得**
- **データソースのデータを利用してVDBの更新**

を行う具体的な手順を紹介します。ここでBigQueryを例にしますが、DataRobotで利用可能な[データソース](https://docs.datarobot.com/ja/docs/data/connect-data/data-sources/index.html)であればいずれでも実行可能です。

#### 1. 前提条件

- DataRobot Notebooks の利用環境
    ⚪︎オプション：DataRobot Notebooksの環境を使わない場合
　　　▪️DataRobot のアカウントおよび API トークン
　　　▪️DataRobot Python API のインストール (pip install datarobot)
- 更新対象の VDB が紐づいた DataRobot デプロイメントの ID
- VDB の更新元となるデータが格納された BigQuery のデータセットおよびテーブル
- BigQuery へのアクセスに必要なクレデンシャル ID が DataRobot に登録済みであること

#### 2. デプロイ ID から VDB 関連情報を取得する
まず、デプロイメント ID を用いて、関連する VDB の ID や Family ID を取得する関数を作成します。

```python
import datarobot as dr
import os

# DataRobot クライアントの初期化
# DataRobotへの接続
dr.Client(
    token=token=os.environ["DATAROBOT_API_TOKEN"],
    endpoint=os.environ["DATAROBOT_ENDPOINT"],
)

def get_vdb_id_from_deployment_id(deployment_id: str) -> dict:
    '''
    DataRobot のデプロイ ID から、VDB の情報を取得する関数。
    VDB の id が更新のためのリクエストに必要となるため
    '''
    deployment = dr.Deployment.get(deployment_id=deployment_id)
    model_id = deployment.model['custom_model_image']['custom_model_id']
    version_id = deployment.model['custom_model_image']["custom_model_version_id"]
    custom_model_version = dr.CustomModelVersion.get(model_id, version_id)
    vdb_id = {}
    for i in custom_model_version.runtime_parameters:
        if i.field_name == "VECTOR_DATABASE_ID":
            vdb_id["VECTOR_DATABASE_ID"] = i.current_value
        elif i.field_name == "VECTOR_DATABASE_FAMILY_ID":
            vdb_id["VECTOR_DATABASE_FAMILY_ID"] = i.current_value
        else:
            pass
    return vdb_id

# 更新対象のデプロイメント ID を指定
deployment_id = 'YOUR_DEPLOYMENT_ID'
vdb_id = get_vdb_id_from_deployment_id(deployment_id)
print(f"取得した VDB 情報: {vdb_id}")
```

#### 3. VDB 更新用のデータセットを作成する
次に、BigQuery に格納されたデータを DataRobot のデータセットとして登録します。

```python
# BigQuery のデータソース ID、クレデンシャル ID、利用ケース ID を指定
data_source_id = "YOUR_BIGQUERY_DATA_SOURCE_ID"
credential_id = "YOUR_BIGQUERY_CREDENTIAL_ID"
use_case_id = "YOUR_USE_CASE_ID" # VDB に関連する利用ケース

dataset = dr.Dataset.create_from_data_source(data_source_id,

do_snapshot=True,

credential_id=credential_id,

use_cases=[use_case_id])

print(f"作成されたデータセット ID: {dataset.id}")
```

#### 4. Python API を用いて VDB を更新する
取得した VDB 情報と作成したデータセット ID を用いて、Python API で VDB の更新リクエストを送信します。

```python
from datarobot.models.genai.vector_database import VectorDatabase

chunking_parameters = { # ここのパラメータは適宜合わせる
    "chunkOverlapPercentage": 50,
    "chunkSize": 384,
    "chunkingMethod": "recursive",
    "embeddingModel": 'cl-nagoya/sup-simcse-ja-base', # 利用する埋め込みモデル
    "embeddingValidationId": None,
    "isSeparatorRegex": False,
    'separators': ['\n\n', '\n', ' ', ''],
}

response = VectorDatabase.create(
    dataset_id=dataset.id,
    chunking_parameters=chunking_parameters,
    use_case=use_case_id,
    name="YOUR_NEW_VDB_NAME", # 新しい VDB の名前
    parent_vector_database_id=vdb_id["VECTOR_DATABASE_ID"],
    update_llm_blueprints=True,
    update_deployments=True # 関連するデプロイメントも更新
)

print(f"VDB 更新リクエストのレスポンス: {response}")
```

#### 5. DataRobot Notebooks によるスケジューリング実行
上記の Python コードを DataRobot Notebooks に実装することで、GUI 上から簡単にスケジューリング実行を設定できます。

参考：[ノートブックのスケジューリング](https://docs.datarobot.com/ja/docs/workbench/wb-notebook/wb-manage-nb/wb-schedule-nb.html)

#### 手順:
1. DataRobot プラットフォーム上で Notebooks を開き、新しい Notebook を作成するか、上記のコードを記述した Notebook をアップロードします。
1. Notebook の左側にある「Schedule」ボタンをクリックします。
1. スケジュールの設定画面が表示されるので、実行頻度（例：毎日、毎週、毎月）、実行時間などを設定します。
1. 必要に応じて、実行失敗時の通知設定なども行います。
1. 設定を保存すると、指定したスケジュールに従って Notebook が自動的に実行され、VDB の更新プロセスが自動化されます。

ベースで簡単に VDB の更新を自動化できるため、運用効率が大幅に向上します。

### まとめ
本記事では、DataRobot の API および Python API を活用し、デプロイメント ID を基に VDB 情報を取得し、例としてBigQuery のデータを用いて VDB をスマートに更新する方法を解説しました。さらに、**DataRobot Notebooks のスケジューリング機能を利用することで、この更新プロセスを完全に自動化できる**と紹介しました。

データソースの更新を任意の時間間隔で VDB に反映させることができ、最新の情報に基づいた 生成AI アプリケーションの運用が可能になります。

ぜひ、本記事で紹介したコードと DataRobot Notebooks のスケジューリング機能を活用して、DataRobot 環境における VDB の効率的な運用を実現してください。


#### 注記:
YOUR_DEPLOYMENT_ID, YOUR_BIGQUERY_DATA_SOURCE_ID, YOUR_BIGQUERY_CREDENTIAL_ID, YOUR_USE_CASE_ID, YOUR_NEW_VDB_NAME 
は、実際の環境に合わせて置き換えてください。
更新時のVDBのパラメータ、埋め込みモデル(embeddingModel)など、 は利用する言語やタスクに合わせて適切なものを選択してください。
エラーハンドリングやロギング処理は、実際の運用に合わせて DataRobot Notebooks 内に追加することを推奨します。