因为不会只问Agent一个问题,所以也不会只有一个tool,这一节处理多个tool的情况。
一、定义多个Tool
先定义你的函数,例如实现天气查询
python
def get_weather(city):
return f"{city} 今天晴天,25℃"
前面章节已经展示过tools的组成,根据json的格式可知,tools是可以放入多个函数说明的。
tools = [
{
函数1说明
},{
函数2说明
}
]
函数说明的格式如下:
{
"type": "function",
"name": "函数名 ",
"description": "函数描述 ",
"parameters": {
"type": "object",
"properties": {
"参数1 ": {
"type": "参数类型 ",
"description": "参数说明 "
},
"参数1 ": {
"type": "参数类型 ",
"description": "参数说明 "
}
},
"required": "**参数1** ", "**参数2** ",
"additionalProperties": False
}
}
参数类型:number、string。。。
二、调用Tools
按照之前的方式的话,调用可以这么写
python
for item in response.output:
if item.type == "function_call":
# JSON字符串 → Python字典 加载参数
arguments = json.loads(item.arguments)
if item.name == "calculator":
result = calculator(
arguments["a"],
arguments["b"]
)
elif item.name == "get_weather":
result = get_weather(
arguments["city"]
)
print("========== Tool Result ==========")
print(result)
但是这么写的弊端也明显:麻烦。每增加一个函数就要补一个,所以可以替换为
python
tool_map = {
"calculator": calculator,
"get_weather": get_weather
}
for item in response.output:
if item.type == "function_call":
# JSON字符串 → Python字典 加载参数
arguments = json.loads(item.arguments)
# 找到对应的 Python 函数
function = tool_map[item.name]
# 执行 Python 函数
result = function(**arguments)
print("========== Tool Result ==========")
print(result)
function(**arguments)解释
例如:arguments = { "city": "上海"}
那么function(**arguments)就是get_weather(city="上海")
例如:arguments = { "a": 123, "b": 456 }
那么function(**arguments)就是calculator(a=123, b=456)
三、测试结果
可以随意遂改你的input,例如提问"上海今天的天气"、"23*123=?"。
python
from openai import OpenAI
import json
client = OpenAI()
def calculator(a, b):
return a * b
def get_weather(city):
return f"{city} 今天晴天,25℃"
tools = [
{
"type": "function",
"name": "calculator",
"description": "计算两个数字的乘积",
"parameters": {
"type": "object",
"properties": {
"a": {
"type": "number",
"description": "第一个数字"
},
"b": {
"type": "number",
"description": "第二个数字"
}
},
"required": ["a", "b"],
"additionalProperties": False
}
},{
"type": "function",
"name": "get_weather",
"description": "查询指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
}
},
"required": ["city"],
"additionalProperties": False
}
}
]
# =========================
# 3. 工具名称 -> Python 函数
# =========================
tool_map = {
"calculator": calculator,
"get_weather": get_weather
}
# =========================
# 4. 第一次请求 LLM
# =========================
response = client.responses.create(
model="gpt-5.6-sol",
input="上海今天的天气",
tools=tools,
tool_choice="required"
)
# =========================
# 5. 处理 LLM 返回的 Tool Call
# =========================
for item in response.output:
if item.type == "function_call":
print("========== Tool Call ==========")
print("工具名称:", item.name)
print("参数:", item.arguments)
print("Call ID:", item.call_id)
# JSON字符串 → Python字典 加载参数
arguments = json.loads(item.arguments)
# 找到对应的 Python 函数
function = tool_map[item.name]
# 执行 Python 函数
result = function(**arguments)
print("========== Tool Result ==========")
print(result)
# =========================
# 6. 把工具结果交还给 LLM
# =========================
response2 = client.responses.create(
model="gpt-5.6-sol",
input=[
*response.output,
{
"type": "function_call_output",
"call_id": item.call_id,
"output": str(result)
}
],
tools=tools
)
print("========== Final Answer ==========")
print(response2.output_text)