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)
相关推荐
Flynn Liang7 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
汤姆宝库8 小时前
构建一个能用的RAG系统:切块、嵌入、混合检索与融合排序
人工智能
Dawson Zhu8 小时前
【LLM推理与Serving⑪】MoE推理与MLA:DeepSeek-V3架构下的显存与通信权衡
人工智能·语言模型·架构·aigc·agi
github_is_geeksKai8 小时前
50 个 AI 与开源工具怎么选:从实际用途到实现边界
人工智能
ZhengEnCi8 小时前
Agent 如何动态存储运行时经验:从反思沉淀到场景化复用的完整闭环
agent
ZhengEnCi8 小时前
Agent 如何动态挂载相关知识:三层渐进加载 + 路由机制把自动化再提一档
agent
IT_陈寒8 小时前
Vite的HMR把我整不会了:一个生产环境的热更新坑
前端·人工智能·后端
github_is_geeksKai8 小时前
浏览器 AI 小工具怎么选?40 个项目与 5 类商业任务的参考指南
人工智能
styshoo8 小时前
[snapshot]7-placeholder与恢复流程
人工智能
用户956256254298 小时前
跟做:Firecrawl 单页转 Markdown 再丢进沙箱总结
python·api