Appearance
18. 多个工具如何选择?如何防止选错工具或循环调用?
难度 P1 高频 · 岗位 应用 · 频率 ★★★ · 预计阅读 5 min
本题阅读地图
- 💡 简要回答
- 📝 详细解析
- 🎯 面试总结
👔面试官:多个工具如何选择?如何防止选错工具或循环调用?
🙋♂️我:模型根据描述自动选择,写清楚描述就行。
👔面试官:描述清晰是基础,但还有:工具分类、参数校验、历史调用记录防重、调用次数上限。你能系统讲吗?
🙋♂️我:那就加个调用次数限制?
👔面试官:对,但还要:相似工具要区分清楚、参数 schema 要严格校验、历史调用结果要回传避免重复调用。这些都是生产环境必须的治理能力。
💡 简要回答
工具选择优化:
- 描述清晰:功能边界明确,区分相似工具
- 分类组织:工具多时分组,先选类别再选工具
- Few-shot 示例:给模型看正确调用示例
防错机制:
- 参数校验:schema 校验,拒绝无效调用
- 调用记录:历史结果回传,避免重复调用
- 次数上限:单工具调用次数限制,防无限循环
- 兜底策略:选错工具或循环时人工介入
📝 详细解析
工具选择优化
描述区分相似工具:
json
// 不好
{"name": "search", "description": "搜索"}
{"name": "query", "description": "查询"}
// 好
{"name": "search_web", "description": "搜索互联网公开信息,适用于通用知识、新闻、百科类问题"}
{"name": "query_database", "description": "查询企业内部数据库,适用于订单、用户、库存等私有数据"}分类组织:
- 工具多的时候,先做意图分类
- 然后只在相关类别中选择
Few-shot 示例:
示例1:
用户:"北京今天天气怎样?"
思考:需要查天气
调用:get_weather(city="北京")
示例2:
用户:"帮我订个去上海的机票"
思考:需要调用预订系统
调用:book_flight(destination="上海", ...)防错机制
参数 Schema 校验:
- 类型检查(string/int/boolean)
- 必填字段检查
- 格式校验(日期、邮箱、枚举值)
调用记录去重:
- 记录本次对话已调用的工具
- 同样参数重复调用时,返回缓存结果
- 或提示"已经查询过,结果是..."
调用次数上限:
- 单工具最多调用 N 次
- 总工具调用次数上限
- 防止无限循环或疯狂重试
循环检测:
- 检测到 A→B→A 的循环模式
- 触发人工介入或终止
兜底策略
- 工具选择置信度低时,询问用户确认
- 多次选错后,降级为 Prompt 回答
- 关键操作强制人工审核
🎯 面试总结
优化选择:清晰描述、分类组织、示例引导。防错:参数校验、调用记录、次数上限、循环检测。