gpt-4oをDatabricksで動かしてみる

といっても、APIコールするだけですが。こちらのクックブックのGetting StartedとImage Processingをウォークスルーします。動画はまたあとで。

https://cookbook.openai.com/examples/gpt4o/introduction_to_gpt4o

# 準備

OpenAIのAPIキーを[シークレット](https://docs.databricks.com/ja/security/secrets/secrets.html)に格納しておきます。

ライブラリをアップグレードします。

```py
%pip install --upgrade openai --quiet
dbutils.library.restartPython()
```

# 事始め

```py
from openai import OpenAI 
import os

## APIキーとモデル名のセットアップ
MODEL="gpt-4o"
client = OpenAI(api_key=dbutils.secrets.get(scope="demo-token-takaaki.yayoi", key="openai_api_key"))
```

まずは動作確認。

```py
completion = client.chat.completions.create(
  model=MODEL,
  messages=[
    {"role": "system", "content": "You are a helpful assistant. Help me with my math homework!"}, # <-- This is the system message that provides context to the model
    {"role": "user", "content": "Hello! Could you solve 2+2?"}  # <-- This is the user message for which the model will generate a response
  ]
)

print("Assistant: " + completion.choices[0].message.content)
```

動きました。日本語ではどうか。

```py
completion = client.chat.completions.create(
  model=MODEL,
  messages=[
    {"role": "system", "content": "あなたは有能なアシスタントです。私の数学の宿題を手伝ってください！"}, # <-- これはモデルにコンテキストを提供するシステムメッセージです
    {"role": "user", "content": "こんにちは！2+2を解けますか？"}  # <-- これはモデルがレスポンスを生成するユーザーメッセージですThis is the user message for which the model will generate a response
  ]
)

print("Assistant: " + completion.choices[0].message.content)
```

問題ないです。

```
Assistant: もちろん、2+2は4です。他にも何か数学の質問がありますか？
```

# 画像処理

処理対象の画像をワークスペースにインポートしておきます。

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bad0d3fe-ced5-8635-2ea3-8b71ae12d73d.png)

![Screenshot 2024-05-15 at 2.56.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/59120d4d-7d1c-c0ae-1cbe-9d061cde89e8.png)

```py
from IPython.display import Image, display, Audio, Markdown
import base64

IMAGE_PATH = "data/triangle.png"

# コンテキストに指定する画像のプレビュー
display(Image(IMAGE_PATH))
```
表示されます。
![Screenshot 2024-05-15 at 2.57.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/20c82cfc-c88f-f8e7-2acc-32a60777516c.png)

プロンプトも日本語でトライします。

```py
# 画像ファイルをオープンして、base64文字列にエンコード
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")

base64_image = encode_image(IMAGE_PATH)

response = client.chat.completions.create(
    model=MODEL,
    messages=[
        {"role": "system", "content": "あなたはMarkdownでレスポンスを生成する有能なアシスタントです。私の数学の宿題を手伝ってください！数式のMarkdownを返却する際には数式の行の上下を$$で挟んでください"},
        {"role": "user", "content": [
            {"type": "text", "text": "三角形の面積はいくつですか？"},
            {"type": "image_url", "image_url": {
                "url": f"data:image/png;base64,{base64_image}"}
            }
        ]}
    ],
    temperature=0.0,
)

print(response.choices[0].message.content)
```

で、ここでDatabricksでマークダウンがレンダリングされるようにプロンプトを調整しています。こちらに書いているように、DatabricksノートブックでTexをレンダリングするには、数式の上下に`$$`を追加する必要があるので、**数式のMarkdownを返却する際には数式の行の上下を$$で挟んでください**を追加しています。

```
この三角形は底辺が9、両側の辺が6と5の二等辺三角形です。三角形の面積を求めるためには、高さを求める必要があります。

まず、三角形の高さを求めるために、三角形を2つの直角三角形に分けます。底辺の長さ9を2つに分けると、それぞれの直角三角形の底辺の長さは4.5になります。

次に、ピタゴラスの定理を使って高さを求めます。

$$
h = \sqrt{6^2 - 4.5^2}
$$

計算すると、

$$
h = \sqrt{36 - 20.25} = \sqrt{15.75} \approx 3.97
$$

次に、三角形の面積を求めます。

$$
A = \frac{1}{2} \times 底辺 \times 高さ
$$

$$
A = \frac{1}{2} \times 9 \times 3.97 \approx 17.865
$$

したがって、この三角形の面積は約17.865平方単位です。
```

**テキスト**のセルを追加します。
![Screenshot 2024-05-15 at 2.59.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d1f21f91-f7a9-0cd7-7d9b-f743edd92077.png)

上のレスポンスを貼り付けると、数式もレンダリングされます。これは嬉しい。
![Screenshot 2024-05-15 at 3.00.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d0651339-eb1d-2f40-a170-b9506dca3a4d.png)

今日はとりあえずここまで。こちらに続きます。

https://qiita.com/taka_yayoi/items/0c4aee06ec708bac9c53

### はじめてのDatabricks

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

### Databricks無料トライアル

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