GPT-4.5をDatabricksで動かしてみる

先ほどOpenAIから「GPT-4.5 research preview」というメールを受け取りました。

> 本日、私たちは最大のモデルである `gpt-4.5-preview` を研究プレビューとして発表することに興奮しています。これは、ユーザーの意図をより深く理解し、世界知識を深めています。GPT-4.5 は、より自然な会話のために設計されています。創造性、共感、広範な一般知識を必要とするタスクに優れており、執筆支援、コーチング、ブレインストーミング、微妙なコミュニケーションなどに適しています。また、エージェント的な計画と実行においても優れたパフォーマンスを発揮することが確認されています。

ブログ記事はこちら。

https://openai.com/ja-JP/index/introducing-gpt-4-5/

ということで、Databricksで動かしてみます。

```py
%pip install -U openai mlflow tiktoken
%restart_python
```

[シークレット](https://docs.databricks.com/aws/ja/security/secrets)に設定してあるAPIキーを使います。

```py
import os
import openai

os.environ["OPENAI_API_KEY"] = dbutils.secrets.get("demo-token-takaaki.yayoi", "openai_api_key")
```

# 動作確認

[クイックスタート](https://platform.openai.com/docs/guides/vision#quickstart)にある画像解析の例を動かします。

```py
from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4.5-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この画像はなんですか？"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
                    },
                },
            ],
        }
    ],
    max_tokens=300,
)

print(response.choices[0])
```
```
Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='この画像は、美しい景色が広がる緑豊かな草原の中に、木製の遊歩道が中央に配置された風景写真です。遠くに樹木や低木が見られ、空には雲がかかっています。爽やかで穏やかな雰囲気の景色です。', refusal=None, role='assistant', audio=None, function_call=None, tool_calls=None))
```

```py
print(response.choices[0].message.content)
```
```
この画像は、美しい景色が広がる緑豊かな草原の中に、木製の遊歩道が中央に配置された風景写真です。遠くに樹木や低木が見られ、空には雲がかかっています。爽やかで穏やかな雰囲気の景色です。
```

以下の画像なので非常に精緻に説明されていることがわかります。

![](https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg)

# 外部モデルとしてサービングエンドポイントにデプロイ

DatabricksではOpenAIのモデルを[**外部モデル**](https://docs.databricks.com/aws/ja/generative-ai/external-models/)としてサービングエンドポイントにデプロイすることができます。

```py
import mlflow.deployments

# APIを格納しているシークレットスコープ
secret_scope_name = "demo-token-takaaki.yayoi"
# APIを格納しているシークレット
secret_key_name = "openai_api_key"
# Databricksワークスペースのホスト名
databricks_host = "xxxx.cloud.databricks.com/"
# モデルサービングエンドポイント名
endpoint_name = "taka-openai-gpt-4-5"

client = mlflow.deployments.get_deploy_client("databricks")

client.create_endpoint(
    name=endpoint_name,
    config={
        "served_entities": [
            {
                "name": "test",
                "external_model": {
                    "name": "gpt-4.5-preview",
                    "provider": "openai",
                    "task": "llm/v1/chat",
                    "openai_config": {
                        "openai_api_key": f"{{{{secrets/{secret_scope_name}/{secret_key_name}}}}}"
                    }
                }
            }
        ]
    }
)
```

このようにAPIキーが設定されたエンドポイントが作成されます。

![external_serving_endpoint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6ab9540c-0d19-4e31-8744-0cc7fdae458d.png)

外部モデルのサービングエンドポイントは[AI Playground](https://docs.databricks.com/aws/ja/large-language-models/ai-playground)で使用できるので、簡単に挙動を試すことができます。

![playground_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3c3768e2-64bf-46bb-bc13-1562a23f4617.png)
![playground_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ab5225cc-87c3-4a32-9801-51de407930d8.png)

## MLflowへのロギング

このモデルのシステムプロンプトやパラメータを調整したものを組織内で広く活用したいというニーズがあるかと思います。その場合には、[MLflow](https://docs.databricks.com/aws/ja/mlflow/)を活用することでそれらの設定を伴うGPT-4.5モデルを[Unity Catalogで管理されるモデル](https://docs.databricks.com/aws/ja/machine-learning/manage-model-lifecycle)として登録することができます。

```py
import mlflow

# モデルの登録先
model_name = "takaakiyayoi_catalog.openai.open_ai_4_5"

mlflow.set_registry_uri("databricks-uc")

with mlflow.start_run():
    model_info = mlflow.openai.log_model(
        model="gpt-4.5-preview",
        task=openai.chat.completions,
        messages=[{"role": "system", "content": "あなたはDatabricksの専門家です"}],
        artifact_path="model",
        registered_model_name = model_name,
    )
```

![Screenshot 2025-02-28 at 11.16.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0c8bc6d7-6901-424f-a9fe-36a33119ac47.png)
![Screenshot 2025-02-28 at 11.16.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/11565361-31b8-4968-a309-500a59ec341b.png)

この登録モデルもモデルサービングエンドポイントにデプロイすることができます。

```py
import requests

secret_scope_name = "demo-token-takaaki.yayoi"
secret_key_name = "openai_api_key"
databricks_host = "xxxxx.cloud.databricks.com/"

endpoint_name = "taka_logged_gpt_4_5"
model_name = model_name
model_version = 1
databricks_api_token = dbutils.notebook.entry_point.getDbutils().notebook().getContext().apiToken().get()

# Create your endpoint
data = {
    "name": endpoint_name,
    "config": {
        "served_models": [
            {
                "model_name": model_name,
                "model_version": model_version,
                "workload_size": "Small",
                "scale_to_zero_enabled": True,
                "environment_vars": {
                    "OPENAI_API_KEY": f"{{{{secrets/{secret_scope_name}/{secret_key_name}}}}}"
                }
            }
        ]
    }
}

headers = {
    "Context-Type": "text/json",
    "Authorization": f"Bearer {databricks_api_token}"
}

response = requests.post(
    url=f"https://{databricks_host}/api/2.0/serving-endpoints",
    json=data,
    headers=headers
)
print("Response status:", response.status_code)
print("Response text:", response.text, "\n")
```

このようにモデルサービングエンドポイントが作成されます。

![Screenshot 2025-02-28 at 11.18.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2b1d3f45-2a07-4974-be93-c47abaf43e84.png)

# エンドポイントへのクエリー

[こちらの手順](https://docs.databricks.com/aws/ja/generative-ai/external-models/#%E5%A4%96%E9%83%A8%E3%83%A2%E3%83%87%E3%83%AB%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%AE%E3%82%AF%E3%82%A8%E3%83%AA)を参考にモデルサービングエンドポイントに問い合わせを行います。

```py
import os
import openai
from openai import OpenAI

client = OpenAI(
    api_key="<Databricksパーソナルアクセストークン>",
    base_url="https://xxxxx.cloud.databricks.com/serving-endpoints/"
)

completion = client.completions.create(
  model="taka_logged_gpt_4_5",
  prompt="Databricksについて教えてください",
  temperature=1.0
)
print(completion)
```
```
Databricks（データブリックス）は、Apache Sparkの開発者が創業したクラウドベースの統合的なデータ分析プラットフォームです。データエンジニアリング、機械学習（Machine Learning／ML）、データサイエンス、ストリーミング処理に至るまで、データに関わるさまざまなワークロードを統合し、管理・分析・活用できるように設計されています。\n\n主な特徴:\n\n1. **統合プラットフォーム（Lakehouseと呼ばれるデータ管理アーキテクチャ）**  \n   Databricksは「Lakehouse」というデータアーキテクチャを採用し、データレイク（Data Lake）の柔軟性や拡張性と、データウェアハウス（Data Warehouse）の管理性や信頼性を1つに統合しています。このLakehouseアプローチによって、データの重複や管理上の無駄を削減します。\n\n2. **Apache Sparkをベースとした分散処理エンジン**  \n   クラウド上でデータの分散処理を高速化・効率化します。Sparkのクラスター運用の手間を軽減し、パフォーマンスを高度に最適化します。\n\n3. **機械学習・AIとの連携**  \n   Azure ML、TensorFlow、PyTorch、scikit-learnなどの機械学習やAIツールとの統合が可能で、機械学習モデルの作成・管理・運用（MLOps）の仕組みが充実しています。サービスとしての機械学習モデルの構築・デプロイを強力にサポートします。\n\n4. **各クラウドベンダーとの幅広い統合**  \n   Microsoft Azure、AWS、Google Cloudなど主要クラウドプロバイダと統合されており、各ベンダーが提供するデータストレージ・サービスや認証・管理機能とシームレスに連動します。\n\n5. **SQL分析機能の提供（Databricks SQL、Serverless SQL）**  \n   標準的なSQLインターフェースを通じて、アナリストやビジネスユーザーも容易にデータレイク内の膨大なデータを迅速に分析可能にしています。\n\n6. **コラボレーションとノートブック型開発環境**  \n   Python、Scala、SQL、Rなどのさまざまな言語をサポートし、複数のデータエンジニア、データサイエンティストが1つのノートブックで協力して作業できます。これにより、データ分析、モデリング、検証、共有というプロセスがスムーズに実行できます。\n\n7. **データセキュリティ機能が充実**  \n   高レベルのセキュリティ設定、アクセス制御、統合認証（Azure Active Directory、AWS IAM、Google Cloud Identity）、データストレージ暗号化などの充実した機能があります。\n\nユースケース例:\n\n- 大規模なバッチ処理・リアルタイム・ストリーミング系のデータエンジニアリング（ETL／ELT）  \n- 機械学習モデルの高速な開発・運用  \n- ビジネスインテリジェンス（BI）やレポート作成などの分析・洞察業務  \n- データ分析チームやデータサイエンスチーム向けの標準プラットフォームとして\n\nこのようにDatabricksは、複雑なデータエコシステムの統合管理を目指して設計された、クラウドベースの包括的なデータ分析プラットフォームです。']
```

マークダウンで貼り付けます。

Databricks（データブリックス）は、Apache Sparkの開発者が創業したクラウドベースの統合的なデータ分析プラットフォームです。データエンジニアリング、機械学習（Machine Learning／ML）、データサイエンス、ストリーミング処理に至るまで、データに関わるさまざまなワークロードを統合し、管理・分析・活用できるように設計されています。

主な特徴:
1. **統合プラットフォーム（Lakehouseと呼ばれるデータ管理アーキテクチャ）**
Databricksは「Lakehouse」というデータアーキテクチャを採用し、データレイク（Data Lake）の柔軟性や拡張性と、データウェアハウス（Data Warehouse）の管理性や信頼性を1つに統合しています。このLakehouseアプローチによって、データの重複や管理上の無駄を削減します。

2. **Apache Sparkをベースとした分散処理エンジン**
クラウド上でデータの分散処理を高速化・効率化します。Sparkのクラスター運用の手間を軽減し、パフォーマンスを高度に最適化します。

3. **機械学習・AIとの連携**
Azure ML、TensorFlow、PyTorch、scikit-learnなどの機械学習やAIツールとの統合が可能で、機械学習モデルの作成・管理・運用（MLOps）の仕組みが充実しています。サービスとしての機械学習モデルの構築・デプロイを強力にサポートします。

4. **各クラウドベンダーとの幅広い統合**
Microsoft Azure、AWS、Google Cloudなど主要クラウドプロバイダと統合されており、各ベンダーが提供するデータストレージ・サービスや認証・管理機能とシームレスに連動します。

5. **SQL分析機能の提供（Databricks SQL、Serverless SQL）**
標準的なSQLインターフェースを通じて、アナリストやビジネスユーザーも容易にデータレイク内の膨大なデータを迅速に分析可能にしています。

6. **コラボレーションとノートブック型開発環境**
Python、Scala、SQL、Rなどのさまざまな言語をサポートし、複数のデータエンジニア、データサイエンティストが1つのノートブックで協力して作業できます。これにより、データ分析、モデリング、検証、共有というプロセスがスムーズに実行できます。

7. **データセキュリティ機能が充実** 
高レベルのセキュリティ設定、アクセス制御、統合認証（Azure Active Directory、AWS IAM、Google Cloud Identity）、データストレージ暗号化などの充実した機能があります。

ユースケース例:
- 大規模なバッチ処理・リアルタイム・ストリーミング系のデータエンジニアリング（ETL／ELT
- 機械学習モデルの高速な開発・運用
- ビジネスインテリジェンス（BI）やレポート作成などの分析・洞察業務
- データ分析チームやデータサイエンスチーム向けの標準プラットフォームとして

このようにDatabricksは、複雑なデータエコシステムの統合管理を目指して設計された、クラウドベースの包括的なデータ分析プラットフォームです。


### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)