写了 10 个 Agent Skill 后,我把 300 行重复代码压到了 30 行
1. 引言在最近的一个 AI Agent 项目中我陆续编写了 10 个不同的 Agent Skill。每个 Skill 都负责一个独立的业务能力比如查询天气、发送邮件、调用内部 API、解析文档等。写第一个 Skill 时很顺畅写第二个也还行但写到第五个时我发现自己陷入了 CtrlC / CtrlV 的泥潭。每个 Skill 都包含几乎相同的模板代码参数校验、错误处理、日志记录、结果格式化……10 个 Skill 下来光这些重复的“骨架”代码就堆了将近 300 行。这不仅让代码库变得臃肿更可怕的是——每次要修改公共逻辑比如统一日志格式就得手动改 10 个文件。于是我决定重构。最终通过抽象公共基类和装饰器模式我把这 300 行重复代码压缩到了 30 行。这篇文章就来分享我是怎么做到的。2. 问题重现一个典型的 Agent Skill 长什么样先看一个典型的 Skill 实现。假设我们有一个WeatherSkill用于查询天气classWeatherSkill:def__init__(self,name:strweather):self.namename self.loggerlogging.getLogger(self.name)defcan_handle(self,intent:str)-bool:returnintentquery_weatherdefexecute(self,params:dict)-dict:# 参数校验ifcitynotinparams:return{success:False,error:Missing city parameter}# 业务逻辑try:resultself._query_weather(params[city])# 结果格式化return{success:True,data:result}exceptExceptionase:self.logger.error(fFailed to query weather:{e})return{success:False,error:str(e)}def_query_weather(self,city:str)-dict:# 实际的 API 调用return{temperature:25,condition:sunny}看起来还不错但当你写出第 2 个、第 3 个 Skill 时你会发现__init__、can_handle、execute里的参数校验、异常捕获、日志记录、返回格式——这些代码几乎一模一样。3. 重复代码的统计与分析我整理了 10 个 Skill 的代码统计了重复部分重复模块每个 Skill 行数10 个 Skill 总行数__init__初始化3 行30 行can_handle意图匹配3 行30 行execute参数校验5 行50 行executetry-except 包裹6 行60 行日志记录4 行40 行结果格式化3 行30 行其他类型注解、文档字符串等6 行60 行合计30 行300 行核心业务逻辑真正的 API 调用、数据处理只占每个 Skill 的 20% 左右。80% 的代码都是“基础设施”。4. 重构方案抽象基类 装饰器我的目标是让每个 Skill 只写业务逻辑其余全部由框架自动完成。4.1 定义抽象基类首先创建一个BaseSkill把公共逻辑全部收进来importloggingfromabcimportABC,abstractmethodfromfunctoolsimportwrapsclassBaseSkill(ABC):def__init__(self,name:strNone):self.namenameorself.__class__.__name__.lower()self.loggerlogging.getLogger(self.name)defcan_handle(self,intent:str)-bool:# 默认通过类名匹配子类可覆盖returnintentself.namedefexecute(self,params:dict)-dict:# 统一的执行入口自动包裹校验和异常处理try:self._validate(params)resultself._execute(params)returnself._format_result(result)exceptExceptionase:self.logger.error(fExecution failed:{e},exc_infoTrue)return{success:False,error:str(e)}def_validate(self,params:dict):子类可重写默认不做校验passabstractmethoddef_execute(self,params:dict)-dict:子类必须实现真正的业务逻辑passdef_format_result(self,result:dict)-dict:子类可重写默认包装为成功响应return{success:True,data:result}4.2 用装饰器处理参数校验对于需要参数校验的 Skill我写了一个装饰器避免在每个_execute里写 if-elsedefrequire_params(*required_keys):defdecorator(func):wraps(func)defwrapper(self,params:dict,*args,**kwargs):missing[kforkinrequired_keysifknotinparams]ifmissing:raiseValueError(fMissing required parameters:{missing})returnfunc(self,params,*args,**kwargs)returnwrapperreturndecorator4.3 重构后的 Skill 长什么样现在一个 Skill 只需要 3 行核心代码classWeatherSkill(BaseSkill):require_params(city)def_execute(self,params:dict)-dict:return{temperature:25,condition:sunny}另一个 Skill 也类似classEmailSkill(BaseSkill):def__init__(self):super().__init__(namesend_email)require_params(to,subject,body)def_execute(self,params:dict)-dict:# 真正的发邮件逻辑return{message_id:12345,status:sent}5. 效果对比重构前后对比指标重构前重构后每个 Skill 平均代码行数30 行3 行10 个 Skill 总行数300 行30 行公共逻辑修改改 10 个文件改 1 个基类新增一个 Skill 成本30 行模板 业务3 行业务单元测试覆盖难模板代码干扰易只测业务更重要的是可维护性得到了质的提升。后来我又加了 5 个 Skill每个只花了 5 分钟写业务逻辑再也不用复制粘贴了。6. 总结与思考这次重构让我深刻体会到重复代码是万恶之源。当你在写第 3 个相似的类/函数时就该停下来思考抽象方案了。抽象基类 装饰器是消除 Agent Skill 模板代码的绝佳组合。基类负责骨架装饰器负责横切关注点参数校验、权限检查等。不要过度抽象。我的原则是只有出现 3 次以上重复时才考虑抽象。过早抽象反而会增加理解成本。代码行数不是唯一目标。虽然从 300 行压到了 30 行但更重要的是代码的可读性和可维护性。30 行清晰的代码远胜 300 行重复的代码。如果你也在写 Agent 或类似的插件化系统不妨试试这个模式。你会发现写代码可以是一件很清爽的事。

相关新闻

QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)

QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)

一、基础定位、头文件、继承关系 1. 引入头文件 #include <qgssinglebandpseudocolorrenderer.h>2. 继承链 QgsRasterRenderer↳ QgsSingleBandRenderer↳ QgsSingleBandPseudoColorRendererQgsRasterRenderer&#xff1a;栅格渲染器顶层抽象基类&#xff0c;所有栅格渲染…

2026/7/22 14:46:26 阅读更多 →
Qwen3-8B大模型本地化部署与vLLM优化实践

Qwen3-8B大模型本地化部署与vLLM优化实践

1. 项目背景与核心价值 在当前的AI技术浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;的本地化部署正成为开发者关注的焦点。Qwen3-8B作为通义千问团队推出的80亿参数开源模型&#xff0c;在中文理解和生成任务上展现出接近商用闭源模型的性能。而vLLM作为UC Berkel…

2026/7/22 14:46:26 阅读更多 →
Typora如何设置字体颜色

Typora如何设置字体颜色

1. 需要打开文件的偏好设置——>markdown扩展语法中——>勾选内联公式。2. 在编辑器中&#xff0c;使用 $\textcolor{颜色}{.......}$ latex语法即可修改颜色​举例&#xff1a;我想要把hello world修改成红色。$\textcolor{red}{hello world}$输入后敲击回车&#xff…

2026/7/22 14:46:26 阅读更多 →

最新新闻

低速USB信号完整性测试:眼图、抖动与边沿速率深度解析

低速USB信号完整性测试:眼图、抖动与边沿速率深度解析

1. 项目概述&#xff1a;为什么低速USB信号测试依然重要&#xff1f;在很多人看来&#xff0c;USB 2.0的低速&#xff08;Low-Speed&#xff0c; 1.5 Mbps&#xff09;模式似乎已经是“古董级”的技术了&#xff0c;现在动辄就是USB 3.2 Gen 2x2的20Gbps。然而&#xff0c;在嵌…

2026/7/22 15:27:53 阅读更多 →
面向高可靠性真空封装:元器件高可靠封装真空设备的核心工艺解析

面向高可靠性真空封装:元器件高可靠封装真空设备的核心工艺解析

一、技术背景&#xff1a;高可靠性封装为何必须依赖真空环境&#xff1f; 随着航空航天、5G通信、新能源汽车及军事电子等领域对元器件可靠性的要求不断提升&#xff0c;元器件高可靠封装真空设备已成为半导体后道工序中的关键一环。传统气氛保护焊接或普通回流焊工艺&#xff…

2026/7/22 15:27:53 阅读更多 →
嵌入式系统USB端口扩展:PCIe转USB方案硬件选型与Linux驱动配置实战

嵌入式系统USB端口扩展:PCIe转USB方案硬件选型与Linux驱动配置实战

1. 项目概述与核心价值在嵌入式系统开发&#xff0c;尤其是音视频处理、工业控制或网络设备这类多外设应用场景里&#xff0c;我们经常会遇到一个头疼的问题&#xff1a;主控芯片自带的USB主机接口不够用。比如&#xff0c;你手头有一个基于TI DM816x或AM389x系列处理器的核心板…

2026/7/22 15:27:53 阅读更多 →
TDA3xx TESOC现场测试:汽车SoC功能安全与硬件诊断实战解析

TDA3xx TESOC现场测试:汽车SoC功能安全与硬件诊断实战解析

1. 项目概述与背景在汽车电子&#xff0c;尤其是高级驾驶辅助系统&#xff08;ADAS&#xff09;和自动驾驶领域&#xff0c;芯片的长期可靠性与功能安全是产品设计的生命线。想象一下&#xff0c;一辆搭载了视觉处理芯片的汽车在高速公路上行驶了数万公里后&#xff0c;其内部的…

2026/7/22 15:27:53 阅读更多 →
AI 原生组织是什么 —— 人 + Agent 的超级协作如何落地

AI 原生组织是什么 —— 人 + Agent 的超级协作如何落地

AI 原生组织是什么 —— 人 Agent 的超级协作如何落地 引言&#xff1a;先回答一个问题&#xff0c;谁是数字员工 三年前谈企业 AI&#xff0c;大家还在问"大模型能做什么"。今天谈企业 AI&#xff0c;问题变了&#xff0c;变成"每个员工要不要带几个 Agent 工…

2026/7/22 15:27:53 阅读更多 →
飞书 / 钉钉生态 Agent 开发:办公协同自动化插件开发指南:基于TARS大模型与MCP协议的工程化落地实战

飞书 / 钉钉生态 Agent 开发:办公协同自动化插件开发指南:基于TARS大模型与MCP协议的工程化落地实战

在办公协同自动化与Agent开发的演进历程中&#xff0c;2026年7月成为了一个关键的转折点。这一时期&#xff0c;办公协同生态正经历从“辅助对话工具”向“自主任务执行体”的根本性范式转移。以飞书和钉钉为核心的办公生态&#xff0c;不再仅仅是信息的流转中心&#xff0c;而…

2026/7/22 15:26:53 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统&#xff0c;尤其是像TI C6000系列这样的高性能DSP开发中&#xff0c;我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动&#xff0c;但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案&#xff1f; 在数字化协作环境中&#xff0c;消息通知系统的重要性不言而喻明。但现实情况是&#xff0c;企业级通知方案往往需要复杂的API对接&#xff08;如企业微信、钉钉、飞书&#xff09;&#xff0c;个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点"&#xff0c;乙方听到的是"少做几页"。甲方说"不要太复杂"&#xff0c;乙方理解成"别放图表了"。结果交过去&#xff0c;甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里&#xff0c;是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中&#xff0c;我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源&#xff0c;还是配置文件、证书等&#xff0c;都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下&#xff0c;但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP&#xff08;轻量级目录访问协议&#xff09;作为企业级身份认证的黄金标准&#xff0c;已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时&#xff0c;发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”&#xff0c;而是以可解释、可审计、可迭代的方式&#xff0c;赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻