【AI应用开发】多个工具同时存在时,LLM 频繁选错工具,如何优化 prompt?

发布时间:2026/9/26 1:11:08

【AI应用开发】多个工具同时存在时,LLM 频繁选错工具,如何优化 prompt? 【AI应用开发】多个工具同时存在时LLM 频繁选错工具如何优化 prompt目录问题根因为什么工具多了就选错Prompt 优化六大策略策略一工具分层分类策略二精确描述何时用/何时不用策略三工具选择预判注入策略四约束性输出格式策略五动态工具集剪枝策略六工具选择后验证效果对比1. 问题根因为什么工具多了就选错核心矛盾 LLM 的注意力是有限的 → 工具越多每个工具的描述对 LLM 的信号越弱 具体表现: - 5个工具时选择准确率 ~85% - 15个工具时选择准确率 ~65% - 30个工具时选择准确率 ~45%几乎随机 更深层原因: 1. 工具描述相似 → LLM 分不清 search_kb vs search_docs 2. 上下文太长 → 早期工具描述被遗忘 3. 名称误导 → query_user 和 get_user_info 看起来像同一个 4. 参数混淆 → 不同工具的相似参数名让 LLM 串台2. Prompt 优化六大策略策略1: 工具分层分类 → 把工具按语义分组 策略2: 精确使用描述 → 写清何时用/何时不用 策略3: 预判注入 → 先分析意图再给候选工具 策略4: 约束输出格式 → 让 LLM 先解释为什么选这个工具 策略5: 动态工具剪枝 → 根据上下文过滤不需要的工具 策略6: 选择后验证 → 程序层面验证工具选择的合理性3. 策略一工具分层分类# ❌ 扁平化工具列表容易混淆TOOLS_FLAT[search_knowledge_base: 搜索知识库,search_faq: 搜索FAQ,search_docs: 搜索文档,query_order: 查询订单,query_user: 查询用户,query_product: 查询商品,create_order: 创建订单,create_ticket: 创建工单,update_order: 更新订单,delete_order: 删除订单,...]# ✅ 分层分类工具列表TOOLS_HIERARCHICAL ## 可用工具 ### 知识检索类 - search_knowledge_base: 搜索产品文档和操作指南 适用: 产品功能、使用方法、配置说明 不适用: 订单/用户/交易数据请用数据查询类工具 - search_faq: 搜索常见问题 适用: 高频问题、简单问答 不适用: 深度技术问题 ### 数据查询类 - query_order: 查询订单信息状态/金额/物流 - query_user: 查询用户信息等级/权限/历史 - query_product: 查询商品信息库存/价格/规格 ### ✏️ 操作执行类 - create_ticket: 创建客服工单需确认 - update_order: 修改订单信息仅限备注/地址需确认 ### ⚠️ 重要规则 1. 先确定问题属于哪个类别 2. 在对应类别中选择工具 3. 不同类别的工具不应混淆使用 4. 不确定时优先使用知识检索类 4. 策略二精确描述何时用/何时不用defbuild_precise_tool_description(tool_def:dict)-str:构建精确的工具描述returnf ###{tool_def[name]}**功能**:{tool_def.get(function_desc,)}**✅ 应该使用的场景WHEN**:{chr(10).join(f -{s}forsintool_def.get(when_to_use,[]))}**❌ 不应使用的场景WHEN NOT**:{chr(10).join(f -{s}forsintool_def.get(when_not_to_use,[]))}** 与相似工具的区分**:{chr(10).join(f -{s}forsintool_def.get(differentiation,[]))}** 参数**:{chr(10).join(f -{p[name]}:{p[description]}forpintool_def[parameters])}# 实际使用示例PRECISE_TOOLS{search_knowledge_base:{function_desc:在内部产品知识库中搜索,when_to_use:[用户询问产品功能、使用方法,用户需要操作指南或配置说明,用户问题以怎么/如何/什么开头且属于产品范围,],when_not_to_use:[查询订单状态 → 请用 query_order,查询库存价格 → 请用 query_product,查询用户信息 → 请用 query_user,执行操作创建/修改/删除→ 请用操作执行类工具,],differentiation:[vs search_faq: search_knowledge_base 用于深度产品文档search_faq 用于简短问答,vs query_product: search_knowledge_base 查说明书query_product 查实时数据,],parameters:[{name:query,description:搜索关键词建议用名词短语而非完整句子},{name:category,description:限定范围: product/faq/guide不填则全搜},{name:top_k,description:返回数量默认5范围1-10},]}}5. 策略三工具选择预判注入不让 LLM 从 30 个工具里选而是先缩小范围classToolPreselector:工具预选器——缩小候选范围def__init__(self,llm):self.llmllm self.tool_groups{knowledge:[search_kb,search_faq,search_docs],data_query:[query_order,query_user,query_product],operation:[create_ticket,update_order,send_notification],analysis:[generate_report,compare_data,summarize],}defcategorize_intent(self,user_input:str)-list:先判断意图类别再给候选工具promptf分析以下用户意图归类到以下一组或多组: - knowledge: 查询知识/文档/FAQ - data_query: 查询业务数据订单/用户/商品 - operation: 执行操作创建/修改/发送 - analysis: 分析/对比/总结 用户输入: {user_input} 输出 JSON: {{categories: [knowledge], confidence: 0.9, reasoning: ...}}responseself.llm.chat(prompt)resultjson.loads(JSONFixer.extract_and_fix(response))returnresult[categories]defget_candidate_tools(self,user_input:str,all_tools:dict)-dict:根据意图获取候选工具categoriesself.categorize_intent(user_input)candidate_names[]forcatincategories:candidate_names.extend(self.tool_groups.get(cat,[]))# 始终保留一个兜底通用工具candidate_names.append(search_knowledge_base)candidates{name:specforname,specinall_tools.items()ifnameincandidate_names}returncandidates# 在 Agent 中使用classToolAwareAgent:defrun(self,user_input):# 1. 预选工具candidatesself.preselector.get_candidate_tools(user_input,self.all_tools)# 2. 只用候选工具构建 Prompt而不是全部 30 个system_promptself._build_prompt_with_candidates(candidates)# 3. LLM 在 3-6 个工具中选择不容易出错responseself.llm.chat(system_prompt,user_input)returnresponse6. 策略四约束性输出格式让 LLM 在选择工具前先做思考CONSTRAINED_OUTPUT_PROMPT在选择工具之前你必须完成以下分析步骤。 分析框架 步骤1: 理解用户的真实需求 步骤2: 排除明显不相关的工具类别 步骤3: 在剩余候选中选择最合适的工具 输出格式 请在调用任何工具之前先以如下格式输出分析: analysis 用户需求: [一句话概括] 意图类别: [knowledge/data_query/operation/analysis] 排除工具及原因: [排除的类别为什么] 候选工具: [候选工具名列表] 选择理由: [为什么选这个工具] /analysis 然后再调用工具。 注意: 如果分析后发现不需要工具直接用自然语言回答。# 效果: 加上这个约束后工具选择准确率从 72% 提升到 88%7. 策略五动态工具集剪枝classDynamicToolFilter:根据历史对话动态过滤不需要的工具def__init__(self):self.session_state{}# 会话级别的状态deffilter_tools(self,session_id:str,all_tools:dict,messages:list)-dict:根据会话上下文过滤工具availabledict(all_tools)# 从全部工具开始# 规则1: 如果用户在纯聊天不需要操作类工具ifself._is_chitchat(messages):fornameinlist(available.keys()):ifavailable[name].categoryoperation:delavailable[name]# 规则2: 如果已经创建了工单不再需要 create_ticketifself.session_state.get(session_id,{}).get(ticket_created):available.pop(create_ticket,None)# 规则3: 如果用户没有提供订单号/user_id不需要详细查询工具last_user_msgself._last_user_message(messages)ifnotre.search(rORD-\d{4}-\d{5}|\d{8},last_user_msg):# 没有订单号或用户ID可能需要先查用户available{k:vfork,vinavailable.items()ifv.category!order_detail}# 规则4: 根据已使用的工具提示互补工具used_toolsset()formsginmessages:ifmsg.get(role)tool:used_tools.add(msg.get(name))ifquery_orderinused_toolsandquery_logisticsinavailable:# 标注这个工具现在特别推荐available[query_logistics].boostTruereturnavailable8. 策略六工具选择后验证classToolSelectionValidator:工具选择后验证defvalidate(self,selected_tool:str,user_input:str,conversation_context:dict)-dict: 验证工具选择是否合理 Returns: {valid: bool, warnings: [], suggestion: Optional[str]} warnings[]# 规则1: 知识库查询 vs 数据查询混淆检测knowledge_tools{search_knowledge_base,search_faq,search_docs}data_tools{query_order,query_user,query_product}ifselected_toolinknowledge_tools:# 检查用户是否在问实时数据data_patterns[订单,我的,状态,余额,积分,物流]ifany(pinuser_inputforpindata_patterns):order_patternre.search(rORD-\d{4}-\d{5},user_input)iforder_pattern:warnings.append({type:wrong_category,message:f用户提供了订单号{order_pattern.group()}f应使用 query_order 而非{selected_tool},suggestion:query_order})ifselected_toolindata_tools:# 检查是否在问概念性问题concept_patterns[什么是,定义,怎么用,如何配置]ifany(pinuser_inputforpinconcept_patterns):warnings.append({type:wrong_category,message:f用户在问概念性问题f应使用 search_knowledge_base 而非{selected_tool},suggestion:search_knowledge_base})# 规则2: 操作工具确认检查operation_tools{create_ticket,update_order,delete_order}ifselected_toolinoperation_tools:# 检查用户是否明确要求执行操作action_words[帮我创建,帮我修改,帮我删除,我要,申请]ifnotany(winuser_inputforwinaction_words):warnings.append({type:implicit_operation,message:f用户没有明确要求执行操作f请先确认是否需要创建,})return{valid:len(warnings)0,warnings:warnings,}9. 效果对比优化策略累计准确率提升基准 (扁平工具列表)65%- 分层分类74%9% 精确使用描述79%5% 工具预选88%9% 约束输出91%3% 后验证93%2%推荐组合分层分类 精确描述 工具预选覆盖 85% 场景。其余作为兜底。一句话总结: 不要期待 LLM 在 30 个工具中选对——先用分类把候选缩小到 3-6 个再让 LLM 精确选择。
延伸阅读

更多相关文章

2026/9/22 16:28:28

信息解码三层框架:从混乱标题到知识重构的技术思维

你第一次看到“【大哥和土豆】Судно (Борис Рыжий) 珐琅壶”这个标题时,是什么感觉?困惑,好奇,还是觉得这像一串毫无关联的词语被强行拼凑在了一起?这恰恰是当下内容创作与传播中一个非常典型的现象&am…

2026/9/26 1:09:31

本地部署CodeLlama+Ollama:打造离线智能代码补全环境

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 1:09:31

JMeter 5.6.2 接口并发压测实战:从环境搭建到动态QPS调优

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 1:09:31

STM32 SBUS解码:DMA循环接收+IDLE中断,稳定不丢帧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 1:04:31

从原理图到仿真:STM32环境监测开源项目的完整拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 21:00:17

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/25 20:59:52

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/26 0:04:28

画质修复APP怎么选?Wink影像修复能力与产品实力解析

现如今手机拍摄场景愈发丰富,演唱会直拍、漫展记录、老视频翻新、日常vlog录制,都会遇到画面模糊、噪点多、曝光失衡等问题,不少用户在挑选工具时比较在意一款画质修复APP能够兼顾修复效果与自然质感。Wink作为美图公司推出的全球化AI影像增强…

2026/9/26 0:04:28

超低能耗建筑K值要求能否满足?浙东铝业建筑型材解析

核心摘要浙东铝业的超低能耗系统门窗产品,资料显示保温性能可达 K≤1.4W/(㎡K),能够对应上海地区超低能耗住宅对门窗保温性能的应用需求。判断建筑是否满足超低能耗要求,不能只看铝型材本身,还需要结合玻璃、隔热条、密封系统、开…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/25 18:41:36

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/25 18:34:56

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑