メむンコンテンツぞスキップ
芋出し画像

OpenAI Responses API 入門 (8) - Reasoningモデル

    「Responses API」の「Reasoningモデル」぀いおたずめたした。

    ・Reasoning models

    前回

    1. Reasoningモデル

    「Reasoningモデル」(o1、o3-miniなど)は、耇雑な掚論を実行するために匷化孊習された新しいLLMモデルです。「Reasoningモデル」は答える前に考え、ナヌザヌに応答する前に長い内郚思考チェヌンを生成したす。そのため、耇雑な問題解決、コヌディング、科孊的掚論、゚ヌゞェントワヌクフロヌのマルチステップ蚈画に優れおいたす。

    2. OpenAI API の準備

    「Google Colab」での「OpenAI API」の準備手順は次のずおりです。

    (1) パッケヌゞのむンストヌル。
    「Responses API」ず「Agent SDK」のパッケヌゞをむンストヌルしたす。

    # パッケヌゞのむンストヌル
    !pip install -U openai openai-agents

    (2) 環境倉数の準備。
    巊端の鍵アむコンで「OPENAI_API_KEY」を蚭定しおから、以䞋のセルを実行しおください。

    import os
    from google.colab import userdata
    
    # 環境倉数の準備 (巊端の鍵アむコンでOPENAI_API_KEYを蚭定)
    os.environ["OPENAI_API_KEY"] = userdata.get("OPENAI_API_KEY")

    (3) クラむアントの準備。

    from openai import OpenAI
    
    # クラむアントの準備
    client = OpenAI()

    3. Reasoningモデルの実行

    (1) メッセヌゞリストの準備

    # メッセヌゞリストの準備
    messages = [
        {
            "role": "user", 
            "content": "[1,2],[3,4],[5,6]' ずいう圢匏の文字列ずしお衚される行列を受け取り、同じ圢匏で転眮を出力するbashスクリプトを䜜成しおください。"
        }    
    ]

    (2) 掚論の実行。

    # 掚論の実行
    response = client.responses.create(
        model="o3-mini",
        reasoning={"effort": "medium"},
        input=messages
    )
    print(response.output_text)
    次のような bash スクリプト䟋をご参考ください。このスクリプトは、匕数ずしお
      "[1,2],[3,4],[5,6]"
    のような文字列を受け取り、行列の転眮この堎合は "[1,3,5],[2,4,6]"を同じ圢匏で出力したす。
    
    内容は以䞋の通りです。
    
    ------------------------------------------------
    #!/bin/bash
    # 䜿い方:
    #   ./transpose.sh "[1,2],[3,4],[5,6]"
    #
    # 入力は "[数字,数字],...[数字,数字]" ずいう圢匏を期埅しおいたす。
    
    if [ "$#" -eq 0 ]; then
        echo "Usage: $0 '[1,2],[3,4],[5,6]'"
        exit 1
    fi
    
    # 匕数から入力行列の文字列を取埗
    input="$1"
    
    # 䜙蚈な空癜やシングルダブルクォヌトがあれば陀去
    matrix=$(echo "$input" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//; s/^[\'"]*//; s/[\'"]*$//')
    
    # 行の区切り "],[" を改行に倉換し、先頭の "[" ず末尟の "]" を陀去しお
    # 行ごずに「1,2」などの圢匏にしたす。
    rows=$(echo "$matrix" | sed 's/],\[/\n/g; s/^\[//; s/\]$//')
    
    # awk を甚いお転眮を実斜
    # ・各行をコンマ区切りで分割し、配列 a[行番号, 列番号] に栌玍
    # ・党䜓の行数ず各行の列数max 列数を蚘録
    # ・転眮では元の列数を新しい行数、元の行数を新しい列数ずしお出力
    transposed=$(echo "$rows" | awk -F, '
    {
        for (i = 1; i <= NF; i++) {
            a[NR, i] = $i
        }
        if (NF > max) {
            max = NF
        }
        rows = NR
    }
    END {
        output = ""
        for (i = 1; i <= max; i++) {
            line = "["
            for (j = 1; j <= rows; j++) {
                line = line a[j, i] (j < rows ? "," : "")
            }
            line = line "]"
            output = output (i < max ? line "," : line)
        }
        print output
    }')
    
    # 結果を衚瀺
    echo "$transposed"
    
    ------------------------------------------------
    
    スクリプトの解説
    1. sed によっお入力文字列の前埌の䞍芁な空癜やクォヌトを陀去し、
       たた "],[” を改行に眮換しお各行に「1,2」のような文字列が入るように敎圢したす。
    2. awk はフィヌルド区切り文字をコンマ (,) にしお各行を分解し、
       2 次元配列 a[行,列] に倀を栌玍したす。
    3. END ブロックで転眮を行い、各新しい行元の列の数倀を "[" ず "]" で囲み、
       行同士はコンマで連結しお最終的な文字列ずしお出力したす。
    
    実行䟋:
    $ ./transpose.sh "[1,2],[3,4],[5,6]"
    [1,3,5],[2,4,6]
    
    これで、入力された行列の転眮を同じ圢匏で出力するこずができたす。

    䞊蚘の䟋では、「reasoning_effort」は、プロンプトぞの応答を䜜成する前にモデルが生成すべきReasoningトヌクンの数に関するガむダンスを提䟛するために䜿甚されたす。このパラメヌタには、low、medium、high のいずれかを指定できたす。low は速床ずトヌクンの経枈的な䜿甚を優先し、high はより倚くのトヌクンが生成され、応答が遅くなるこずを犠牲にしお、より完党な掚論を優先したす。デフォルト倀は medium で、速床ず掚論の粟床のバランスが取れおいたす。

    4. Reasoningのしくみ

    4-1. Reasoningのしくみ

    「Reasoningモデル」では、入力トヌクンず出力トヌクンに加えおReasoningトヌクンが導入されおいたす。モデルはこれらのReasoningトヌクンを䜿甚しお「考える」ため、プロンプトの理解を分解し、応答を生成するための耇数のアプロヌチを怜蚎したす。Reasoningトヌクンを生成した埌、モデルは目に芋えるCompletionトヌクンずしお回答を生成し、Reasoningトヌクンをコンテキストから砎棄したす。

    ナヌザヌずアシスタント間の耇数ステップの䌚話の䟋を次に瀺したす。各ステップの入力トヌクンず出力トヌクンは匕き継がれ、掚論トヌクンは砎棄されたす。

    画像

    Reasoningトヌクンは API 経由では衚瀺されたせんが、モデルのコンテキストりィンドり内のスペヌスを占有し、出力トヌクンずしお課金されたす。

    4-2. コンテキストりィンドりの管理

    応答を䜜成するずきに、コンテキストりィンドりにReasoningトヌクン甚の十分なスペヌスがあるこずを確認するこずが重芁です。問題の耇雑さに応じお、モデルは数癟から数䞇のReasoningトヌクンを生成する堎合がありたす。䜿甚されるReasoningトヌクンの正確な数は、応答オブゞェクトの䜿甚状況オブゞェクトの output_tokens_details の䞋に衚瀺されたす。

    (1) 䜿甚状況の確認。

    # 䜿甚状況の確認
    print(response.usage)
    ResponseUsage(
        input_tokens=115, 
        output_tokens=2359, 
        output_tokens_details=OutputTokensDetails(
            reasoning_tokens=1536
        ), 
        total_tokens=2474, 
        input_tokens_details={'cached_tokens': 0}
    )

    4-3. コストの管理

    Reasoningモデルでコストを管理するには、max_output_tokens を䜿甚しお、モデルが生成するトヌクンの合蚈数 (Reasoningトヌクンず最終出力トヌクンの䞡方を含む) を制限できたす。

    4-4. Reasoning甚のスペヌスの割り圓お

    生成されたトヌクンがコンテキストりィンドりの制限たたは蚭定した max_output_tokens 倀に達するず、ステヌタスが incomplete で incomplete_details の応答が返され、reason は max_output_tokens に蚭定されたす。これは、目に芋える出力トヌクンが生成される前に発生する可胜性がありたす。぀たり、目に芋える応答を受信せずに、入力トヌクンずReasoningトヌクンのコストが発生する可胜性がありたす。

    これを防ぐには、コンテキストりィンドりに十分なスペヌスがあるこずを確認するか、max_output_tokens 倀をより高い数倀に調敎したす。OpenAI では、これらのモデルで実隓を開始するずきに、Reasoningず出力甚に少なくずも 25,000 トヌクンを予玄するこずを掚奚しおいたす。プロンプトに必芁なReasoningトヌクンの数に慣れおきたら、それに応じおこのバッファを調敎できたす。

    (1) 出力トヌクン数を制限しお掚論の実行。

    # 掚論の実行
    response = client.responses.create(
        model="o3-mini",
        reasoning={"effort": "medium"},
        input=messages,
        max_output_tokens=300, # 出力トヌクン数の制限
    )
    
    if response.status == "incomplete" and response.incomplete_details.reason == "max_output_tokens":
        print("トヌクンがなくなった。")
        if response.output_text:
            print("郚分出力:", response.output_text)
        else: 
            print("Reasoning䞭にトヌクンがなくなった。")

    トヌクンがなくなった。
    Reasoning䞭にトヌクンがなくなった。

    5. プロンプトのアドバむス

    「Reasoningモデル」ず「 GPTモデル」をプロンプトする堎合、考慮すべき違いがいく぀かありたす。䞀般的に、「Reasoningモデル」は、高レベルのガむダンスのみでタスクに察しおより良い結果を提䟛したす。これは、非垞に正確な指瀺の恩恵を受けるこずが倚い「GPTモデル」ずは倚少異なりたす。

    ・「Reasoningモデル」は、䞊玚の同僚のようなものです。達成すべき目暙を䞎えお、詳现を解決しおくれるず信頌できたす。
    ・「GPTモデル」は、埌茩の同僚のようなものです。特定の出力を䜜成するための明瀺的な指瀺があれば、最高のパフォヌマンスを発揮したす。

    Reasoningモデルを䜿甚する際のベストプラクティスの詳现に぀いおは、このガむドを参照しおください。

    次回



     
     

    npaka

     
     
    プログラマヌ。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガゞェット。幎2冊ペヌスで技術曞を執筆。アニ゜ン / カラオケ / ギタヌ / 猫 twitter : @npaka123

    あなたぞのおすすめ