这道题问的是工具数量庞大的时候怎么选、怎么调、怎么快。我觉得本质是规模与LLM有限上下文之间的博弈,核心思路就是别让LLM看所有工具,而是先检索后决策。
先说工具选择困难。LLM的上下文窗口有限,你不可能把所有工具描述都塞进去,而且相似工具多了容易混淆。我的做法是先做分层分类。可以按领域或功能把工具分群,比如数据库类、搜索类、计算类,[[Agent]]先选类别再选具体工具。这样就把一次大选择拆成两次小选择,复杂度降很多。还可以设计元工具,把常用的组合封装成一个高层工具,比如查用户信息加查订单状态,一次调用搞定,减少决策次数。另外就是动态加载,只把当前任务相关类别的工具描述注入Prompt,其他先不加载。
再一个,工具数量上千后,光靠分类还不够,必须用语义检索。把每个工具的描述做成 [[Embedding]] 存到 [[Vector Database]] 里,用户Query来了,先检索Top-K最相关的工具,再把这些描述放进LLM的上下文。这样能突破上下文限制,支持千级工具。但这里有个前提,工具描述要写好,不能就写个名字,得把功能、输入输出、使用场景、甚至典型例子都写清楚。否则检索不准,后面全错。
调度复杂和响应延迟是另一大块。工具间可能有依赖关系,比如先查用户身份才能查订单,还有资源竞争,比如两个工具都要调同一个API。我的思路是构建工具依赖图,拓扑排序确定执行顺序,再用一个工具编排引擎比如 LangGraph 来管理条件分支、循环、错误重试。延迟方面,预加载热门工具,建立连接池;独立工具可以并行调用,比如同时查天气和股票;缓存工具结果,相同参数直接返回;还可以流式响应,先返回思考过程,工具调用异步执行。
落地时我特别关注几个风险。先看工具描述质量,如果描述写得差,检索召回率会崩,所以上线前我会用一批历史query跑一遍,看Recall@K,不达标就迭代描述。然后看缓存一致性,工具结果变了但缓存没刷新,给用户旧数据,这很危险,所以缓存要有TTL和主动失效机制。另外还要看成本,预加载和并行调用会加大资源消耗,得做容量规划。
另外,我觉得还有一个方向可以深挖,就是工具学习。通过收集工具调用的成功率、耗时、用户满意度,反过来自动优化工具描述,甚至根据历史任务模式预测可能需要的工具集。这会是个持续迭代的闭环。
所以整体上,我更倾向把大规模工具管理看成检索加编排的组合问题,而不是让LLM自己硬扛。分层架构解决规模,语义检索解决选择,工程优化解决延迟。每个方案都有适用边界,比如小规模场景直接枚举就行,没必要上检索;而实时性要求高的场景,缓存和预加载就必须到位。落地时我会先做小规模验证,再逐步扩展,同时监控召回率和延迟,随时调整。