Skill 匹配的本质,不是关键词搜索,而是语义理解、向量检索与 LLM 决策的三层叠加。
最近团队在做一个内部 Agent 项目,遇到一个特别现实的问题:Skill 库从最初的十几个,慢慢涨到了七八十个,选错技能的情况开始变得频繁。有一次同事让 Agent“帮忙整理一下会议纪要”,结果调用的是“写周报”的 Skill,输出的东西驴唇不对马嘴。
这事儿倒逼我们把 Skill 匹配这套机制彻底捋了一遍。今天就把这个过程记下来,也算是一次踩坑总结。

📌 本文看点
01
匹配四步走
02
两条匹配思路
03
避坑与改进
DIFFERENCE
Agent 和聊天机器人,差在哪儿?
普通的对话机器人很简单:用户提问,模型直接生成答案,一问一答,结束。
但 Agent 不一样。它得先想清楚“用户到底要干什么”,然后判断“该用哪个能力去完成”,最后才是执行、交付结果。这个“先理解、再选择、后执行”的过程,才是 Agent 真正有意思的地方——也是最容易出问题的地方。
举个最直观的例子:用户说“帮我做一份季度汇报 PPT”,Agent 手里可能有 GeneratePPT、WriteEmail、SearchDocument、DrawFlowchart 好几十个 Skill,它凭什么就知道该选 GeneratePPT?
答案不是关键词匹配这么简单粗暴。真正在起作用的,是三件事情叠在一起:语义理解、语义检索、LLM 推理决策。下面一个个拆开说。
DEFINITION
先搞清楚,Skill 到底是个什么东西
很多人会把 Skill 和 Tool 混为一谈,其实两者不是一回事。
Tool 更底层,是一个个具体的函数或工具,比如“发一封邮件”、“查一次数据库”、“生成一个文件”。而 Skill 是面向任务的能力组合,比如“生成一份完整的季度汇报 PPT”——这背后往往要调用好几个 Tool 才能拼出结果。
一个规范的 Skill 通常长这样:有名字、有功能描述、有适用场景说明、有输入参数定义、有输出格式约定、还得配几个调用示例。拿 GeneratePPT 举例:
名称:GeneratePPT功能:根据用户提供的主题和素材生成 PPT输入:主题、内容结构、页数、素材文件输出:一个 .pptx 文件执行步骤:分析主题→生成大纲→组织页面内容→调用生成工具→导出文件
这套结构化的描述,才是后面 LLM 能“看懂”并选对 Skill 的基础。描述写得含糊,匹配一定不准,这个后面会细说。
PIPELINE
匹配是怎么一步步发生的
拆开来看,整个匹配过程大致分四步。
第一步,理解用户到底想干什么
Agent 先用 LLM 分析用户输入,把任务目标和限制条件提取出来。比如用户说“请根据这份销售数据,生成一份季度汇报 PPT”,LLM 需要识别出:任务类型是生成演示文稿,输入素材是销售数据,输出格式要求 PPT,业务场景是季度汇报。这一步做好了,后面的检索才有靶子。
第二步,把这个意图变成一串数字
这一步叫向量化,说白了就是把自然语言转换成机器能比较的数值表示。为什么非要绕这一圈?因为用户的说法千差万别:“做个汇报材料”、“整理成演示文稿”、“输出季度总结 PPT”——字面上完全不同,但意思其实是一回事。只靠关键词匹配,这种同义表达根本处理不了。向量化之后,语义相近的表达在向量空间里距离也会更近,这就是它的价值所在。
第三步,去 Skill 库里检索相关的候选项
Skill 库就是 Agent 所有可用能力的集合,比如 SearchDocument(检索文档)、GeneratePPT(生成 PPT)、WriteEmail(写邮件)、SQLQuery(查数据库)、CodeReview(代码审查)等等。系统会拿用户意图的向量,跟每个 Skill 描述的向量算相似度,选出最靠前的几个候选:
GeneratePPT 0.92,CreatePresentation 0.89,WriteReport 0.78,MakeSlides 0.74,DrawChart 0.62
这里有个细节值得说一下:为什么要留 Top-K 而不是直接锁定第一名?因为很多任务其实需要多个 Skill 配合,只看单一最高分容易漏掉真正需要组合调用的情况——比如先查数据,再画图表,最后才生成 PPT。留几个候选,是给后面的判断留余地。
第四步,LLM 做最终拍板
检索解决的是“哪些 Skill 可能沾边”,真正决定用哪个,还得靠 LLM 结合上下文综合判断:这个 Skill 真能完成任务吗?用户给的信息够不够?要不要先调别的 Skill 打底?要不要先反问用户一句?最后输出的是文件还是文本还是结构化数据?还是那个季度汇报的例子,LLM 会这么想:任务目标是生成演示文稿,输入里带着销售数据,用户明确要 PPT 文件,GeneratePPT 能完成内容组织和文件生成——所以选它,而且大概率还得先调一次数据分析或图表生成的工具。
EXECUTION
选中之后,一个 Skill 内部是怎么跑起来的
很多人以为 Skill 被选中之后就是“一步到位”生成结果,其实不是。复杂一点的 Skill,内部往往是一整条执行链路。
还拿 GeneratePPT 举例,它内部大致要走这几步:解析用户需求,识别汇报主题和受众;读取输入素材,导入 Excel 或 CSV 文件;分析业务数据,提取关键指标和趋势;生成内容结构,设计页面大纲;生成图表,把数据转成柱状图或折线图;调用 PPT 生成工具,完成排版;导出结果文件;最后把文件位置、页数、主要内容反馈给用户。
「这中间任何一步都可能出岔子:文件格式不支持、数据缺失、用户要求本身就没说清楚、目标 Skill 暂时不可用、工具调用失败、生成结果不符合预期。」
遇到这些情况,靠谱的 Agent 不会硬着头皮往下走,而是会请用户补充信息,或者换个备用 Skill 试试,或者先把中间结果丢出来让用户确认一下再继续。这种“留有余地”的设计,往往比一味追求“一次到位”更靠谱。
STRATEGY
两种匹配思路,各有各的坑
实践中大概有两条路子。
把所有 Skill 的描述一股脑塞进 Prompt,让 LLM 直接从里面挑。这个方式实现起来很简单,Skill 数量少的时候用起来也顺手。但问题也很明显——Skill 一多,Prompt 越拼越长,成本和延迟跟着往上走,还容易撞上下文长度的天花板。更麻烦的是,一旦库里出现好几个功能相近的 Skill,LLM 挑起来经常摇摆不定。
先向量化,再检索出 Top-K 候选,最后交给 LLM 在这个小范围里做决策。这样一来,喂给 LLM 的候选数量始终可控,匹配效率明显更高,也更适合像我们这种 Skill 库不断在长的场景。当然它也不是没有代价,检索效果高度依赖 Embedding 模型的质量,Skill 描述写得不清不楚,检索照样会跑偏,而且还得额外维护一套向量索引和更新机制。
「向量检索干的是“找得全”,LLM 干的是“选得准”。」
说白了,向量检索干的是“找得全”这件事,LLM 干的是“选得准”这件事。单靠检索,容易选出看着相似但根本用不了的 Skill;单靠 LLM 面对几十上百个候选,成本高、判断压力也大。两者搭配着用,先缩小范围再精细决策,目前看下来是相对稳妥的组合。
FACTORS
匹配准不准,说到底看这几点
折腾了一圈之后,我们发现真正决定匹配效果的,往往不是算法多花哨,而是几个很朴素的细节。
Skill 描述要清楚
能做什么、不能做什么、适用什么场景、需要什么输入、会给出什么输出,这些交代不清楚,检索和判断都会跟着乱。
Skill 名称要直接
取名叫 Process、HandleTask、Assistant 这种,谁也猜不出它到底是干嘛的,还不如老老实实叫 GeneratePPT、SearchDocument、SQLQuery 来得直接。
示例要覆盖真实说法
“做一份 PPT”、“整理成演示文稿”、“生成季度汇报材料”这些说法都得囊括进去,不能只写一种标准表达。
输入输出定义标准化
参数名统一、类型明确、必填可选分清楚。
Top-K 数量要反复调
太少容易漏掉正确答案,太多又会让 LLM 判断起来负担过重,这个数值需要结合 Skill 总量和相似程度反复调整。
EXAMPLES
几个实际跑过的例子
走的是 SearchDocument,检索企业文档,拿到相关条款直接回答。
走的是 WriteEmail,理解邮件场景之后生成邮件初稿。
这次不是单个 Skill 能搞定的,先是 SQLQuery 把数据库里的业绩数据查出来,再交给 GenerateReport 整理成报告格式,两个 Skill 接力完成。
走的是 DrawFlowchart,把数据变成一张可视化的图。
💡 这几个案例里最值得说的是 Q2 报表——它说明 Skill 匹配很多时候不是“选中一个就完事了”,复杂任务需要 Agent 先规划出一条任务链,再按依赖关系一步步把各个 Skill 串起来执行。
REDESIGN
如果要重新设计一套 Skill 匹配系统,我们会怎么改
结合这段时间的踩坑经验,几个改进方向基本是明确的。
Skill 描述格式彻底标准化:name、description、use_cases、inputs、outputs、examples、tools、constraints 这些字段一个都不能少,靠这套 Schema 统一管理。
定期做 Skill 治理:把功能重叠的合并掉,给新加的 Skill 补齐示例,失效的及时下线,别让描述和实际能力对不上。
尝试分层检索:先按任务领域筛一轮,再按任务类型、输出格式、所需工具逐层收窄,最后落到具体的 Skill 上,而不是一上来就在几十个候选里硬比。
匹配结果可解释:Agent 最好能说清楚“为什么选这个 Skill”、“识别到了什么需求”、“还缺哪些参数”,这样出问题也好排查。
建一套评估指标:召回率、Top-K 命中率、最终选择准确率、任务完成率、响应延迟、单次成本,这些数字盯着看,才知道系统到底哪里在拖后腿。
PITFALLS
几个容易踩的坑
!踩坑提示 🕳
把 Skill 匹配当成关键词搜索来做,是最容易翻车的一种想法——同义表达、语义差异,关键词根本处理不了。
只看 Skill 名字不看描述和参数,也很危险,名字像不代表能力就一样,得结合输入输出和场景一起判断。
Skill 数量一多还硬要 LLM 面对全部候选,上下文越拉越长,出错概率也跟着涨。
以为一个用户请求只能对应一个 Skill,这个假设在稍微复杂点的任务面前基本站不住脚。
还有一点容易被忽视:用户给的信息不够的时候,宁可先问一句,也别硬着头皮往下执行。
THE END
写在最后
折腾下来最大的体会是,Skill 匹配这件事,本质上是 LLM 理解意图、向量检索召回候选、LLM 结合上下文做最终决策,这三步环环相扣。任务再复杂一点,还要考虑 Skill 组合、Tool 编排、执行过程中的监控和结果校验。
「Agent 的智能,不在于“能答出什么”,而在于知道该调用什么、什么时候调用、怎么把多个能力串起来完成一件事。」
这也是我们这次重新梳理下来,觉得最值得记住的一句话。
夜雨聆风