springAI学习:Advisors
spring AI Advisors类似于拦截器,会对请求的prompt做出特定的修改和增强(比如传入历史沟通记录、搜索信息等等),以达到完善prompt的目的。通过Advisors API,开发人员可以创建更为复杂、可重用、可维护的AI组件。下面介绍下Advisors的运作原理。
我用的是包是spring-ai-alibaba-starter-dashscope, Advisor相关逻辑在spring-ai-client-chat-1.0.0.jar。
针对流式和非流式两个场景,Advisor有两组核心类
场景 | 类名 | 包含方法 | |
流式 | StreamAdvisor | adviseStream | |
流式 | StreamAdvisorChain | nextStream、getStreamAdvisors | |
非流式 | CallAdvisor | adviseCall | |
非流式 | CallAdvisorChain | nextCall、getCallAdvisors |
order可以定义advisor优先级,这将决定先调用哪一个(数越小代表优先级越高)。
name是advisor的名称。
nextCall/nextStream是关键方法,主要根据order获取当前可以执行的advisor,并且调用advisor的adviseCall/adviseStream, adviseCall/adviseStream又会调用advisor的before和after方法,以BaseAdvisor为例,代码如下:
以CallAdvisor为例,具体实行的逻辑如下:
1. Spring AI 根据用户的提示创建一个 chatClientRequest 对象。
2. 链中的每个advisor都会处理请求,并可能对其进行修改。
3. 最终的advisor将请求发送至聊天模型。
4. 聊天模型的响应随后会通过advisorChain传递回去,并转换为chatClientResponse。
5. 每位advisor都可以处理或修改回复。
6. 最终的chatClientResponse通过提取聊天完成内容返回给客户端。