2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-08-18

はじめに

今回は、先日(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}")

コードの解説

  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データを出力できますので試してください。

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を試してみてください。

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?