🎬 王家卫式开场
世界上有一种错觉,叫做「给Agent的工具越多,它就越强大」。
1小时23分后,我清楚地记得那个时刻——我的Agent有47个工具可以选,然后它把「删除用户」翻译成了「删库跑路」。
我盯着终端的输出,它问我:「您是否确定要rm -rf /?」——我说的是「删一个用户」,不是「删整个系统」。
那一刻我明白,工具多了,Agent也会选择困难症。
世界上有一种错觉,叫做「给Agent的工具越多,它就越强大」。
1小时23分后,我清楚地记得那个时刻——我的Agent有47个工具可以选,然后它把「删除用户」翻译成了「删库跑路」。
我盯着终端的输出,它问我:「您是否确定要rm -rf /?」——我说的是「删一个用户」,不是「删整个系统」。
那一刻我明白,工具多了,Agent也会选择困难症。
Tool Confusion(工具混淆)是指AI Agent在面对多个相似工具时,选择了不正确的工具,或者对工具的功能产生了误解,导致错误的操作或输出。
通俗理解:就像你走进一个工具仓库,里面有扳手、螺丝刀、榔头、电钻……你明明只想拧个螺丝,结果拿榔头把墙砸了。
工具名称或描述不够清晰,Agent选错了:
工具选对了,但参数传错了:
Agent不知道用户到底想干嘛:
# ❌ 不好的命名 - get_data:太模糊 - process:猜不到功能 - helper:毫无意义 - do_stuff:这是认真的吗? # ✅ 好的命名 - get_user_profile_by_id:精确描述 - calculate_revenue_for_period:动作+对象+范围 - validate_email_format:动作+对象+属性 - send_alert_notification_to_slack:动作+对象+目标
// OpenClaw Skills 中工具定义示例
{
"name": "search_customer_records",
"description": "根据姓名/邮箱/手机号搜索客户记录。当需要查找特定客户的信息时使用,返回匹配的客户列表。如果知道全名则优先使用全名搜索。",
"parameters": {
"query": {
"type": "string",
"description": "搜索关键词,可以是姓名/邮箱/手机号,长度至少2个字符"
},
"limit": {
"type": "integer",
"description": "最大返回条数,默认10,最大100",
"default": 10
}
}
}
OpenClaw 支持按领域分组工具,避免Agent在无关工具中乱选:
# SKILL.md 中定义工具分组 ## Tools: User Management - get_user_profile - create_user_account - update_user_role - delete_user ## Tools: Data Analysis - query_sales_data - generate_report - export_to_csv ## Tools: System Admin - check_server_status - restart_service - view_logs
在 Tool Selection 中应用「含虾率」理念:
// OpenClaw 配置示例:智能工具选择
{
"toolSelection": {
"mode": "smart", // 智能模式
"maxToolsPerCall": 5, // 每次最多选5个工具
"priorityStrategy": [ // 优先级策略
"exact-match-first",
"description-similarity",
"recent-usage-boost"
],
"conflictResolution": "most-specific-wins" // 冲突时选最具体的
}
}
# Python示例:检测潜在的工具混淆
def detect_tool_confusion(tools):
"""分析工具列表,找出可能被混淆的工具对"""
issues = []
for i, tool_a in enumerate(tools):
for j, tool_b in enumerate(tools):
if i >= j:
continue
# 检查名称相似度
name_sim = jaccard_similarity(
set(tool_a.name.lower().split('_')),
set(tool_b.name.lower().split('_'))
)
# 检查描述重叠
desc_sim = text_similarity(
tool_a.description,
tool_b.description
)
if name_sim > 0.6 or desc_sim > 0.7:
issues.append({
"tool_a": tool_a.name,
"tool_b": tool_b.name,
"name_similarity": name_sim,
"description_similarity": desc_sim,
"risk": "high" if desc_sim > 0.8 else "medium"
})
return issues
# 使用示例
tools = load_my_tools()
issues = detect_tool_confusion(tools)
if issues:
for i in issues:
print(f"⚡ 潜在混淆: {i['tool_a']} ↔ {i['tool_b']}")
print(f" 风险等级: {i['risk']}")
print(f" 建议: 完善工具描述或合并工具")
| 工具类型 | 混淆风险 | 典型场景 | 解决建议 |
|---|---|---|---|
| 读写类工具 | ⚠️ 高 | get_user 和 delete_user 混淆 | 分离只读和写操作,加confirm |
| 搜索类工具 | 🔴 非常高 | 多个search_* 工具互相覆盖 | 合并为单一搜索工具+参数 |
| 数据类工具 | 🟡 中 | query_revenue 和 query_expenses | 统一到 query_financial_data |
| 系统类工具 | ⚫ 致命 | rm -rf 和 ls 放在一起 | 高危操作严格审核 |
Tool Confusion 是什么?
就像你妈叫你「把那个东西拿过来」,你看着面前的遥控器、水杯、充电器、拖鞋……
你拿了遥控器,你妈说「我说的是充电器」。
Agent也是一样——不是它不想干对,是你给的提示不够清楚。
记住:工具命名要像程序员写变量——有含义、有区分、不装逼。