【Python】OpenAI API Structured Outputs：精密な構造化データ生成

# はじめに
今回は、先日（2024年8月6日）リリースしたOpenAIが提供する画期的な機能「Structured Outputs」について詳しく解説します。
この機能を使えば、AIモデルから精密に構造化されたJSONデータを簡単に生成できるんです。
さらに、Pydanticと組み合わせることで、型安全性も確保できるという優れものです。

## Structured Outputsとは
Structured Outputsは、AIモデルに特定の構造（スキーマ）を指定し、その構造に厳密に従ったデータを生成させる機能です。
これにより、開発者は予測可能で一貫性のあるデータ構造を得ることができます。

## 実装例
それでは、実際にStructured Outputsを使って、AIにユーザープロフィールを生成させてみましょう。

### 1. ライブラリのインポート
まずは必要なライブラリをインポートします。
```python
import openai
from openai import OpenAI
from pydantic import BaseModel, Field
from typing import List, Optional
```

### 2. データ構造の定義（Pydanticモデル）
次に、Pydanticを使ってデータ構造を定義します。
```python
class User(BaseModel):
    id: int = Field(description="ユーザーの一意のID")
    username: str = Field(description="ユーザー名")
    full_name: Optional[str] = Field(description="ユーザーのフルネーム")
    is_active: bool = Field(description="ユーザーがアクティブかどうか")
    tags: List[str] = Field(default_factory=list, description="ユーザーに関連するタグ")
    score: float = Field(description="ユーザーのスコア")
```

### 3. OpenAI APIを使用したデータ生成
最後に、OpenAI APIを使ってデータを生成します。
```python
client = OpenAI()
try:
    completion = client.beta.chat.completions.parse(
        model="gpt-4o-2024-08-06",
        messages=[
            {"role": "system", "content": "与えられた構造に基づいて現実的なユーザー情報を生成してください。"},
            {"role": "user", "content": "20代後半の日本人女性のITエンジニア志望者のプロフィールを生成してください。"}
        ],
        tools=[
            openai.pydantic_function_tool(User),
        ],
    )
    user_profile = completion.choices[0].message.tool_calls[0].function.parsed_arguments
    print(user_profile)
    print(user_profile.dict())
except Exception as e:
    print(f"エラーが発生しました: {e}")
```

## コードの解説
1. **Pydanticモデル**: `User`クラスでデータ構造を定義し、型安全性を確保
2. **OpenAI API呼び出し**: `client.beta.chat.completions.parse()`メソッドを使ってAIモデルにデータ生成を要求
3. **Structured Outputs**: `tools`パラメータで有効化し、指定した構造に従ったJSONデータを生成
4. **結果取得**: 生成されたデータをPydanticモデルのインスタンスとして取得

## Structured Outputsの利点
1. **データ構造の保証**: 指定した構造に厳密に従ったデータを生成
2. **型安全性**: Pydanticと組み合わせることで、静的型チェックが可能
3. **柔軟性と制御**: 必要なデータ構造を自由に定義可能
4. **開発効率の向上**: 構造化されたデータを簡単に生成できるため、開発プロセスを効率化

## `MosaicAI`でさらに簡単に構造化データ生成
`MosaicAI`というライブラリを使用すれば、さらに簡単に構造化されたJSONデータを出力できますので試してください。

* 紹介記事
    * https://qiita.com/syukan3/items/d810f727ad223e2d60d5
* GitHub
    * https://github.com/syukan3/MosaicAI


MosaicAIをインストールし、以下のサンプルコードを実行すると構造化データを生成することができます。

```
$ pip install mosaicai
```

```python
from mosaicai import MosaicAI

# クライアントの初期化
client = MosaicAI(model="gpt-4o-2024-08-06")

response = client.generate_json("20代後半の日本人女性のITエンジニア志望者のプロフィールを生成してください。", User)
print(response)
```

ぜひ試してみてください。

# まとめ
Structured Outputsは、AIによる構造化データ生成の新たな可能性を開きました。
正確で一貫性のあるデータを簡単に生成でき、Pydanticとの組み合わせで型安全性も確保できます。
わずか数行のコードで実現できるこの機能は、データ駆動型アプリケーション開発やテスト環境構築など、幅広く活用できます。
ぜひ皆さんのプロジェクトでStructured Outputsを試してみてください。

# 参考
* Introducing Structured Outputs in the API
    * https://openai.com/index/introducing-structured-outputs-in-the-api/
* OpenAI API Documentation
    * https://platform.openai.com/docs/api-reference
* Pydantic Documentation
    * https://docs.pydantic.dev/latest/

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/