Azure AI Foundryのgrok-3とgpt-4.1とo4-miniでsqlite3のデータベースを確認してもらった

こんにちは。  
今回はOpenAIのモデル以外も触ってみようと思い、Azure AI Foundryのgrok-3で sql の動作を確認してみたので、メモを残しておきます。

ブログを読んでいる方でも試せるように、データベースはsqlite3のチュートリアルで公開されているデータベースを使用します。

https://www.sqlitetutorial.net/sqlite-sample-database/

# Azure側の準備
AzureのポータルからAzure AI Foundaryを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/27f4eb41-9f63-4119-a6b0-1cbf882901d3.png)

リソースの名前やプロジェクト名を設定して作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/ba3cdd85-f032-4b68-9b17-0184c4cb2db4.png)

リソースが作成されたら、Azure AI Foundary portalに移動します。移動したらモデルカタログから試したいモデルを選択します。今回はgrok-3を使いますが、好きなモデルをデプロイしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/814fc49f-8abf-46cd-b603-7ce10d2c0c51.png)

デプロイが完了したら、マイアセットからエンドポイントとキーを取得しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/19745a3e-505e-4995-851d-e904ef29ae4d.png)

# Python環境の準備
Pyhtonが動作するLinux環境を用意してください。私は、Windows 11 の wsl2 の Ubuntu 24.04 コンテナに miniconda python 3.13.2 をインストールしています。  

今回は、以前の記事で紹介した実験的なコードを使っていきます

https://qiita.com/kekekekenta/items/a29def2eceacdfea037f

まず、githubから今回使用するコードを取得して、モデルのエンドポイントを設定してください。
```sh
git clone --recursive https://github.com/KentaroAOKI/python_code_interpreter.git
cd python_code_interpreter
pip install -r requirements.txt
cp .env.sample .env
vi .env
```

Azure側の準備で取得したエンドポイントとキーを設定してください。Open AI推論エンドポイントを使用してgrok-3を使用します。

```sh
DEPLOYMENT_NAME='grok-3'

# Azure OpenAI
# If your environment is Azure OpenAI, set the following
AZURE_OPENAI_API_KEY='<your azure openai key>'
AZURE_OPENAI_ENDPOINT='https://<your endpoint>.openai.azure.com/'
OPENAI_API_VERSION='2025-01-01-preview'
```

https://learn.microsoft.com/ja-jp/azure/ai-foundry/model-inference/how-to/inference?tabs=python

次に、sqlite3のチュートリアルからデータベースをダウンロードします。
```sh
cd sample_data
wget wget https://www.sqlitetutorial.net/wp-content/uploads/2018/03/chinook.zip
unzip chinook.zip
cd ..
```

# sqlite3のデータベースのデータを調べてみる

チュートリアルのsqlite3データベースから、最も多くのトラックを持つアルバムの名前を調べてみます。python_code_interpreter.py のメッセージを以下に変更します。

```python
message = "./sample_data/chinook.db のsqlite3データベースから、最も多くのトラックを持つアルバムの名前を調べてください。"

```

実行します。

```sh
python python_code_interpreter.py
```

追加の質問があれば、実行の途中で入力してください。終了するときはexitと入力します。

grok-3の結果をこちらに置いておきました。

https://github.com/KentaroAOKI/python_code_interpreter/blob/main/sample_results/sqlite3_grok-3.ipynb

アルバムごとのトラック数をカウントして2番目にトラック数が多いアルバムを取得するクエリも書いてくれます。
```python
query = '''
SELECT a.Title, COUNT(t.TrackId) as TrackCount
FROM albums a
JOIN tracks t ON a.AlbumId = t.AlbumId
GROUP BY a.AlbumId, a.Title
ORDER BY TrackCount DESC
LIMIT 1 OFFSET 1
'''
```

グラフも書いてくれますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/2e9d3b66-4d93-4835-9bac-d33131f0e4c9.png)


ついでに、gpt-4.1の結果も置いておきます。

https://github.com/KentaroAOKI/python_code_interpreter/blob/main/sample_results/sqlite3_gpt-4.1.ipynb

エラーが出た後に、テーブルの一覧を取得してやり直すところとかいいですねー。

```python
import sqlite3

db_path = './sample_data/chinook.db'
conn = sqlite3.connect(db_path)
cursor = conn.cursor()

# テーブル一覧取得
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = cursor.fetchall()

cursor.close()
conn.close()
tables
```

```
データベースには「albums」「tracks」などのテーブルが存在しています。  
先ほどのクエリで使った「Album」「Track」は正しくは「albums」「tracks」と小文字になっています。

これを踏まえて、最も多くのトラックを持つアルバム名を調べます。
```

ついでに、o4-miniの結果も置いておきます。

https://github.com/KentaroAOKI/python_code_interpreter/blob/main/sample_results/sqlite3_o4-mini.ipynb

o4-miniは、依頼に忠実ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32580/c7d8282a-9657-4e7f-9849-1530a2e4e85a.png)

実行するたびに結果に辿り着く手法が違うので、何度も試してみると面白いと思います。また、モデルごとの特徴も見えてきますね。

# さいごに
grok-3いいですね。人間がわかりやすいような結果を返してきてくれます。今回は有名なチュートリアルだったため、データベースの構造を確認せずSQLを作成していましたが、エラーになったときはどのような動作をするのか気になるところです。
（gpt-4.1やo4-miniなどOpenAIのモデルは、エラー時にテーブルの構造を確認するので安心して使ってます）