見出し画像

[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の利用が推奨されます。



いいなと思ったら応援しよう!

ピックアップされています

ChatGPT 記事まとめ

  • 6,229本

コメント

ログイン または 会員登録 するとコメントできます。
[API開発の効率化へ]OpenAIのStructured Outputsで出力管理をもっと簡単に|Masa
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1