はじめに
今回は、先日(2024年8月6日)リリースしたOpenAIが提供する画期的な機能「Structured Outputs」について詳しく解説します。
この機能を使えば、AIモデルから精密に構造化されたJSONデータを簡単に生成できるんです。
さらに、Pydanticと組み合わせることで、型安全性も確保できるという優れものです。
Structured Outputsとは
Structured Outputsは、AIモデルに特定の構造(スキーマ)を指定し、その構造に厳密に従ったデータを生成させる機能です。
これにより、開発者は予測可能で一貫性のあるデータ構造を得ることができます。
実装例
それでは、実際にStructured Outputsを使って、AIにユーザープロフィールを生成させてみましょう。
1. ライブラリのインポート
まずは必要なライブラリをインポートします。
import openai
from openai import OpenAI
from pydantic import BaseModel, Field
from typing import List, Optional
2. データ構造の定義(Pydanticモデル)
次に、Pydanticを使ってデータ構造を定義します。
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を使ってデータを生成します。
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}")
コードの解説
-
Pydanticモデル:
User
クラスでデータ構造を定義し、型安全性を確保 -
OpenAI API呼び出し:
client.beta.chat.completions.parse()
メソッドを使ってAIモデルにデータ生成を要求 -
Structured Outputs:
tools
パラメータで有効化し、指定した構造に従ったJSONデータを生成 - 結果取得: 生成されたデータをPydanticモデルのインスタンスとして取得
Structured Outputsの利点
- データ構造の保証: 指定した構造に厳密に従ったデータを生成
- 型安全性: Pydanticと組み合わせることで、静的型チェックが可能
- 柔軟性と制御: 必要なデータ構造を自由に定義可能
- 開発効率の向上: 構造化されたデータを簡単に生成できるため、開発プロセスを効率化
MosaicAI
でさらに簡単に構造化データ生成
MosaicAI
というライブラリを使用すれば、さらに簡単に構造化されたJSONデータを出力できますので試してください。
- 紹介記事
- GitHub
MosaicAIをインストールし、以下のサンプルコードを実行すると構造化データを生成することができます。
$ pip install mosaicai
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
- OpenAI API Documentation
- Pydantic Documentation