ai-agent框架spring ai/alibaba源码原理分析(二) 模型,chat模型,chatclient

简介

saa是java的ai agent框架,本系列将深入剖析 Spring AI Alibaba 的源码实现与核心原理,不仅可以指导agent的开发,更可以改造框架,增加新特性

系列内容:

系列( 一) 架构 完成

系列( 三) 调用

I 工具 完成

II MCP

-1 MCP 能力,工具,资源,Prompts ,sampling ,。。。;springboot 自动配置;完成

-2 分布式 MCP

-3 MCP security

III skills 完成

系列( 四) RAG 知识库,文档读取,分块;嵌入,向量; 检索,增强生成,模块化, 混合检索,融合重排 完成

系列( 二) 模型 ,chat 模型,chat client ,提示词,advisor 组件;chat 记忆 << 本文

系列( 五) graph 图结构,节点和边;StateGraph ,CompiledGraph ;图执行

系列( 六) agent ,ReactAgent,FlowAgent;钩子和拦截器;上下文工程

系列( 七) MAS

I FlowAgent ,sub agent ,agent tool ;handoffs 模式,toolcalling 模式;

II 分布式agent ,A2A ,agent 集群,AP2AP

III 集成agentscope-java ,agentic 模式,消息hub

系列( 八) 模型评估; 观测

系列( 九) agent 管理平台 agent 发布,列表,提示词管理,会话管理,skill 管理,MCP 服务管理;评估;观测

本文分析Chat模型,包括chat model ,chatclient,提示词,advisor组件

based spring ai aliba ba v1.1.2.2,spring ai v1.1.2

关键词

Chat模型

Chat Client

缩写

spring ai缩写sa

spring ai alibaba 本文缩写saa

参考资料

概览 | Spring AI Alibaba spring ai alibaba官网文档

https://docs.spring.io/spring-ai/reference/index.html spring ai官方文档

组件/场景

上图是saa原理源码分析场景视图,每个包对应着saa/sa组件或特性,是本文分析的目录

model 大模型的封装,模型包括Chat,嵌入,audio,image等类型,其中chat模型包括,advisor组件,提示词,记忆等

agent/graph agent和图紧密相关,可以认为agent是一种既定的"图"形,开发人员可以使用graph低层api直接构建graph,也可以使用agent获得既定的图形,简化和加快agent的开发

外部调用(calling) 调用可能是agent发展演变最快的部分,最初的工具,到mcp,最近的CLI,skills

RAG 检索增强生成

MAS 多个agent协同工作,每个agent有独立职能

studio 简易的agent管理工具,嵌入到agent,带有agent面板,列表agent;提供chat界面,用于调试agent,是开发agent的便利工具

admin 管理台, agent的发布,列表,管理,执行;提示词工程,评估和数据集,观测

模型的模型

sa提供可移植的model 设计,用户可以无缝切换不同的模型提供商,本节分析模型的模型

上图是model的类图,model分成多个类型,chat,图形,语音,翻译,嵌入等,有些大模型厂商实现比较多,有些实现少些,如,deepseek只有ChatModel

模型是模板类,两个模板参数,TReq ModelRequest类型;Tres ModelResponse类型,这两个类型是调用(call)模型的参数。

chat模型/chat client

在对话式AI,ChatModel 及model api 封装了 大模型的调用,Chat Client 则是"交互载体",提供用户消息,系统消息,advisor,工具等设置。ChatClient构建标准请求,ChatModel **转换为具体实现的格式,**发送给模型端,模型返回生成的回复后,ChatClient封装ChatReponse给用户。

chat模型

本节分析sa模型的设计

上图ChatModel类图

ChatModel 封装大模型厂商的模型api,起到承上启下的作用,对上,接收spring ai的标准请求组件,如,UserMessage,SystemMessage,ChatOption,TooCallback;对下,转换spring ai请求的组件为大模型api要求的类型,大模型返回,转换为spring ai组件,Chat Response,Generation,AssistantMessage

Message sa的消息组件,消息是内容的载体,请求和返回都用到消息。消息有几钟类型,上图只展示了AssistantMessage,用于返回生成的内容,还有UserMessage,SystemMessage,ToolResponseMessage,分别用于用户输入的查询,agent本身配置的定义Agent的角色、职责,工具返回消息

Prompt 提示词,ModelRequest实现类,携带Message集合,类型是UserMessage或者SystemMessage;带有ChatOption,大模型请求选项

ChatResponse 大模型调用返回,多个Generation

Generation 大模型生成结果,ModelResult实现类,使用AssistantMessage返回内容

AssistantMessage 除了返回内容,还有大模型ToolCall请求

**总结:**spring ai统一的模型调用api,使得agent可以无缝切换模型厂商,同时spring boot支持模型特有的配置,最大可能地使用模型独有的能力。

chat client

本节分析ChatClient,ChatModel暴露call方法,可以不使用ChatClient直接调用大模型,ChatClient的作用是用户设置大模型调用参数提供友好的api,可灵活而优雅地设置大模型调用的参数。

上图ChatClient类图

ChatClientAutoConfiguration 自动配置,负责构建ChatClient.Builder

ChatClient.Builder ChatClient构建器,注意,构建器是原型模式,意味着每个注入点是独立的实例,可以独立配置ChatClient,ChatClient由默认配置和请求设置,默认设置是ChatClient生命周期,请求设置请求有效,设置项包括advisors,tools等

ChatClientBuilderConfigurer /ChatClientCustomizer 给用户定制ChatClient.Builder的组件

ChatClient /DefaultChatClientChatClient的prompt方法,返回ChatClientRequestSpec

上图ChatClient的prompt方法,以及DefaultChatClientRequestSpec工具属性,这里看到一个技巧,

新建返回给用户的DefaultChatClientRequestSpec的属性list已赋值新集合,

ChatClient的defaultChatClientRequest的属性addAll到新集合,

这样ChatClient的default设置不受影响,后续新的DefaultChatClientRequestSpec请求范围的增加累加起来,后面ChatClient再请求只有default的属性,这样实现了ChatClient实例范围和请求范围的设置

DefaultChatClient调用call,这个call方法不是真正调用Model,但做了两个关键事情

首先,偷偷的塞入了模型调用advisor,模型的真正调用者

第二,DefaultChatClientUtils.toChatClientRequest方法,构建ChatClientRequest,也是调用大模型前工具的处理方法,这在系列-工具那文分析了,不再重复

大模型调用在下一节分析

调用大模型

上节分析chat client设置用户消息,系统消息,上下文,advisor,直到CallResponseSpec,本节从CallResponseSpec开始,分析调用chat model

上图chatmodel调用类图

CallResponseSpec 调用advisor链的nextCall,advisor链挨个执行advisor,关于advisor链执行下节分析,上节分析,advisor链塞入ChatModelCallAdvisor,这个advisor负责调用大模型

ChatModelCallAdvisor 调用ChatModel的call方法,构建ChatResponse

ChatModel ChatModel每个大模型厂商各自实现,这里就不深入分析

advisor

advisor是ChatClient的拦截器组件,拦截器是sa给用户扩展,修改和处理提示词,spring ai自身也使用advisor实现功能特性

上图是advisor类图

CallAdvisor/BaseAdvisor 前者advisorCall方法,执行一次;后者的advisorCall实现分开before和after,也就是

before()->nextCall->after(),提供模型调用前,调用后的处理方法

ToolCallAdvisor/StructuredOutputValidationAdvisor 这两个是递归advisor,依据判断递归执行,

下面介绍一下ToolCallAdvisor

大模型调用返回,若有ToolCall请求,ToolCallAdvisor执行工具调用,调用完成,返回结果,结果可能还有工具请求,继续执行工具调用,同时,每轮调用ToolCallAdvisor后面的advisor要先执行一次,保证执行完整性

StructuredOutputValidationAdvisor 也是递归advisor,将在系列-agent介绍

!saa的agent框架提供interceptor,类似advisor的组件

chat记忆

本节分析chat记忆组件,大模型是无状态,多轮调用依赖外部的记忆,取出之前的chat记忆,通过提示词给大模型,帮助大模型了解上下文,更好理解当前的查询,生成内容更能贴近用户想要。

上图是chat记忆组件

ChatMemory 记忆组件的接口,MessageWindowChatMemory记忆组件实现,消息窗口,窗口外的消息截掉,窗口宽度是maxMessages属性设置

ChatMemoryRepository 记忆存储库

MessageChatMemoryAdvisor 记忆组件通过advisor接入,MessageChatMemoryAdvisor继承BaseAdvisor,before方法取出消息,写入提示词,after方法保存调用大模型后产生的新的消息,消息窗口前移。

多轮记忆是用conversationId串起来,conversationId通过advisor的context传递,目前由外部提供,sa自身不负责生成

! 记忆太多造成上下文过长,大多数模型在处理长上下文表现很差,saa提供机制,例如,对记忆做summary,减少记忆大小,另外,大模型输出一旦走偏,记忆反而成为负面影响,负面积累导致输出偏离越来越远,不着边际。

! saa的agent有自己记忆组件,分析agent时再深入分析

**总结:**ChatClient/ChatModel承担着设置模型调用的参数和上下文,包括advisor和工具,调用大模型的责任,如果说大模型是agent的发动机,ChatClient/ChatModel是变速箱,转化发动机源源不断的动力为agent前进的动力,ChatClient/ChatModel是否高效,传动是否可靠直接影响着agent能走多远,能走多快。

其他

++结构化输出++ sa提供结构化输出组件,saa在agent优化了该组件的使用,结构化输出放到agent分析

NEXT

前面几个系列,分析了spring ai的组件,sa并没有agent类,定位做零部件,定义零部件规范和标准,spring ai alibaba是做成品,面向应用,下面系列分析saa

相关推荐
算力视野2 小时前
AMD Instinct MI325X/MI350X路线图深度解析:288GB HBM3e如何硬刚英伟达?
人工智能·gpu算力
得物技术2 小时前
用 LLM Agent 重构告警排查流程|得物技术
java·人工智能·后端
容智信息2 小时前
提示词工程不是写长说明书,而是做语义压缩
人工智能·prompt·安全威胁分析·提示词·智能体
zandy10112 小时前
体系化AI创新赋能产业升级 联想集团树立智能时代企业创新标杆
大数据·人工智能
dehuisun2 小时前
openspec基础实战
人工智能
MacroZheng2 小时前
阿里Qoder + GLM-5.1,夯爆了!
前端·vue.js·人工智能
郑洁文2 小时前
基于卷积神经网络的智能车牌识别系统
人工智能·深度学习·神经网络·车牌识别
贾修行3 小时前
大模型微调实战指南:从技术原理到Qwen多模型矩阵的工程
人工智能