拒绝重复开发!企业级AI技能共享平台,一次开发全平台共享

4 阅读7分钟

我做了一个开源项目:一次开发,全平台所有AI应用自动获得工具调用能力

大家好,我最近开源了一个有意思的项目——Cloud Skill,一个企业级云原生技能管理平台。

今天想和大家聊聊这个项目解决了什么问题,以及它和市面上其他动态工具方案有什么不同。


🤔 你是否遇到过这些痛点?

做企业级AI平台的同学应该都有体会:

当你的公司有10个AI应用,每个AI应用都需要调用"查询用户信息"、"查询订单"、"创建工单"这些工具,你会怎么做?

传统方案

每个AI应用都重复写一遍这些工具函数,然后每次工具更新,10个应用都要重新打包部署...

结果就是:

  • ❌ 重复开发,浪费人力
  • ❌ 更新发布慢,从需求到上线要按天算
  • ❌ 多个应用版本不一致,维护困难
  • ❌ 没有统一权限管控,安全风险大
  • ❌ 调用数据分散,无法全局统计优化

💡 我的思路:技能云原生,一次开发全平台共享

Cloud Skill 的核心理念就是:

一次开发技能,全平台所有AI应用自动获得调用能力,动态更新实时生效,无需重启,无需重复部署。

整个架构分成三个部分:

┌──────────────┐      ┌──────────────┐      ┌──────────────┐
│  Provider    │  →   │   Admin     │  →   │  Consumer    │
│ 技能提供者   │ 扫描 │  统一管理平台│ 拉取 │  AI消费者   │
│ 开发业务接口 │──────▶ 权限分配管理│──────▶ 动态注入使用│
└──────────────┘      └──────────────┘      └──────────────┘

工作流程:

  1. Provider:业务团队用 Spring MVC 开发好接口,引入 cloud-skill-scanner-spring-boot-starter,启动时自动扫描所有接口,生成技能定义,预注册到 Admin
  2. Admin:平台管理员审核,分配权限给对应的 Consumer 服务
  3. Consumer:AI 消费者应用引入 cloud-skill-spring-boot-starter,自动从 Admin 拉取技能,动态转换为 Spring AI 的 ToolCallback,注入到 ChatModel 中
  4. 实时更新:Provider 更新接口后,自动推送到所有 Consumer,秒级生效,不需要重启任何 Consumer 应用

✨ 核心特性

1. 🎯 真正的动态注入,版本一致性保证

市面上很多"动态工具"方案,都是说单个应用内部动态加载,而 Cloud Skill 是跨应用云原生动态

  • ✅ 注入前版本校验:每次调用前对比本地时间戳和服务端全局时间戳
  • ✅ 过期自动同步:如果发现本地版本过期,自动触发全量同步
  • ✅ Redis 发布订阅:技能变更实时推送,秒级生效
  • ✅ 最终一致性:定时同步兜底,保证网络分区后数据最终一致

2. 🔌 同时兼容 Spring AI 和 Spring AI Alibaba

这个很重要,现在 Java AI 生态主要就是这两个:

框架支持情况
Spring AI 官方✅ 完整支持 ChatModel/ChatClient/ReactAgent
Spring AI Alibaba (DashScope)✅ 特殊适配,正确转换工具格式

不需要改代码,引入依赖就能用。

3. 🛡️ 三级细粒度控制

支持全局/类/方法三级控制,优先级:方法注解 > 类注解 > 全局配置

@RestController
@EnableDynamicSkills  // 整个类启用
public class AiController {
    
    @GetMapping("/chat")
    public String chat(String message) {
        // 继承类注解,启用动态技能
        return chatClient.prompt().user(message).call().content();
    }
    
    @GetMapping("/status")
    @EnableDynamicSkills(false)  // 这个方法禁用
    public String status() {
        return "ok";
    }
}

4. 🔧 模板方法架构,易于扩展

技能变更监听和工具注入都采用模板方法模式:

// 新增一种消息队列只需要继承这个类
public abstract class AbstractSkillChangeListener {
    // 模板方法:版本校验 + 消息处理 + 全量同步
    public final void onSkillChange() {
        checkVersion();
        processMessage();
        if (needFullSync()) {
            doFullSync();
        }
    }
    // 子类只需要实现具体细节
    protected abstract void processMessage();
}

5. 📊 企业级生产特性

  • 权限控制:公开/私有技能,服务级权限分配
  • 容错降级:超时控制、重试、本地缓存降级
  • 可观测性:内置 Micrometer 指标,全链路监控
  • SPI 扩展:SkillConverter、SkillExecutionHook 允许自定义扩展

🆚 和其他开源项目对比

我调研了 GitHub 上几个类似的动态工具项目,整理一下区别:

项目核心定位和 Cloud Skill 的关键区别
spring-ai-dynamic-tool本地 JAR 动态加载工具它是单体应用本地加载;Cloud Skill 是云端分发全平台共享
spring-ai-function-loader从文件加载函数定义它只给当前应用加载;Cloud Skill 让全平台所有应用共享
dynamic-function-calling-starter扫描 @Function 自动注册它扫描注解方法本地注册;Cloud Skill 扫描 Spring MVC 接口注册到远程平台
Cloud Skill (你的项目)云原生技能共享平台一次开发,全平台共享,动态更新实时生效

一句话总结:

  • 它们解决:单个应用内如何更好地动态管理工具
  • Cloud Skill 解决:多个 AI 消费者应用如何从中心化平台动态共享技能

这是两个不同层级的问题。


📈 业务价值对比

维度传统开发模式Cloud Skill 模式
工具开发每个 AI 应用重复开发一次开发,全平台自动获得
更新发布每个应用重新打包部署服务端注册后,所有消费者实时获得,秒级生效无需重启
运维成本多应用分散维护,重复劳动集中管理,一次更新全平台同步
版本一致性不同应用版本参差不齐所有消费者自动同步最新版本
安全管控无统一管控统一权限、审计、限流
可观测性无统一监控全链路监控,可观测性强

⚠️ 劣势分析(实话实说)

任何架构都有适用场景,Cloud Skill 也不是银弹:

  1. 需要额外部署:需要部署 Admin 平台 + Redis,对中小项目来说确实有点重
  2. 网络依赖:纯本地单机场景确实过度设计了
  3. 架构复杂:需要理解整条链路,调试比纯本地麻烦一点
  4. 适用场景:更适合企业级多租户 AI 平台,不适合个人小项目

所以:

  • 如果你是做企业 AI 平台,多个消费者共享技能 → 非常适合
  • 如果你只是做个个人小项目,就想本地用 → 那些轻量方案更适合

🚀 快速体验

1. Provider 端(技能提供者)引入 Scanner:

<dependency>
    <groupId>cloud.skill</groupId>
    <artifactId>cloud-skill-scanner-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

配置:

cloud:
  skill:
    scanner:
      enabled: true
      admin-server-url: http://your-admin-server:8080
      global-mode: true  # 自动扫描所有 Spring MVC 接口

启动应用,自动扫描注册到 Admin,搞定!

2. Consumer 端(AI 消费者)引入 SDK:

<dependency>
    <groupId>com.cloudskill</groupId>
    <artifactId>cloud-skill-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

配置:

cloud:
  skill:
    enabled: true
    server-url: http://your-admin-server:8080
    service-name: my-ai-app

直接使用:

@RestController
@EnableDynamicSkills
public class AiChatController {
    
    private final ChatClient chatClient;
    
    public AiChatController(ChatClient chatClient) {
        this.chatClient = chatClient;
    }
    
    @GetMapping("/chat")
    public String chat(@RequestParam String message) {
        // 所有分配给你的技能已经自动注入了!
        return chatClient.prompt()
                .user(message)
                .call()
                .content();
    }
}

就这么简单,启动就能用!技能更新自动同步,不需要重启。


🏗️ 整体项目结构

cloud-skill/
├── cloud-skill-spring-boot-starter/          # SDK,消费者使用
├── cloud-skill-scanner/                     
│   └── cloud-skill-scanner-spring-boot-starter/  # 扫描器,提供者使用
└── cloud-skill-admin/                        # 管理平台,统一管理

三个模块各司其职,松耦合,易扩展。


🎯 总结

Cloud Skill 填补了一个市场空白:企业级多租户 AI 平台的中心化技能共享解决方案

它的核心理念就是:

让技能像云一样,按需分发,动态更新,一次开发,全平台共享。

如果你正在做企业 AI 平台,被多应用重复开发工具的问题困扰,欢迎试用一波,欢迎 Star 🌟


🔗 项目地址

GitHub: github.com/Rainbow0328…

欢迎 Star,欢迎 Issue,欢迎 PR!


你怎么看这个架构设计?欢迎在评论区交流讨论 👇


Tags: #Java #SpringBoot #SpringAI #AI #大模型 #函数调用 #ToolCalling #MCP #云原生 #开源