
OpenAI Responses API å ¥é (4) - Function Calling
ãResponses APIãã®ã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}¤t=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. ããŒã¯ã³ã®äœ¿çš
å éšçã«ã¯ã颿°ã¯ã¢ãã«ãåŠç¿ãããæ§æã§ã·ã¹ãã ã¡ãã»ãŒãžã«æ¿å ¥ãããŸããã€ãŸãã颿°ã¯ã¢ãã«ã®ã³ã³ããã¹ãå¶éã«ã«ãŠã³ããããå ¥åããŒã¯ã³ãšããŠèª²éãããŸããããŒã¯ã³å¶éã«éããå Žåã¯ã颿°ã®æ°ãå¶éãããã颿°ãã©ã¡ãŒã¿ã«æå®ãã説æã®é·ããå¶éããããšãæšå¥šããŸãã
ããŒã«ä»æ§ã§å€ãã®é¢æ°ãå®çŸ©ãããŠããå Žåã¯ããã¡ã€ã³ãã¥ãŒãã³ã°ã䜿çšããŠã䜿çšãããããŒã¯ã³ã®æ°ãæžããããšãã§ããŸãã