ããŒã«åŒã³åºãïŒTool CallingïŒãå®è£ ããïŒ4ã¹ãããã®åŸåŸ©
ããŒã«åŒã³åºãã§ãã¡ã°ã誀解ãããŠããã®ã¯ããã¢ãã«ã颿°ãå®è¡ããŠãããããšããç¹ã§ãã ã¢ãã«ã¯å®è¡ããŸãããã¢ãã«ãããã®ã¯ããã®é¢æ°ãããã®åŒæ°ã§åŒãã§ã»ããããšããJSONãè¿ãããšã ãã§ãå®è¡ããã®ã¯èªåã®ã³ãŒãã§ãã
ãã®æ§é ããæŽãã°å®è£ ã¯åçŽãªåŸåŸ©ã«ãªããŸãããã®èšäºã§ã¯ãåãã³ãŒãã§4ã¹ãããã®ã«ãŒããçµã¿ç«ãŠãŸããæŠå¿µçãªèª¬æã¯Function callingãšã¯ã«ããã®ã§ãããã§ã¯å®è£ ã«éäžããŸãã
4ã¹ãããã®åŸåŸ©
1. tools ãä»ããŠãªã¯ãšã¹ã
â
2. ã¢ãã«ã tool_calls ãè¿ãïŒfinish_reason: "tool_calls"ïŒ
â
3. èªåã®ã³ãŒãã§é¢æ°ãå®è¡
â
4. çµæã role: "tool" ã§è¿ããããäžåºŠãªã¯ãšã¹ã â æçµçãªæç« ãè¿ã
ãã€ã³ãã¯ã2åãªã¯ãšã¹ããéãããšã§ãã1åç®ã§ã¢ãã«ã«ãäœãåŒã³ãããããèãã2åç®ã§ãçµæãèžãŸããçãããããããŸãã
ã¹ããã1ïŒããŒã«ãå®çŸ©ãã
tools ã«JSON Schemaã§é¢æ°ã宣èšããŸãã
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "æå®ããéœåžã®çŸåšã®å€©æ°ãååŸãã",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "éœåžå"},
},
"required": ["city"],
},
},
}
]
description ã¯é£Ÿãã§ã¯ãããŸãããã¢ãã«ã¯èª¬ææãèªãã§åŒã¶ãã©ããã倿ããŸããããã€äœ¿ã颿°ãªã®ãããäŒããæã«ããŠãã ãããåŒæ°ã® description ãåãã§ããããææ§ã ãšåŒæ°ã®åãéããèµ·ããŸãã
ã¹ããã2ïŒtool_callsãåãåã
from openai import OpenAI
client = OpenAI(
api_key="<FASTMETAL_API_KEY>",
base_url="https://api.fastmetal.ai/v1",
)
messages = [{"role": "user", "content": "æ±äº¬ã®å€©æ°ã調ã¹ãŠ"}]
resp = client.chat.completions.create(
model="gemini-flash-lite-free",
max_tokens=300,
messages=messages,
tools=tools,
)
print(resp.choices[0].finish_reason)
print(resp.choices[0].message.tool_calls)
è¿ã£ãŠããã®ã¯ãã®åœ¢ã§ãïŒ2026幎8æ29æ¥ã«å®æž¬ããå¿çãããèŠç¹ãæç²ïŒã
{
"finish_reason": "tool_calls",
"message": {
"role": "assistant",
"tool_calls": [
{
"id": "call_247545",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\": \"æ±äº¬\"}"
}
}
]
}
}
èŠãã¹ãã¯3ã€ã§ãã
finish_reasonãtool_callsâ ãããããŒã«ãåŒã³ãããšããåå³ã§ããstopãªãã¢ãã«ã¯ãã®ãŸãŸçããŠããã®ã§ãããŒã«ã®åºçªã¯ãããŸããargumentsã¯æåå â ãªããžã§ã¯ãã§ã¯ãªãJSONæååãªã®ã§ãjson.loads()ã§ããŒã¹ããŸãidâ ã¹ããã4ã§çµæãè¿ããšãã«ããã®idã§å¯Ÿå¿ä»ããŸã
ã¹ããã3ïŒèªåã®ã³ãŒãã§å®è¡ãã
ããã¯ãã ã®ãã£ã¹ãããã§ãã
import json
def get_weather(city: str) -> dict:
# å®éã«ã¯å€©æ°APIãåŒã¶
return {"city": city, "temp_c": 28, "condition": "æŽã"}
AVAILABLE = {"get_weather": get_weather}
ã¢ãã«ãè¿ãã颿°åãšåŒæ°ããã®ãŸãŸä¿¡çšããªãã§ãã ããã ååšããªã颿°åãè¿ãããšããå¿ é ã®åŒæ°ãæ¬ ããããšããããŸããåŒã³åºãåã«ååãæ¢ç¥ãã確èªããåŒæ°ãæ€èšŒããŠãã ãããããã¯ããã³ããã€ã³ãžã§ã¯ã·ã§ã³å¯ŸçãšããŠãéèŠã§ãïŒé¢é£èšäºïŒã
ã¹ããã4ïŒçµæãè¿ããŠãããäžåºŠåŒã¶
assistant ã®ã¡ãã»ãŒãžïŒtool_calls ãå«ããã®ïŒãå±¥æŽã«ç©ãã§ãããrole: "tool" ã§çµæãè¿ããŸãã
msg = resp.choices[0].message
if msg.tool_calls:
messages.append(msg) # tool_calls ãå«ã assistant ã¡ãã»ãŒãž
for call in msg.tool_calls:
fn = AVAILABLE.get(call.function.name)
if fn is None:
result = {"error": f"unknown function: {call.function.name}"}
else:
args = json.loads(call.function.arguments)
result = fn(**args)
messages.append({
"role": "tool",
"tool_call_id": call.id, # â 1åç®ã® id ãšäžèŽããã
"content": json.dumps(result, ensure_ascii=False),
})
final = client.chat.completions.create(
model="gemini-flash-lite-free",
max_tokens=300,
messages=messages,
tools=tools,
)
print(final.choices[0].message.content)
tool_call_id ã®å¯Ÿå¿ä»ããééãããšãã¢ãã«ã¯ã©ã®çµæãã©ã®åŒã³åºãã®ãã®ãåãããªããªããŸããtool_calls ãè€æ°è¿ãããšãããã®ã§ãå¿
ãã«ãŒãã§å
šä»¶è¿ããŠãã ããã1ä»¶ã§ãæ¬ ãããšãšã©ãŒã«ãªãã¢ãã«ããããŸãã
ã«ãŒãã«ãŸãšãã
å®åã§ã¯ãã¢ãã«ãããŒã«ãåŒã°ãªããªããŸã§ç¹°ãè¿ããŸãã
def run(user_message: str, model: str = "gemini-flash-lite-free", max_turns: int = 5):
messages = [{"role": "user", "content": user_message}]
for _ in range(max_turns):
resp = client.chat.completions.create(
model=model, max_tokens=500, messages=messages, tools=tools,
)
msg = resp.choices[0].message
if not msg.tool_calls:
return msg.content
messages.append(msg)
for call in msg.tool_calls:
fn = AVAILABLE.get(call.function.name)
result = fn(**json.loads(call.function.arguments)) if fn else {"error": "unknown"}
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": json.dumps(result, ensure_ascii=False),
})
return "ããŒã«åŒã³åºããäžéã«éããŸãã"
max_turns ã¯å¿
ãå
¥ããŠãã ããã ããŒã«ãæåŸ
ããçµæãè¿ããªããšãã¢ãã«ãåãåŒã³åºããç¹°ãè¿ããŠæ¢ãŸããªããªãããšããããŸããäžéããªããšèª²éãå»¶ã
ãšç©ã¿äžãããŸãã
ãã®ã«ãŒã㯠model ãå·®ãæ¿ããã ãã§å¥ã®ã¢ãã«ã§ãåããŸãããããOpenAIäºæã®ã²ãŒããŠã§ã€ãæãå©ç¹ã§ããã©ã®ã¢ãã«ãããŒã«åŒã³åºãã«å¯Ÿå¿ããŠãããã¯ã¢ãã«ã«ã¿ãã°ã§ç¢ºèªã§ããŸãã
ããŒã«å®çŸ©ãããŒã¯ã³ãæ¶è²»ããŸã
èŠèœãšãããã¡ã§ãããtools ã¯ããã³ããã®äžéšãšããŠæ¯åéãããŸãã
äžã® get_weatherïŒåŒæ°1ã€ïŒã§å®æž¬ãããšãåã質åæã«å¯ŸããŠæ¬¡ã®å·®ãåºãŸããïŒ2026幎8æ29æ¥ãgemini-flash-lite-freeïŒã
| ãªã¯ãšã¹ã | prompt_tokens |
|---|---|
tools ãªã | 6 |
tools ããïŒé¢æ°1ã€ïŒ | 59 |
ããŒã«å®çŸ©1ã€ã§ +53ããŒã¯ã³ ã§ãã颿°ã10åããã°æ°çŸããŒã¯ã³ãæ¯ãªã¯ãšã¹ãä¹ããã«ãŒãã5åŸåŸ©ããã°ãã®ã¶ãæãç®ã«ãªããŸãã
察çã¯åçŽã§ããã®å Žé¢ã§äœ¿ãåŸãããŒã«ã ããæž¡ãããšã§ããå šããŒã«ãåžžã«æž¡ãå®è£ ã¯ãåãã¯ããŸããã³ã¹ããç·åœ¢ã«å¢ããŸããã³ã¹ãå šè¬ã®èãæ¹ã¯LLM APIã®ã³ã¹ããäžãã7ã€ã®æ¹æ³ã«ãŸãšããŠããŸãã
ã€ãŸãããããç¹
arguments ããªããžã§ã¯ããšããŠæ±ã£ãŠããŸã
JSONæååã§ããjson.loads() ãå¿
èŠã§ãã
assistant ã¡ãã»ãŒãžãå±¥æŽã«ç©ã¿å¿ãã
role: "tool" ãè¿ãåã«ãtool_calls ãå«ã assistant ã¡ãã»ãŒãžãå±¥æŽã«å
¥ããå¿
èŠããããŸãããããé£ã°ããšãã¢ãã«ããèŠãŠãåŒãã§ããªã颿°ã®çµæããå±ãããšã«ãªããŸãã
tool_call_id ãè¿ããŠããªã
å¿
é ã§ããè€æ°åŒã³åºãã®å¯Ÿå¿ä»ããã§ããªããªããŸãã
äžéãä»ããã«ã«ãŒãããã
ç¡éã«ãŒãã¯æ®é«ãå°œãããŸã§æ¢ãŸããŸãããmax_turns ãå¿
ãå
¥ããŠãã ããã
åŒæ°ãæ€èšŒããŠããªã ã¢ãã«ã®åºåã¯ãŠãŒã¶ãŒå ¥åãšåãæ±ãã§æ€èšŒããŠãã ããããã¡ã€ã«åé€ãã¡ãŒã«éä¿¡ã®ãããªå¯äœçšã®ãã颿°ã¯ç¹ã«æ éã«ã
次ã®ã¹ããã
ããŒã«ã䜿ããåºåã®åœ¢ã ãåºå®ãããå Žåã¯ãæ§é ååºåïŒJSONïŒã®ã»ããç°¡åã§ããã颿°ãåŒã³ããã®ããJSONãæ¬²ããã ããªã®ãããæåã«åãåããŠãã ããã
æ¢è£œã®ããŒã«çŸ€ããšãŒãžã§ã³ãã«æž¡ãããå Žåã¯ãMCPãšããéžæè¢ããããŸããFastMetalã¯MCPãµãŒããŒãæäŸããŠããŸãã
ãããã質å
Q. ã¢ãã«ã颿°ãå®è¡ããŠãããã®ã§ããïŒ
ããããã¢ãã«ã¯ããã®é¢æ°ããã®åŒæ°ã§åŒã³ããããšããJSONãè¿ãã ãã§ããå®è¡ããã®ã¯èªåã®ã³ãŒãã§ãçµæã role: "tool" ã§è¿ããŠåããŠæçµçãªåçãåŸãããŸãã
Q. ããŒã«åŒã³åºãã¯ç¡æã¢ãã«ã§ã䜿ããŸããïŒ
䜿ããŸãããã®èšäºã®ã³ãŒã㯠gemini-flash-lite-free ã§å®éã«åäœã確èªããŠããŸãããã ãç¡æã¢ãã«ã«ã¯ã¬ãŒãå¶éããããã«ãŒãã¯åŸåŸ©ã¶ããªã¯ãšã¹ããæ¶è²»ããŸãã
Q. tools ãæž¡ããšã³ã¹ãã¯å¢ããŸããïŒ
å¢ããŸããããŒã«å®çŸ©ã¯æ¯ãªã¯ãšã¹ãã®ããã³ããã«å«ãŸããŸããåŒæ°1ã€ã®å°ããªé¢æ°ã§+53ããŒã¯ã³ã宿ž¬ããŸããã䜿ãå¯èœæ§ã®ããããŒã«ã ããæž¡ããŠãã ããã
Q. ã©ã®ã¢ãã«ãããŒã«åŒã³åºãã«å¯Ÿå¿ããŠããŸããïŒ
äž»èŠãªã¢ãã«ã¯æŠã察å¿ããŠããŸããã¢ãã«ã«ã¿ãã°ã§ç¢ºèªããŠãã ãããmodel ãå·®ãæ¿ããã ãã§åãã³ãŒããåããŸãã
ãŸãšã
ããŒã«åŒã³åºãã¯ãã¢ãã«ãåŒã³ãã颿°ãæãã â èªåã§å®è¡ãã â çµæãè¿ãããšããåŸåŸ©ã§ããfinish_reason ã tool_calls ããèŠãŠãarguments ãããŒã¹ããtool_call_id ã察å¿ãããŠè¿ãããã®3ç¹ãæŒãããã°å®è£
ã¯çµãããŸãã
äžéä»ãã®ã«ãŒãã«ããŠããããšãæž¡ãããŒã«ãçµãããšãå®åäžã®åæã§ãããŸãAPIããŒãååŸããŠãç¡æã¢ãã«ã§åŸåŸ©ã1ååãããŠã¿ãŠãã ããã