简介
spring ai alibaba是java的ai agent框架,本系列将深入剖析 Spring AI Alibaba 的源码实现与核心原理,不仅指导agent的开发,更可以改造框架,增加新特性,贡献Spring AI Alibaba的发展。
系列内容:
系列( 一) 架构 完成
系列( 二) 模型,chat 模型,提示词,消息,结构化转换,chat 记忆;chat client ,advisor 组件 ß 本文
系列( 三) 外部调用 工具/skills ,MCP ,nacos
系列( 四) graph :StateGraph ,CompiledGraph ;图执行,节点和边
系列( 五) agent ,ReactAgent ;钩子和拦截器,上下文工程
系列( 六) RAG 知识库,包括文档读取,分块,嵌入,向量store ;检索增强生成
系列( 七) multi agent ,FlowAgent ,a2a agent ,handoffs 模式,toolcalling 模式;agent team ,调度,容错
agent 管理运行平台,spring ai alibaba admin ,agent 发布,管理,执行,提示词管理,评估,观测
本文分析外部调用III skills
based spring ai alibaba v1.1.2.2,spring ai v1.1.2
关键词
skills
缩写
spring ai缩写sa
spring ai alibaba 本文缩写saa
参考资料
https://java2ai.com/docs/overview spring ai alibaba官网文档
组件视图

上图是saa原理源码分析场景视图,每个包对应着saa/sa组件或特性,是本文分析的目录
model 大模型的封装,模型包括Chat,嵌入,audio,image等类型,其中chat模型包括,advisor组件,提示词,记忆等
agent/graph agent和图紧密相关,可以认为agent是一种既定的"图"形,开发人员可以使用graph低层api直接构建graph,也可以使用agent获得既定的图形,简化和加快agent的开发
调用(calling) 调用包括工具,mcp, skills,CLI,
RAG
MAS 多个agent协同工作,每个agent有独立职能
studio 简易的agent管理工具,嵌入到agent,带有agent面板,列表agent;提供chat界面,用于调试agent,是开发agent的便利工具
admin 管理台, agent的发布,列表,管理,执行;提示词工程,评估和数据集,观测
本文分析的skill属于外部调用场景
调用
如果说agent是一个人,大模型是大脑,调用是手脚,执行动作干实事,调用在不断发展演变中,目前已有工具,MCP,skills等多种方式
Skills
skills是目前最新的调用方式,可以认为skills是任务的操作手册,大模型学习skill手册实现完整的功能,skill利用现有工具,通过提示词,大模型便完成新功能,作为对比,使用工具,MCP,需要开发。skilll渐进式披露机制,减少提示词的规模。
同时,我们也看到skill的问题,调试工作比较复杂,没有断点,目前只有依赖可观测,大模型理解是不是正确的,开展的工作是不是正确的。
saa支持skills,sa还没有支持
设计原理
本节分析saa的skill类设计,工作的原理

上图skills及其相关设计类图
SkillsAgentHook 负责初始化SkillsInterceptor,给SkillsInterceptor设置SkillRegistry,向agent框架提供该拦截器;负责初始化ReadSkillTool,向agent框架提供ReadSkillTool
SkillsInterceptor 负责生成skills摘要说明,给model 请求增加skills用到的工具
GroupedTools 以skill分组的工具,这是渐进披露的一部分,提示词只包含skills需要的工具
SkillRegistry skills注册器,拥有SystemPromptTemplate,用于生成skills摘要说明,最后合并到系统提示词
ReadSkillTool 工具,BiFunction实现,返回String,也就是skills的详细说明
关于groupedTools
groupedTools是渐进披露的一部分,提示词只写入skill使用到的工具,但目前需要手动设置,Skill.md没有标准的属性存放skill使用的工具。据了解,目前社区有各自的解决方案,个人觉得Skill.md增加标准字段allowed-tools是比较好的方案。
skill注册
本节分析skill注册

上图skills注册类图
SkillMetadata skill的元素据,包括名称,说明,详细内容等,其中source有两种,user, project
skills 注册有两个实现,ClasspathSkillRegistry和FileSystemSkillRegistry,两者都是从文件/文件夹载入skills,前者是jar包,后者本地文件夹
SkillRegistry实现提供SystemPromptTemplate,用于生成skills详细说明,
skill描述
大模型是通过skill描述学习skill,skill描述可分为摘要描述和完整描述,这也是渐进式披露的核心
skill摘要
用户输入查询,调用agent,agent提取skills的名字和描述,写入系统提示词,skills的名字和描述内容少,不会让提示词爆炸式增长,完整的描述通常内容多
SkillsInterceptor.interceptModel
buildSkillsPrompt方法拼接skills的名称,描述成字符串
buildSkillsPrompt

skills_list, skills_load_instructins为系统提示词模板的占位符
大模型怎么学会skills
agent偷偷的通过系统提示词模板塞了一份skills说明给大模型。

skills_list skill的名称列表,解释了read_skill使用,skills_load_instructins是skills文件位置信息,没有使用
skill详细说明
大模型从系统提示词获得skills摘要,若用户问题适用某个skill,大模型调用`read_skill`工具,即类设计介绍的ReadSkillTool,获取skill的详细说明,如下图
ReadSkillTool

大模型获得skill使用详细的使用指南,学习skill
示例分析
本节分析skill示例代码,saa的skills example,类似text2sql的示例,用户输入分析需求,返回sql
示例结构
本节分析示例结构

上图是示例的结构

上图配置类,声明skills注册类,SkillsAgentHook,ReactAgent

上图是示例执行类,应用启动后runner直接调起测试,查询:
"Write a SQL query to find all customers who made orders over $1000 in the last month"
客户销售查询,应用集成了studio,可以使用chat ui测试
上图sales_analytics Skill.md示例,可以预见,runner的请求,大模型使用sales_analytics skill
观测示例运行
本节使用ide的debug,观测示例skills的运行
构建skills摘要提示词

skills注册了两个skills
skills的摘要合并到系统提示词,上图红框是上面提到的系统提示词模板的skills列表
大模型返回tool call
AgentToolNode

大模型返回toolCalls,read_skill,参数 {"skill_name": "sales_analytics"}
*ChatModel实现类(如, DashScopeChatModel**)也负责处理工具调用,默认开关设为否,来到AgentToolNode** 处理,系列 ( 二 )-agent/graph 详细分析
调用read_skill
大模型调用read_skill工具,获取skill详细说明
生成sql

最后返回大模型的思路和生成sql
总结:示例比较简单,但也足够清晰描述skills的工作原理,渐进式披露原理。skills是用户描述好任务,剩下的大模型理解和执行,从中看到AGI的影子,只需要基本工具,任务描述好,大模型可以学会新的功能。另外,我们也提到,skills的正确性依赖开发人员的描述和大模型的理解,在两者中间,开发人员使用可观测调整和迭代skills。

