新闻详情

新闻详情

首页 / 资讯中心 / 详情

AI Agent技能层深度解析:从function calling到生产级技能编排与治理

发布时间:2026/9/19 18:46:23来源:尧图网络
AI Agent技能层深度解析:从function calling到生产级技能编排与治理
1. 从“会聊天”到“会干活”只差一层skills这两年做大模型应用我最大的感受是模型本身的推理能力早就不是瓶颈了真正卡住项目进度的是智能体怎么在真实业务里“干活”。你可能也有过类似的体验——给GPT类产品接了一堆API模型确实能理解用户意图能把“帮我订周五去上海的机票”解析成结构化参数但一落地就出问题工具调用链路太长容易断、返回结果不稳定、加一个新接口就要改一大圈主逻辑。搞到最后业务方抱怨“这玩意儿聊聊天还行真让他办事儿不靠谱”你也委屈因为问题根本不在模型而在你的Agent架构缺少一层标准化的能力封装层。这个封装层就是agent-skills在做的事。我第一次看到agent-skills这个项目标题时以为它又是一个“把工具函数注册给LLM”的轻量封装库。真正用下来才明白它解决的是Agent工程化里一个更根本的问题如何把零散的API调用升级为可编排、可复用、可治理的“技能资产”。今天这篇文章我就结合自己上手agent-skills的实际经历聊聊技能层到底怎么设计、怎么落地、生产环境里会踩哪些坑。如果你正在做AI Agent相关的项目被工具调用的稳定性、扩展性、可维护性折磨过这篇文章应该能给你一些直接能落地的思路。1.1 一个典型Agent项目的失控现场先说一个我去年接过的真实项目。那是一个企业内部的IT运维助手核心场景是员工用自然语言报障比如“打印机连不上了”“申请开通数据库权限”系统需要自动完成工单创建、知识库检索、权限系统对接等一系列操作。最开始的结构很简单把每个系统的API封装成函数扔给LLM做function calling。几十个函数的时候效果还不错。但随着场景增加问题开始密集爆发第一函数越写越臃肿。为了兼容不同用户的输入每个函数里塞满了分支判断和默认值动辄上百行。比如创建工单这个看似简单的函数要处理加急、抄送、关联资产、选择审批流……代码迅速腐化。第二上下文被撑爆。每次对话把几十个函数的描述全部塞给模型还没开始干活呢2000多个token就没了而且模型经常选错工具因为在海量函数描述里“相似”的函数太多了。第三完全没法复用。市场部想做一个类似的智能助手但它们的系统不一样、流程不一样代码拷贝过去要大改改完又不敢动一动就崩。这其实不是个例。我观察过不少团队做大模型落地前期demo跑得飞快一进入生产环境就原形毕露根本原因就是工具层只解决了“能被调用”的问题没解决“能被可靠地编排和治理”的问题。agent-skills的切入点恰好就是这里。1.2 agent-skills要解决的核心命题再往前说一层。agent-skills这个项目核心思想是把“技能”作为Agent能力的基本单位——一个技能不再是孤零零一个函数而是包含了触发条件、输入输出Schema、执行逻辑、依赖资源、权限声明、版本信息等完整元数据的自包含单元。这么设计的好处非常明显Agent的主逻辑只需要维护一张“技能清单”拿到用户请求后先做路由把请求分发到对应的技能上技能内部再自行决定调用哪些底层工具、按什么顺序调用。主流程和具体能力实现之间被彻底解耦了。以我的理解agent-skills项目面向的读者画像很清晰已经过了“调通一个Agent demo”的阶段正在往生产环境推的开发者对function calling的局限性有切身感受想找更系统化方案的架构师需要在多个业务线之间复刻同一套Agent能力同时对权限、审计有要求的团队如果你只是想把一个聊天机器人接入微信公众号那还用不上技能层这么重的抽象但只要你做的Agent需要对接两个以上内部系统、需要处理超过二十个工具调用场景、需要多人协作维护那技能层的价值就会立刻体现出来。2. 先搞清楚一个可用的Agent技能栈到底长什么样聊概念容易飘我们先拆结构。我在agent-skills里实际用下来它的技能体系分成三个层级有点类似编程里的“函数—模块—服务”的层次关系。2.1 技能的三种粒度原子、复合、业务第一层是原子技能粒度最小对应一个具体的外部调用。比如“查询工单状态”“获取用户部门信息”“发送企业微信消息”。这一层做的事情很纯粹就是定义“输入什么、调用哪个API、输出什么”内部不做业务判断保证每个技能都能被独立测试。第二层是复合技能它编排多个原子技能形成一条执行链路。比如“创建故障工单并通知主管”这个复合技能内部就是“查询主管”→“创建工单”→“发送通知”三个原子技能的串行编排。这一层的价值在于复杂的业务流程被固化成了可复用的“套路”上层调用时不需要关心链路细节。第三层是业务技能它面向具体的业务场景更像是Agent的一种“岗位能力”。比如“IT支持专家”这个业务技能可能包含报障受理、知识库检索、权限申请审批等一整组复合技能和原子技能并且定义了哪些场景归它处理、哪些场景需要移交。我在自己项目里落地时的经验是不要一上来就追求三层齐全先用原子技能跑通最小闭环等场景确实复杂了再逐级封装。层级太多小团队会陷入过度设计的泥潭。2.2 一个技能的结构化描述应该包含什么在agent-skills里一个技能的描述文件承担着“接口契约”的职责。我总结了一下一个规范化的技能描述至少要包含以下字段字段作用我的建议name技能唯一标识用域动作的命名法如it_ticket_createdescription给LLM看的技能说明写清楚“何时用、何时不用”避免模型误调用input_schema输入参数定义每个字段都要有明确类型、必填性、枚举值output_schema输出结构定义定义成功/失败的返回结构不能丢状态码steps执行步骤声明内部调用的原子技能和编排顺序permissions权限声明明确该技能能访问哪些资源version技能版本升级技能时实现灰度兼容timeout/retry执行控制超时和重试策略生产环境必备这里尤其想强调description字段。它直接影响LLM的选型准确率。我见过太多人写description特别随意比如“创建工单”就真的只写“创建工单”结果模型在“创建工单”和“批量创建工单”之间反复横跳。正确写法应该是“当用户报告设备故障或服务异常时调用创建一条IT服务工单若用户要求同时为多人报修应使用批量创建接口权限要求为it_operator及以上。”2.3 为什么不能继续用裸函数硬扛我知道肯定有人想说这些功能我用函数JSON Schema也能做何必引入技能层确实function calling本身就是一种技能调用机制但它天然有几个短板。裸函数的描述和实现绑在一起改造一个函数描述就得跟着改很容易出现“模型记住了旧描述、调用新函数”的错位。函数之间的编排逻辑散落在Agent主Promot里靠自然语言约束时间一长根本没法维护。函数没有版本、权限、审计这些治理概念对于企业级应用来说是硬伤。如果把function calling比作“把工具递给工人”那么技能层就相当于“把工人的操作手册也一并定义好”——不仅知道有什么工具还知道什么场景用什么工具、按什么顺序用、哪些人有权用。这一层抽象才是Agent从玩具走向生产力的分水岭。3. 技能设计的核心约束让模型“用对”比“能调”更重要这个部分聊聊我踩坑最多的地方也是agent-skills这类项目最见功力的设计点——怎么保证LLM能稳定地选对技能、传对参数。毕竟技能再多模型用错了就等于零。3.1 单一职责一个技能只做一件完整的事很多人设计技能时容易走极端要么把技能拆得特别碎一个“查天气”都要分成“查温度”和“查湿度”要么把技能堆得特别大一个函数里什么都能干。这两种做法在生产环境都很痛苦。我的经验是技能的拆分标准不是“动作粒度”而是“意图闭环”。用户说“帮我订个明天下午两点的会议室”这应该是一个完整技能内部可能涉及查会议室、订会议室、发通知三个原子操作。但如果把“查会议室”单独拆成一个面向用户的技能就有点过了因为用户一般不会只查不订单独暴露反而增加了模型选错的可能性。在agent-skills的体系里判断一个技能是否拆分合理可以看它的description是否足够“边界清晰”。如果你发现自己要在description里写一大堆“如果……但是……除非……”才能说清楚适用范围那十有八九是技能职责定宽了该拆。3.2 输入输出的Schema化一切歧义都应在入口被消灭第二个核心约束是技能的输入输出必须严格Schema化。这个“严格”不是指字段类型写清楚就够了而是要在Schema层面就把歧义消灭掉。举个例子很多系统的工单优先级是字符串枚举low、medium、high。如果实参直接让LLM填就经常出现LOW、High、紧急这类鬼东西。在agent-skills里正确的做法不是靠Prompt约束模型“请使用小写枚举值”而是把输入Schema的枚举定义清楚同时在服务端做归一化兜底。我自己在项目里常用的模式是输入字段能枚举就枚举不能枚举就加正则约束加示例值。比如时间字段Schema里写清楚格式是YYYY-MM-DD HH:mm:ss并附上一个示例值。模型看到示例值后传错的概率会显著下降这是实测得出的经验。3.3 自包含技能不隐式依赖“外部状态”第三个约束可能是新手最容易忽略的就是技能的自包含性。一个技能应该自带运行所需的全部信息不能偷偷依赖某个全局变量、某条Memcached缓存或者某个“肯定会存在的”会话状态。我在早期版本里犯过一个经典错误为了让“创建工单”技能拿到操作人信息我直接去读Agent会话上下文里的user_id字段。Demo跑得好好的上线后频繁报错排查半天才发现有几个入口走了异步通道会话上下文里的user_id压根没传进去。后来改成技能入口处显式声明operator_id为必填参数由上游负责注入一切问题迎刃而解。技能自包含带来的另一个好处是可测试性。每个技能都能脱离Agent主流程单独跑通测试这在多人协作时的价值难以估量——你可以给后端同学一个技能清单让他们针对每个技能写单测而不需要理解整个Agent的调度逻辑。4. 技能注册、加载与编排工程上的落地链路前面讲了技能长什么样接下来聊agent-skills在工程上是怎么把这些技能组织起来运转的。这部分属于“骨架”级的内容掌握了它你就能在自己的项目里搭建一套哪怕不用agent-skills、也能借鉴的技能管理框架。4.1 技能注册中心让Agent知道“我有什么牌可打”在agent-skills的架构里所有技能不是散落在代码里而是注册到一个技能注册中心。这个中心维护着一张完整的技能清单每个技能包含描述文件、可执行代码、版本号、依赖关系等元数据。当Agent启动时它并不会把全部技能描述加载进上下文而是按需加载。具体来说系统会先加载一个“技能路由索引”——每个技能的名称、描述、适用场景的超精简版——用来做初筛命中候选集后再把候选技能的全量Schema加载进LLM上下文。这套“二级检索”机制是控制token消耗的关键设计。我做过一个粗略的量化一个全量技能描述平均约1500字符50个技能就是7.5万字符约等于2万token光描述就把上下文吃掉一半。而用路由索引后初始上下文只有3000字符左右效果差异非常明显。所以如果你在自研Agent框架请务必考虑技能的全量加载与按需加载而不是一股脑全塞进去。4.2 技能执行的统一调用协议技能执行部分的工程实现是agent-skills最值得借鉴的地方。它的调用协议可以简化成三段式路由匹配、参数组装、结果归一化。路由匹配阶段系统根据用户请求和技能路由索引选出候选技能这一步可以由LLM做也可以用更轻量的规则、向量检索甚至分类模型做各有利弊选型方式优点缺点我的适用判断纯LLM路由理解能力强支持复杂意图延迟高、成本高意图复杂、实时性要求不高规则路由延迟极低、稳定可解释没法处理新说法高频、确定性强的场景Embedding向量路由能处理语义相似成本适中需要维护向量库技能数量多且query短推荐混合路由准确率和成本平衡好实现复杂度高生产环境终极方案参数组装阶段系统从用户输入和上下文里抽取技能所需参数并做格式校验。这一步的工程要点是校验不通过时不要直接调API而是返回“参数缺失”状态由上层Agent发起追问澄清。很多Agent项目翻车就翻在参数校验上——参数错了但代码继续往下走等到API报错才暴露这时返回给用户的报错信息已经没法看了。结果归一化阶段不同后端API的返回结构五花八门统一转成技能定义的标准输出包含状态码、业务数据、错误信息和耗时。Agent主流程只认这个标准结构后端接口再怎么变都不会影响上层逻辑。4.3 技能编排把原子技能串成业务场景编排是让Agent真正“会干活”的关键。在agent-skills里复合技能通过一个简单的DSL来描述步骤之间的依赖关系。比如前面提到的“创建故障工单并通知主管”它的编排描述大致是这样的name: it_ticket_create_and_notify version: 1.0.0 steps: - id: lookup_manager skill: it_user_lookup input: user_id: ${params.reporter_id} relation: manager - id: create_ticket skill: it_ticket_create input: title: ${params.title} severity: ${params.severity} reporter_id: ${params.reporter_id} depends_on: [] - id: notify_manager skill: im_message_send input: target: ${lookup_manager.output.user_id} content: 工单 ${create_ticket.output.ticket_id} 已创建 depends_on: - lookup_manager - create_ticket变量${...}在运行时被真实值替换depends_on声明步骤依赖。这个DSL本身很简单但它带来了一个关键能力——步骤级别的可观测性。每一步的执行耗时、成功失败、耗时分布都被记录下来哪天流程慢了一眼就能看出是查主管耗时长还是发通知耗时长。这种“编排即配置”的思路比我之前用纯代码硬编码流程要灵活太多。流程调整时不用改主程序、不用重新发布改一下DSL配置就能生效对业务频繁变化的企业场景来说非常实用。5. 从零落地一个技能请假助手接线全过程光讲理论容易虚我拿一个我自己完整跑通过的例子把agent-skills的实际开发流程过一遍。这个例子很典型——给企业微信里的员工助理添加一个“请假申请”技能。它不复杂但覆盖了技能开发的所有关键环节。5.1 需求拆解与技能边界定义首先明确业务需求员工在对话框里说“我明天请一天病假”系统需要完成三件事——校验员工身份、检查剩余年假/病假额度、写入请假系统并通知直属主管。这三件事天然就是两个技能leave_capacity_query查询员工可用假期额度原子技能leave_request_create创建请假申请并通知主管复合技能内部调用额度校验、创建申请、查主管、发通知四个原子技能注意我并没有把“通知主管”单独拆出来因为它不是一个独立的用户意图而是创建请假单的流程副作用。如果单独暴露模型就会出现在“用户没要求通知主管”的情况下偷偷多调用一个技能这在实际使用中很让人头疼。5.2 技能描述与Schema的编写细节下面这个例子是我在项目里最终采用的技能描述。这里我强烈建议尽量写得详细哪些情况该用、哪些情况不该用、用什么语气处理、有什么硬限制。{ name: leave_request_create, description: 当用户申请请假时调用此技能。支持病假、事假、年假、婚假、产假等类型。若用户未说明具体请假日期应主动询问起止日期后再调用。此技能会自动校验假期额度额度不足时返回 business_error不要强行创建申请。, input_schema: { type: object, properties: { leave_type: { type: string, enum: [sick, personal, annual, marriage, maternity], description: 请假类型 }, start_date: { type: string, format: YYYY-MM-DD, description: 请假开始日期如 2025-06-01 }, end_date: { type: string, format: YYYY-MM-DD, description: 请假结束日期含当日如 2025-06-03 }, reason: { type: string, maxLength: 500, description: 请假原因可选但不能为空字符串 } }, required: [leave_type, start_date, end_date, reason] }, output_schema: { type: object, properties: { status: { type: string, enum: [success, business_error, system_error] }, leave_id: { type: string, description: 创建成功后的申请单号 }, message: { type: string, description: 给用户看的提示信息 } } } }几个容易被忽略的细节format字段我标注了具体格式并给了示例。LLM对日期格式的敏感度比想象中低不给示例就敢给你传“2025年6月1日”。description明确写了“额度不足时返回business_error不要强行创建申请”。这是避免模型在业务报错后仍然尝试重试的关键。所有字段都写了描述即使是reason这种看着就懂的字段。别嫌啰嗦模型真的会因为字段描述不清晰而传错。5.3 技能代码骨架与执行逻辑技能的执行体是一个类核心方法是execute(params, context)。我习惯把所有外部依赖HTTP客户端、数据库连接等都通过构造函数注入而不是在方法内部直接import方便单测。# file: skills/leave/leave_request_create.py from skills.base import BaseSkill class LeaveRequestCreateSkill(BaseSkill): name leave_request_create version 1.0.0 def __init__(self, hr_client, im_client, org_client): self.hr_client hr_client # 人事系统客户端 self.im_client im_client # 即时通讯客户端 self.org_client org_client # 组织架构客户端 def execute(self, params: dict, context: dict) - dict: operator_id context[operator_id] # 1. 查询假期额度 capacity self.hr_client.query_capacity( user_idoperator_id, leave_typeparams[leave_type] ) if capacity self._calc_days(params[start_date], params[end_date]): return self._error(business_error, f假期额度不足剩余额度 {capacity} 天) # 2. 创建请假申请 leave_id self.hr_client.create_leave_request( user_idoperator_id, leave_typeparams[leave_type], start_dateparams[start_date], end_dateparams[end_date], reasonparams.get(reason, ) ) # 3. 查找直属主管 manager_id self.org_client.get_manager(operator_id) # 4. 发送通知 self.im_client.send_message( targetmanager_id, contentf您的下属 {operator_id} 提交了{params[leave_type]}请假申请单号 {leave_id} ) return self._ok({ leave_id: leave_id, message: 请假申请已提交请等待审批 })这段代码本身不复杂我想强调的是返回状态的设计。我把返回分成success、business_error、system_error三种business_error业务规则拒绝比如额度不足此时上层Agent应该直接告诉用户原因。system_error外部系统异常此时上层Agent应该重试或用兜底话术。这个区分极其重要。如果不区分模型会把“额度不足”和“系统崩溃”一视同仁然后一本正经地告诉用户“系统繁忙请稍后再试”非常业余。5.4 联调中的意外发现与应对这个技能上线前我在联调时发现了一个很有意思的问题当用户说“我想请个假”但没说请假类型时模型经常直接调用技能并传一个默认的annual类型而不是先追问用户请什么假。原因在于input_schema里把leave_type设成了必填但模型为了“完成用户请求”会自作主张地填一个默认值。这个行为很微妙Schema要求必填模型理解到了但它在“追问用户”和“猜一个值”之间倾向于后者尤其是在你指示它“尽量完成任务”的时候。解决办法是在description里明确加上一句“如果用户未明确请假类型不要猜测必须先向用户确认。”是的这种“人之常情”必须显式写进描述里模型才不会自说自话。这也再次印证了在Agent技能设计里description就是在跟模型“签合同”条款写得越清楚模型越守规矩。6. 技能从“能用”到“好用”生产环境的治理经验开发环境跑通技能只是万里长征第一步。真正折磨人的是上线之后——技能之间的权限边界、调用量的波动、其他人接手维护时的混乱。这一节聊聊agent-skills在生产环境给我最有价值的几个启发。6.1 技能权限与操作者身份透传企业级Agent绕不开权限问题。员工助理能查自己的假期额度但不能查别人的能提单但不能审批。在agent-skills里技能执行时不再从会话上下文里隐式取身份而是通过调度层显式注入operator_id和permission_token。这个设计在最初看起来确实有点麻烦每个技能都要声明自己需要哪些权限调度层要做一层权限校验通不过就直接拦截。但上线后你会发现这个“麻烦”是必须的。否则技能越加越多迟早会出“低权限用户通过Agent调用了高权限接口”的事故。一旦出现性质就不是技术事故而是安全漏洞了。我的习惯是在技能描述里再加一段required_permissions字段调度层在路由阶段就做预校验而不是等到技能执行一半再失败。拦截得越早用户体验越好对账也更容易。6.2 技能的版本与灰度发布技能是会演进的。今天leave_request_create还在用V1接口明天HR系统升级返回结构变了不能直接改线上代码。agent-skills的技能注册中心天然支持多版本共存一个技能可以有v1、v2两个版本同时在线按用户白名单做灰度。灰度切流的具体做法是注册中心里每个技能版本有一个weight参数调度层按比例分配流量。比如先给v2配5%的权重观察错误率和API响应分布稳定了再逐步加大最后再把v1下架。这一点对To B项目尤其重要——Agent一旦接入了生产系统它就不再是一个“实验性玩具”而是核心业务流程的一部分。所有线上变更都要有回退方案技能版本化就是Agent界的“基础设施”。6.3 技能调用的可观测性每一步都是可以回溯的最后一个治理维度是可观测性。我见过太多Agent项目出问题时排查无门——模型到底选了哪个技能参数传的是什么哪一步服务超时返回给用户的是什么全都是一笔糊涂账。agent-skills的做法是每个技能的每次调用都会记录一条包含路由结果、参数、执行步骤、耗时、返回值的完整调用链日志。配合可视化看板每天都能看到技能调用成功率、平均耗时、主要失败原因。这些数据不仅是排查工具还是技能优化的依据。例如我发现某个技能的average耗时从800ms涨到了2.5s查看调用链后发现是依赖的某个下游API在下午时段响应变慢于是调度层针对这个技能加了下午时段超时重试的配置。这些优化完全基于可观测数据而不是靠拍脑袋。我真心建议所有做Agent的团队从第一天就把日志和埋点做起来哪怕前期简陋一点也比上线后“两眼一抹黑”强得多。要知道Agent领域的故障排查比传统后端要复杂得多——你不仅要查代码还要查模型“当时是怎么想的”没有调用链日志做支撑几乎无从下手。7. 高频踩坑实录我把生产环境的雷挨个踩了一遍这一节算是我个人经验的“高危清单”。这些坑单独看都不大但组合在一起足以毁掉一个Agent项目的上线节奏。7.1 描述冲突导致的技能误调用第一个坑是技能之间描述边界模糊。我一开始给“查天气”和“查空气质量”两个技能写的description分别是“查询指定城市当前天气情况”和“查询指定城市当前空气质量”结果模型经常用“查空气质量”技能回答“今天天气怎么样”的问题因为描述里都出现了“查询”“城市”“当前”这些词模型分不清边界。后来我把两个描述重写为“当用户询问温度、降水、风速等气象要素时使用”和“当用户询问PM2.5、AQI等空气污染指标时使用”并各自加了正例和反例误调用率直接下降。描述中的动词和名词越具体模型越不容易混淆。7.2 参数默认值的隐藏风险第二个坑是给可空参数设默认值。我之前为了“用户体验”在leave_request_create里把reason字段默认成“无”想着用户不填就不填吧。结果模型越来越懒经常不追问理由直接传一个“无”上去。提交的请假单全是“无”HR那边炸了。这个问题本质上不是你写了默认值而是“默认值给了模型偷懒的许可”。后面我把reason设成必填模型就会主动追问原因。类似的经验是在技能设计里语义上的必填项必须是Schema上的必填项不要为了流程顺畅而在代码里补默认值否则模型迟早会用默认值糊弄你。7.3 长技能链路缺乏断点续跑第三个坑是长链路技能的“一损俱损”。一个复合技能如果内部串了五个原子技能中途第三个失败整个技能就返回失败用户只能重新来。这在“查额度→建申请→查主管→发通知”链路里经常出现“申请已创建但通知没发出去整体返回失败”的怪状用户一看失败就重试结果创建了两个工单。这是在agent-skills里需要特别警惕的复合技能不是简单的串行“流水线”要针对步骤依赖设计补偿逻辑。我的修复方案是把“发通知”改成非阻塞步骤即使发送失败技能仍然返回成功但把notification_sent: false放在结果里由上层Agent决定是否补充提醒。别小看这个设计在真实业务里这避免了一大批重复工单。7.4 围绕工具链的成套选型最后补充一点工具链层面的经验。agent-skills的执行调度和注册中心不一定非要整套自研或者整套照搬某个现成框架。我的做法是沿用已有的LLM网关做模型路由技能注册中心用了轻量级的配置存储技能的API编排直接用Python实现整体架构并不复杂。真正复杂的是协议设计和治理机制而这两点参考agent-skills这类项目的现成约定是最省力且相对稳固的。8. 如果让我重做一遍我会怎么设计技能体系写到这里我想把几个“如果重新来一次”会坚持到底的设计原则作为压轴内容分享出来。这些原则适用于任何基于LLM的Agent项目不局限于某一种具体框架。8.1 先定协议再写代码设计技能层的第一步不是写代码而是先定协议技能描述长什么样输入输出格式怎么约束错误码怎么分类调用链日志字段怎么定义。协议是整个体系的宪法一旦定了后面就照着执行。我见过太多团队一上来就写工具函数等写了三十个函数后才发现调用方和被调用方对错误语义的理解完全不同不得不回头统一协议重构成本巨大。agent-skills这类项目最大的价值其实不是它的代码而是它定义的那套协议规范那是无数实践沉淀下来的“正确答案”。8.2 保持技能的可替换性技能层最忌讳的一件事就是技能实现和技能定义深度耦合。我坚持的原则是技能的调用方式永远不变变的只能是内部实现。比如leave_request_create从HR系统V1迁移到V2内部代码全换但对外暴露的输入输出、错误语义一个字都不改。做到这一点后你会发现技术升级、供应商切换都变得很从容——因为替换的是一个“技术细节”而不是动整个业务链路。这也让多团队协作时互相不阻塞。8.3 用数据推翻“我觉得”最后一条可能也是最反常识的一条在Agent技能优化这件事上我逐渐不再依赖自己的直觉和“我觉得”。以前我总喜欢靠“猜”来优化觉得模型选错技能了就改description觉得某个参数传错了就加提示。但做了几个项目后我发现自己多数时候都猜得不够准。反而是调用链日志和分析数据更能说明问题。比如通过数据分析我发现某个技能失败率高不是因为模型选错而是因为用户在凌晨发起大量请求而下游系统在凌晨做数据备份响应特别慢。这个结论靠直觉是永远发现不了的。所以把可观测性建设前置让数据帮你决策是Agent工程化最值得投入的地方。如果说技能层让Agent“手上有活”那么可观测性就是让你“心里有数”。两者缺一Agent落地就始终是一场豪赌。我用agent-skills改造自己的项目也有几个月了最直观的感受是新增一个业务场景的接入成本大幅下降不再需要改动Agent主逻辑只需要写一个新的技能注册进去。后续我还会在技能编排和补偿机制上继续深挖到时有新的实战经验再回来补充。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

React Native OpenHarmony中Shimmer加载动画实现与优化 2026/9/19 19:34:31

React Native OpenHarmony中Shimmer加载动画实现与优化

1. 项目背景与核心价值在移动应用开发领域,数据加载时的等待状态处理一直是影响用户体验的关键环节。React Native for OpenHarmony作为跨平台开发的新兴解决方案,如何实现优雅的加载动画效果成为开发者关注的焦点。Shimmer效果(又称"骨…

阅读更多 →
腾讯开源WeKnora企业知识库:RAG架构解析与Docker部署实战 2026/9/19 19:34:31

腾讯开源WeKnora企业知识库:RAG架构解析与Docker部署实战

1. 为什么企业需要一个“会说话”的知识库1.1 从“翻文档”到“问问题”的转变我在过去几年帮不少团队做过内部知识管理,最常见的场景就是:新同事入职,想查一个报销流程,翻了三四个共享文件夹,最后在某个两年前的邮件附…

阅读更多 →
日语视频实时翻译实战指南:选型逻辑与避坑要点 2026/9/19 19:34:31

日语视频实时翻译实战指南:选型逻辑与避坑要点

1. 这不是工具清单,而是一份日语视频实时翻译的实战避坑指南你是不是也经历过这样的场景:刷到一条超有料的日语ASMR视频,想学发音细节,结果字幕卡在半路;或者追一档日本小众访谈节目,嘉宾语速快、方言重、还…

阅读更多 →
Phaser DataManager 完整指南:GameObject、Scene 与 Registry 三层键值数据存储与事件驱动状态管理 2026/9/19 19:34:31

Phaser DataManager 完整指南:GameObject、Scene 与 Registry 三层键值数据存储与事件驱动状态管理

Phaser DataManager 完整指南:GameObject、Scene 与 Registry 三层键值数据存储与事件驱动状态管理 【免费下载链接】phaser Phaser is a fun, free and fast 2D game framework for making HTML5 games for desktop and mobile web browsers, supporting Canvas an…

阅读更多 →
Broadcom账号注册全攻略:免费下载VMware Workstation Pro 2026/9/19 19:34:31

Broadcom账号注册全攻略:免费下载VMware Workstation Pro

1. 为什么现在下载 VMware Workstation Pro 必须过 Broadcom 账号这一关VMware Workstation Pro 这款虚拟机软件,在开发和运维圈子里几乎是标配工具。不管是跑 Linux 测试环境、做 Windows 兼容性验证,还是搭建隔离的实验沙箱,它都是很多人电…

阅读更多 →
9款高效降AI率工具测评与学术写作优化指南 2026/9/19 19:31:30

9款高效降AI率工具测评与学术写作优化指南

1. 项目背景与核心价值作为一名长期关注数字生产力工具的教育科技从业者,我注意到当前教育工作者和研究人员面临着一个共性痛点:如何在保持学术严谨性的前提下,合理利用AI工具提升工作效率。特别是在论文写作、课件制作、数据分析等场景中&am…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞