Agent学习记录四:多工具时如何处理

因为不会只问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)
相关推荐
李少兄1 小时前
Java 中只有值传递吗?
java·开发语言·python
DigitalOcean1 小时前
Omarchy 将研发基础设施迁移至 DigitalOcean 云平台
linux·agent
我有满天星辰1 小时前
第一次使用 Milvus:给我的 AI 知识库装上“记忆”
人工智能·milvus
云烟成雨TD1 小时前
LlamaIndex 系列【24】检索增强策略:交叉编码器(Cross‑Encoder)
ai·agent·rag·llamaindex
名字还没想好☜1 小时前
Spring @EventListener 事件驱动解耦实战:同步转异步、事务绑定与顺序控制
java·数据库·后端·python·spring
YOLO数据集集合1 小时前
天空反无人机检测数据集 | 无人机检测 多旋翼识别 固定翼识别 低空安防 目标检测9063期
人工智能·yolo·目标检测·计算机视觉·无人机·反无人机
一木 之林1 小时前
插件、MCP、Skill 的区别?
java·c++·人工智能