简介:本文面向开发者与技术负责人,系统讲解Agent“技能工程”这一开发新范式。从大模型外部能力扩展的演进脉络切入,剖析工具协议在企业落地中的Token膨胀与Agent烟囱式建设两大痛点,进而给出技能封装、按需加载、统一编排的实施步骤、配置要点、验证方法与排查思路,帮助读者构建可复用、易维护的Agent能力体系。
本教程要帮助读者完成一件事:把“给模型挂一堆工具”的粗放做法,升级为“给模型装配可复用技能”的工程化做法。
具体来说,读完并跟随本文实践后,你应当能够:
适用读者:具备一定后端开发经验、正在或计划将大模型接入业务系统的开发者;负责Agent平台规划的技术负责人;需要把分散的智能化能力统一管理起来的运维与企业用户。
前置准备:了解大模型基本交互方式(输入上下文、输出结果);了解“工具调用”这一通用概念;具备一个可运行的服务端环境用于编排逻辑;对JSON等通用数据交换格式熟悉。本文不依赖任何特定厂商的专有接口,所有示例均为通用伪代码或通用配置片段。
在动手之前,先判断你是否属于以下场景,这决定了技能工程能带来多大收益:
如果你的场景命中两条以上,技能工程就值得投入。
理解演进脉络,才能理解技能工程为什么出现。可以把这条路线概括为四个阶段:
阶段一:私有化工具调用。 早期由模型侧通过训练让模型掌握“调用工具”的能力,交互格式由各模型厂商自行定义。问题很直接:协议私有,换个模型就要换一套对接方式,适配成本高。
阶段二:统一上下文协议。 随后出现的统一协议方案,核心目标是让不同模型以一致的方式描述工具、接收调用意图。它被广泛接受,成为事实标准。可以把它类比为“给模型世界装了一个统一接口”。
阶段三:多智能体协作协议。 在统一工具协议之外,又出现了面向多个Agent之间通信协作的协议,解决“Agent与Agent如何对话”的问题。业界普遍认为它与统一工具协议是互补关系,而非简单替代。
阶段四:降低Token与提升确定性的多种尝试。 一方面,有方案通过“程序化调用”让模型输出代码作为中间媒介,由代码去完成工具编排,从而减少上下文中的工具描述;另一方面,有方案借助图结构检索,先检索再与模型交互,减少无关上下文注入。这些探索的共同目标,都是让模型“更省、更准”地使用外部能力。
最新一步:技能(Skills)。 技能工程的思路是:不再把“工具清单”一股脑交给模型,而是把专业能力封装成有边界、有说明、可加载的“技能”,模型按需获取技能说明并执行。这实际上是把软件工程中的“模块化”思想引入Agent开发。
需要强调的是,这一系列探索本质上都在解决同一个问题:模型自身能力存在缺陷,需要外部能力来补足,但补足的方式必须工程化。工具调用解决“能不能用”,统一协议解决“好不好接”,技能工程解决“用得好不好、维护得起不起”。
以统一工具协议方案的典型交互流程为例:服务端提供专业工具,客户端负责编排与模型交互,以标准方式告诉模型“有哪些工具、怎么用”,模型分析后返回要用哪个工具,客户端据此调用对应工具,再把结果与上下文一起交回模型处理。
这个流程本身没有问题,问题出在两个地方。
工具少的时候(两三个),把工具描述全量放进上下文完全可行。但企业场景中工具数量常达几十上百个,全量注入会带来双重后果:
这是一种“越加越糟”的负反馈:工具越多,本来应该越强,结果反而越不稳定。
另一个更严重的问题是组织层面的。财务需要某功能就建一个Agent,人力需要某功能再建一个Agent,各Agent各自维护工具、流程和数据。这与软件发展史上被反复批评的“烟囱式建设”高度相似:每个烟囱独立冒烟,流程和数据难以统一管理,系统复杂性上升,维护成本居高不下。
技能工程的出发点,正是同时回应这两个痛点:用“技能”作为能力封装单元,用“按需加载”控制上下文规模,用“统一编排”收敛分散建设。
下面按顺序给出实施路径。每一步都会说明“做什么、为什么做、注意什么”。
做什么:把现有工具清单按业务语义归类,划分出技能单元。一个技能应当是“完成一类专业任务的最小完整能力”,例如“报表生成”“字段合规校验”“审批流发起”,而不是单个原子接口。
为什么做:技能边界决定了后续加载粒度和复用范围。边界过细,技能数量膨胀;边界过粗,加载后仍然冗余。
注意什么:划分时以“业务动作”而非“技术接口”为单位;同一技能内的多个底层工具应共享一份技能说明。
做什么:为每个技能编写结构化说明,至少包含:技能用途、适用条件、输入要求、输出形态、调用约束。
为什么做:模型是按描述来选择技能的。描述质量直接决定选择准确率。这与“把上百个工具说明全塞进去”形成对比——技能描述是分层、按需呈现的。
注意什么:描述要写“什么时候该用我”,而不仅是“我能做什么”;避免模糊措辞;对易混淆的技能显式写出区分条件。
示意性结构(通用JSON,非任何专有格式):
{"skill_name": "monthly_report_generate","purpose": "根据给定的时间范围与指标集合生成月度汇总报表","when_to_use": "用户请求月度、季度汇总统计且指标明确时使用","inputs": ["time_range", "metric_list"],"outputs": "结构化报表数据","constraints": "时间范围不得超过12个月"}
做什么:维护一份轻量的技能索引(只含技能名与一句话用途),请求进入时先让模型基于索引做粗选,再加载被选中技能的完整描述。
为什么做:这是控制Token的关键。索引体积小,可常驻上下文;完整描述只在命中时加载,避免全量注入。
注意什么:索引条目要短且互斥;粗选阶段可结合规则前置过滤(如按业务域),减少模型判断负担。
做什么:由编排层负责“解析模型意图→加载技能→执行技能→回传结果”的闭环。执行具体动作的是编排层而非模型本身,模型只负责决策。
为什么做:保持“决策”与“执行”分离,既保证可控性,也便于审计与限流。
注意什么:编排层要记录每次技能加载与执行日志,这是后续排查与优化的基础。
示意性伪代码:
function handle(request):index = load_skill_index()candidate = model.select_skill(request, index)if candidate is empty:return model.answer_directly(request)skill = load_skill_detail(candidate)if not validate_inputs(request, skill.inputs):return ask_user_for_missing(request, skill)result = execute_skill(skill, request)return model.compose_answer(request, result)
做什么:为技能配置超时、重试、结果校验与降级路径。例如技能执行超时后回退到“告知用户稍后重试”,而非让模型凭空编造结果。
为什么做:企业场景对确定性要求高,必须有兜底。
注意什么:降级路径同样要写进技能描述,让模型知道“失败时该怎么回应”。
做什么:先用小流量验证技能选择准确率,再逐步放量。
为什么做:技能划分和描述质量只有通过真实请求才能检验。
注意什么:灰度期间重点观察“选错技能”“漏选技能”两类错误。
完成上述步骤后,用以下方式判断是否达标:
本文围绕“技能工程”这一开发新范式,梳理了从私有工具调用、统一协议、多智能体协作到技能封装的演进脉络,指出企业落地的两大痛点——Token膨胀与Agent烟囱式建设,并给出了“盘点边界→编写描述→建索引按需加载→统一编排→配置约束→灰度验证”的完整实施路径,配套了验证指标、排查清单与优化建议。
关键结论有三点:第一,工具不是越多越好,上下文需要分层管理;第二,能力应当封装为可复用技能,而不是散落在各个Agent里;第三,决策与执行分离、失败有降级,是企业场景可控性的底线。后续可继续关注的方向包括:技能描述的自动化生成与质量评估、技能组合的编排优化,以及技能体系的统一治理机制。