見出し画像

[API開発の効率化へ]OpenAIのStructured Outputsで出力管理をもっと簡単に

生成AIを使ったソフトウェア開発では、出力データのフォーマット調整が非常に重要です。以前は、JSON形式でデータを受け取るために「Function Calling」が必要でしたが、「Structured Outputs」の登場により、それが不要になり、開発効率が向上しました。


Structured Outputsとは?

OpenAIの「Structured Outputs」は、データの形式を事前に指定し、APIが常にそのフォーマットで出力を返すことを保証する機能です。

下記のように、gpt-4o-2024-08-06で「Structured Outputs」を利用するとJSONで100%出力するようになりました。

JSON出力の保証(OpenAIのWebサイトより)

たとえば、顧客の情報を毎回正しいフォーマットで受け取ることができ、データの一貫性を保ちながらスムーズに開発が進められます。

Function Callingとの違い

これまでは、JSON形式のような特定のフォーマットで出力を保証するには下記の記事でご紹介しているFunction Callingが必要でした。Function Callingは動的なデータ処理に使われ、ユーザーがカレンダーに予定を追加するようなリクエストに適しています。

しかし、Structured Outputsでは指定したフォーマットでデータを直接受け取れるため、関数を呼び出す手間が省け、出力データの管理がより簡単になります。

Structured OutputsとFunction Callingの使い分け

Function Callingが適している場合

Function Callingは、動的なデータの取得や処理が必要な場合に適しています。例えば、ユーザーが「次の会議をカレンダーに追加して」と指示した場合、Function Callingを使えばカレンダーAPIにアクセスし、予定を追加することができます。

Structured Outputsが適している場合

一方で、定型的なデータ処理が必要な場合にはStructured Outputsが適しています。たとえば、顧客の名前や住所といった情報を毎回JSON形式で受け取る必要がある場合、Structured Outputsを使えば、Function Callingを使用せずに決まったフォーマットでデータを受け取ることができます。

構造化の使い分け

簡単に使えるStructured Outputsの使い方

以下は、Pythonコードを使ってStructured Outputsを実装し、ユーザーが勉強したい科目とその理由をJSON形式で正確に受け取る例です。

from openai import OpenAI
import json

# OpenAIのAPIキーを入力
client = OpenAI(api_key="sk-xxx")

# ユーザ情報をjson形式に変換
def get_user_info(name):
    return json.dumps({"name": name})

def run_conversation():
    # システムメッセージとユーザーメッセージを定義
    messages = [
        {"role": "system", "content": "あなたは役立つアシスタントです。生徒が勉強したい科目とその理由を教えてください。"},
        {"role": "user", "content": "将来科学者になりたいから、理科を勉強したい。"}
    ]

    # レスポンスフォーマットを定義
    response_format = {
        "type": "json_schema",
        "json_schema": {
            "name": "subject_response",
            "strict": True,
            "schema": {
                "type": "object",
                "properties": {
                    "subject": {"type": "string", "description": "科目"},
                    "reason": {"type": "string", "description": "理由"}
                },
                "required": ["subject", "reason"],
                "additionalProperties": False,
            }
        }
    }

    # ChatGPTにリクエストを送信
    response = client.chat.completions.create(
        model="gpt-4o-2024-08-06",
        messages=messages,
        response_format=response_format
    )

    # レスポンスを解析して結果を表示
    content = json.loads(response.choices[0].message.content)
    print(f"科目:{content['subject']}")
    print(f"理由:{content['reason']}")

    return content

if __name__ == "__main__":
    run_conversation()

出力結果は次のようになります。

% python structed_outputs.py
科目:理科
理由:将来科学者になりたい

このコードを使えば、ユーザーのリクエストに応じた情報をJSON形式で正確に受け取ることができ、Structured Outputsの利便性を実感できます。従来はFunction Callingを使っていた場面でも、Structured Outputsを利用することで、手軽にデータを管理できるのが大きなメリットです。

まとめ

Structured Outputsの登場により、開発者は関数呼び出しを省略しても、データの整合性を保つことができるようになりました。API開発の効率がさらに向上し、データ管理が簡単にできるこの機能は、今後のAPI開発において重要なツールとなるでしょう。特に、定型的なデータ処理やフォーマット管理が求められるプロジェクトには、Structured Outputsの利用が推奨されます。



この記事が気に入ったらサポートをしてみませんか?