Agent Skill 和普通函数有什么区别?
面试官:“你在 Agent 开发中提到的 Skill,和我们平常写的普通函数到底有什么不同?”
候选人:
“这个问题正好触及 Agent 架构的核心。普通函数是我们写了就固定执行的代码块,而 Skill 更像是给 Agent 配备的、能自主做决策的能力细胞。最根本的区别在于:函数是被动执行,Skill 是主动推理并执行。
下面我从四个维度来拆解这个差异。
一、触发与执行方式不同
普通函数必须由调用者在代码中明确写明何时调用、传什么参数,而且调用方式是完全确定的。比如 createOrder(userId, productId),你必须知道这两个参数,并由代码在合适的时机去调用它。
Skill 则不同。Agent 接收到一个模糊的自然语言目标(比如“帮我下单那个红色的背包”)后,会自主判断该激活哪个 Skill、什么时候激活、从对话历史或上下文中推断出缺失的参数,甚至主动反问用户确认。这种触发不是代码写死的,而是基于模型推理的动态决策。

二、上下文与状态管理
普通函数通常是无状态的。它处理完输入就返回输出,不关心你是谁、之前发生过什么。要在多次调用中维持状态,必须额外传入 session 对象或借助全局变量。
Skill 天然是多轮对话和长任务的管理者。它能记住历史交互、跟踪任务进度,并在跨步骤中传递状态。比如一个“预订会议”的 Skill,在选日期、选会议室、确认预定这几个步骤中,始终维护着同一份上下文,而不需要外部代码不停传递 session。
三、组合与工具使用
普通函数内部调用其他函数是硬编码的——代码里直接写了 otherFunction(),执行路径是固定的。
Skill 则通常会动态编排工具和子 Skill。它可以根据当前的情况,自己决定是先调用天气 API,还是先查日历;遇到异常时自动调整策略(比如 API 调用失败后,改用缓存数据或提示用户等待)。这种灵活性是普通函数无法具备的,因为它的执行路径不是预设的,而是在运行时由 Agent 的规划能力生成的。
四、错误处理与韧性
普通函数遇到错误时,通常抛出异常或返回错误码,由上层调用者去处理。调用者怎么处理,完全取决于我们写的 try-catch 代码。
Skill 内置了更灵活的容错机制。它可以在调用外部服务失败时,自动进行重试、降级(比如给出一个默认建议)、向用户追问澄清,甚至切换另一个工具来达成同一目标。它把错误处理从“代码级别”提升到了“认知级别”——知道如何从失败中恢复,而不仅仅是报错。
对比简表
一个实际感受
之前我们做一个客服 Agent,起初把所有后端 API 直接暴露给 Agent 调用,结果它经常搞混参数顺序,或者在不该调支付接口的时候调了。后来我们把这些 API 封装成“下单 Skill”“退货 Skill”,Skill 内部自己处理参数校验、错误重试和用户确认,Agent 不再直接面对单个函数,而是面对已经封装好业务逻辑的能力模块。这样做后,整个系统的可靠性和开发速度都提升了一大截。
如果把普通函数比作一块块乐高积木,那 Skill 就是一个会读图纸、会自己找积木、遇到缺件还会问你的组装机器人。你不再需要告诉它每一步怎么做,只需要告诉它“想搭什么”,它会自己去执行。两者的差距,正是自动化与智能化的那道分水岭。