2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家
您的智能体拥有 40 个工具。每个工具的定义——名称、描述、JSON 模式参数——大约消耗 200 个令牌。这意味着在智能体执行任何操作之前,就已经消耗了 8,000 个令牌。如果再加上几个模型上下文协议(MCP)服务器,每次请求仅工具定义就会消耗高达 55,000 个令牌。
行业术语称这种现象为“令牌膨胀”。解决方案是延迟加载工具:初始仅加载一个小型搜索工具,仅在智能体需要时加载特定工具,并在使用完毕后卸载它们。
本教程将向您展示如何实现这一方案。只需一个文件,代码可直接运行,且无需依赖任何框架。
问题所在
# 大多数教程的做法:
agent = Agent(tools=[tool_1, tool_2, tool_3, ..., tool_40])
# 每次调用大语言模型时,提示词中都会包含全部 40 个工具的定义。
# 成本:仅工具模式就每次调用消耗约 8,000 个令牌。
当您全天候运行自主智能体时,这种开销会迅速累积。一个每天调用 100 次的智能体,仅因描述那些从未使用过的工具,每天就会额外消耗 800,000 个令牌。
解决方案:先搜索后加载
不要预先加载所有工具,而是只给智能体提供一个工具:工具搜索。当智能体需要某种能力时,它会搜索合适的工具,系统随后加载该工具,智能体则利用新可用的工具重新执行任务。
用户:“查找 nebula-web 上的最新拉取请求并更新变更日志”
第 1 轮:智能体仅拥有 `search_tools(query)`。它执行搜索。
第 2 轮:系统加载 `get_pr()` 和 `update_changelog()`。
智能体现在拥有 2 个工具。调用它们。
第 3 轮:智能体返回结果。
虽然从一轮交互变成了三轮,但令牌节省效果显著:搜索工具的定义仅消耗约 400 个令牌,而全部 40 个工具则需消耗约 8,000 个令牌。
步骤 1:构建工具注册表
首先,创建一个注册表,用于存储所有可用工具,但在任何时刻仅暴露其中的一个子集。
from dataclasses import dataclass, field
from typing import Callable, Any
@dataclass
class Tool:
name: str
description: str
parameters: dict # JSON 模式
fn: Callable
category: str = "general" # 用于搜索过滤
class DeferredToolRegistry:
def __init__
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。