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)
相关推荐
海海不掉头发10 小时前
软件开发方法第七周笔记_CSDN博客
人工智能·笔记·学习·软件工程
虎头金猫10 小时前
从上传PPT到观众远程打开互动页面:Claper在CentOS 7上的Docker部署、互动组件设置与固定访问地址实战
linux·运维·网络·人工智能·docker·centos·powerpoint
龙亘川10 小时前
水质决策报表业务建模:从自定义报表到六时间尺度自动报表闭环
大数据·人工智能·智慧城市·开源软件
麦客奥德彪10 小时前
别把 Agent 写成一个大循环:读懂 DeepSeek Harness 的接口与运行时设计
agent·源码阅读
科研小牛马10 小时前
北航何静:Codex调用SketchUp实操,常见智能体均适用
人工智能
hpoenixf10 小时前
为什么我们把 Agent 的路由请求越做越简单?
agent
机器人梦想家10 小时前
【AI工具】Task Kit:把 Spec Kit 的契约化思想搬来管日常工作
人工智能
ck01357910 小时前
图片抠图怎么做?从背景去除到透明 PNG 的实用教程
人工智能·测试工具·音视频·媒体·视频
Vae_Mars10 小时前
幂等性学习笔记
笔记·学习·wpf
美狐美颜sdk10 小时前
直播APP接入第三方视频美颜SDK安全吗?数据处理与隐私问题分析
人工智能·音视频·美颜sdk·第三方美颜sdk·视频美颜sdk·美颜api