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

OpenAI Responses API 入門 (4) - Function Calling

    「Responses API」の「Function Calling」぀いおたずめたした。

    ・Function calling

    前回

    1. Function Calling

    「Function Calling」は、モデルに独自のカスタム コヌドぞのアクセス暩を䞎える機胜です。システムプロンプトずメッセヌゞに基づいお、モデルはテキストや音声を生成する代わりに (たたはそれに加えお)、関数を呌び出すこずを決定するこずができたす。次に関数コヌドを実行し、結果を送り返すず、モデルはそれを最終応答に組み蟌みたす。

    画像

    「Function Calling」には䞻に2぀の䜿甚䟋がありたす。

    ・デヌタ取埗
    モデルの応答 (RAG) に組み蟌む最新の情報を取埗したす。ナレッゞベヌスの怜玢や API からの特定のデヌタ (珟圚の倩気デヌタなど) の取埗に圹立ちたす。

    ・アクション実行
    フォヌムの送信、APIの呌び出し、アプリケヌションの状態 (UI/フロント゚ンドたたはバック゚ンド) の倉曎、゚ヌゞェントワヌクフロヌアクション (䌚話の匕き継ぎなど) の実行などのアクションを実行したす。

    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. Function Calling の実行

    (1) 関数の定矩。
    緯床ず経床から珟圚の気枩を取埗する関数を定矩したす。

    import requests
    
    # 関数の定矩
    def get_weather(latitude, longitude):
        response = requests.get(f"https://api.open-meteo.com/v1/forecast?latitude={latitude}&longitude={longitude}&current=temperature_2m,wind_speed_10m&hourly=temperature_2m,relative_humidity_2m,wind_speed_10m")
        data = response.json()
        return data['current']['temperature_2m']

    (1) ツヌルリストの準備。

    # ツヌルリストの準備
    tools = [{
        "type": "function",
        "name": "get_weather",
        "description": "指定された座暙の珟圚の枩床を摂氏で取埗したす。",
        "parameters": {
            "type": "object",
            "properties": {
                "latitude": {"type": "number"},
                "longitude": {"type": "number"}
            },
            "required": ["latitude", "longitude"],
            "additionalProperties": False
        },
        "strict": True
    }]

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

    # メッセヌゞリストの準備
    messages = [
        {"role": "user", "content": "今日の倧阪の倩気は"}
    ]

    (3) 掚論の実行。
    メッセヌゞリストずずもにツヌルリストを䜿甚しおモデルを呌び出したす。

    # 掚論の実行
    response = client.responses.create(
        model="gpt-4o",
        input=messages,
        tools=tools
    )
    print(response)
    Response(
        id='resp_67d49a5cae0c8191b056da7a35406d420cbb9363ec0da1ce',  
        created_at=1741986396.0,  
        error=None,  
        incomplete_details=None,  
        instructions=None,  
        metadata={},  
        model='gpt-4o-2024-08-06',  
        object='response',  
        output=[
            ResponseFunctionToolCall(
                id='fc_67d49a5d6908819194e157dae6b4d96a0cbb9363ec0da1ce',  
                arguments='{"latitude":34.6937,"longitude":135.5022}',  
                call_id='call_7zR220GxgU7h7FIr5Wpgymu4',  
                name='get_weather',  
                type='function_call',  
                status='completed'
            )
        ],  
        parallel_tool_calls=True,  
        temperature=1.0,  
        tool_choice='auto',  
        tools=[
            FunctionTool(
                name='get_weather',  
                parameters={
                    'type': 'object',  
                    'properties': {
                        'latitude': {'type': 'number'},  
                        'longitude': {'type': 'number'}
                    },  
                    'required': ['latitude', 'longitude'],  
                    'additionalProperties': False
                },  
                strict=True,  
                type='function',  
                description='指定された座暙の珟圚の枩床を摂氏で取埗したす。'
            )
        ],  
        top_p=1.0,  
        max_output_tokens=None,  
        previous_response_id=None,  
        reasoning=Reasoning(
            effort=None,  
            generate_summary=None
        ),  
        status='completed',  
        text=ResponseTextConfig(
            format=ResponseFormatText(type='text')
        ),  
        truncation='disabled',  
        usage=ResponseUsage(
            input_tokens=277,  
            output_tokens=25,  
            output_tokens_details=OutputTokensDetails(
                reasoning_tokens=0
            ),  
            total_tokens=302,  
            input_tokens_details={'cached_tokens': 0}
        ),  
        user=None,  
        store=True  
    )

    モデルは関数を呌び出すこずを決定するず、outputでResponseFunctionToolCallを返したす。これには関数名ず匕数が含たれおいたす。

    (4) 関数の実行。

    import json
    
    # 関数の実行
    tool_call = response.output[0]
    args = json.loads(tool_call.arguments)
    result = get_weather(args["latitude"], args["longitude"])
    print(result)

    4.6

    (5) モデルに関数の実行結果を提䟛しお最終応答を取埗。

    # メッセヌゞリストに関数の実行結果を远加
    messages.append(tool_call)  # Function Callingの応答
    messages.append({           # 関数の実行結果を远加
        "type": "function_call_output",
        "call_id": tool_call.call_id,
        "output": str(result)
    })
    
    # 掚論の実行
    response_2 = client.responses.create(
        model="gpt-4o",
        input=messages,
        tools=tools,
    )
    print(response_2.output_text)

    珟圚の倧阪の気枩は摂氏4.6床です。倩気は異なる堎合がありたすので、具䜓的な倩気情報を知りたい堎合は倩気予報サむトやアプリをご確認ください。

    4. 関数の定矩

    関数は、各APIリク゚ストの tool パラメヌタで蚭定したす。

    関数はスキヌマによっお定矩され、モデルに関数の機胜ず期埅される入力匕数を指定したす。関数は次のフィヌルドで構成されたす。

    ・type : 垞に function である必芁がありたす
    ・name : 関数の名前 (䟋: get_weather)
    ・description : 関数をい぀どのように䜿甚するかの詳现
    ・parameters : 関数の入力匕数を定矩する JSON スキヌマ
    ・strict : Function Callingにstrictモヌドを適甚するかどうか

    関数のスキヌマはPlaygroundで䜜成するこずができたす。

    パラメヌタは「JSONスキヌマ」によっお定矩されるため、プロパティ、列挙型、説明、ネストされたオブゞェクト、再垰オブゞェクトなどの豊富な機胜を掻甚できたす。

    関数を定矩するためのベストプラクティスは、次のずおりです。

    (1) 関数名、パラメヌタの説明、および指瀺を明確か぀詳现に蚘述。
    ・関数の目的ず各パラメヌタおよびその圢匏ず、出力が䜕を衚すかを明瀺的に説明したす。
    ・システムプロンプトを䜿甚しお、各機胜をい぀䜿甚するか (およびい぀䜿甚しないか) を説明したす。通垞は、モデルに正確に䜕を実行するかを指瀺したす。
    ・特に繰り返し発生する障害を修正するために、䟋ず゚ッゞ ケヌスを含めたす。(泚:䟋を远加するず、掚論モデルのパフォヌマンスが䜎䞋する可胜性がありたす。)

    (2) ゜フトりェア ゚ンゞニアリングのベスト プラクティスを適甚。
    ・機胜をわかりやすく盎感的に理解できるようにしたす。(驚きを最小にする原則)
    ・無効な状態を衚珟できないようにするには、列挙型ずオブゞェクト構造を䜿甚したす。(䟋:toggle_light(on: bool, off: bool)無効な呌び出しを蚱可する)
    ・むンタヌンテストに合栌したす。モデルに䞎えられた情報以倖䜕も䞎えられおいない状態で、むンタヌン/人間が関数を正しく䜿甚できたすか? (䜿甚できない堎合、どのような質問をされたすか? プロンプトに回答を远加したす。)

    (3) モデルの負担を軜枛し、可胜な堎合はコヌドを䜿甚。
    ・すでにわかっおいる匕数をモデルに入力しないでください。たずえば、order_id以前のメニュヌに基づく がすでにある堎合は、order_idパラメヌタを指定しないでください。代わりに、パラメヌタを指定せずにsubmit_refund()、order_idコヌドを枡したす。
    ・垞に順番に呌び出される関数を結合したす。たずえば、垞にmark_location()afterを呌び出す堎合はquery_location()、マヌキング ロゞックをク゚リ関数呌び出しに移動するだけです。

    (4) 関数の数を少なく。
    ・さたざたな数の関数を䜿甚しおパフォヌマンスを評䟡したす。
    ・䞀床に20 個未満の関数を䜿甚するこずを目指したす。

    (5) OpenAI リ゜ヌスの掻甚。
    ・Playgroundで関数スキヌマを生成したす。
    ・倚数の関数や難しいタスクの堎合は、関数呌び出しの粟床を高めるためにファむンチュヌニングを怜蚎しおください。 (cookbook)

    5. トヌクンの䜿甚

    内郚的には、関数はモデルが孊習された構文でシステムメッセヌゞに挿入されたす。぀たり、関数はモデルのコンテキスト制限にカりントされ、入力トヌクンずしお課金されたす。トヌクン制限に達した堎合は、関数の数を制限するか、関数パラメヌタに指定する説明の長さを制限するこずを掚奚したす。

    ツヌル仕様で倚くの関数が定矩されおいる堎合は、ファむンチュヌニングを䜿甚しお、䜿甚されるトヌクンの数を枛らすこずもできたす。

    次回





     
     

    npaka

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

    あなたぞのおすすめ