链式组件 Advisors
作用

Advisor 是 SpringAI 中极其重要的一个组件,构建了整个 SpringAI 的执行流程。
简单原理如上图所示:多个 Advisor 组成链表结构,在调用大模型前按照优先级从高到低依次执行前置逻辑,之后执行大模型调用,最后在大模型调用之后按照优先级从低到高依次执行后置逻辑。
如果熟悉 Dubbo 的 Filter 链式结构,Advisor 的作用就相当于 Filter 的作用。不过 SpringAI 做的更彻底,将对大模型的调用也包装为一个 advisor,该 advisor 的优先级最低。
原理分析
java
@RequestMapping("/10000")
public String execute10000() {
return chatClient.prompt()
.advisors(new SimpleLoggerAdvisor())
.user("tell me a joke")
.call()
.content();
}步骤如下:
- 启动时创建
DefaultChatClient实例,其间接包含属性List<Advisor> advisors advisors(new SimpleLoggerAdvisor()):新建一个SimpleLoggerAdvisor实例,添加到 1 中的 advisors 列表里call():仅看同步调用,新建一个ChatModelCallAdvisor,添加到 1 中的 advisors 列表里(ChatModelCallAdvisor就是真正调用模型的地方);新建一个DefaultAroundAdvisorChain实例,将 advisors 列表设置为其的一个属性,并且对该列表中的Advisor实例按照getOrder()进行排序。order 越小,优先级越高,越先执行。content():调用DefaultAroundAdvisorChain的nextCall()方法,依次执行 advisors 列表的链式调用
说明:
Advisor的 order 属性值越小,优先级越高,越先执行;自定义的Advisor需要格外注意该值的定义ChatModelCallAdvisor的优先级最低,order=Integer.MAX_VALUE- 官方建议在启动构建
ChatClientBean时,使用defaultAdvisors()方法注册Advisor
自定义一个 Advisor
java
import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
import org.springframework.ai.chat.client.advisor.api.CallAdvisor;
import org.springframework.ai.chat.client.advisor.api.CallAdvisorChain;
public class MyCustomAdvisor2 implements CallAdvisor {
@Override
public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain callAdvisorChain) {
/*
* 前置逻辑
*/
System.out.println("MyCustomAdvisor2: start");
/*
* 传递上下文参数
*/
chatClientRequest.context().put("customAdvisor", "MyCustomAdvisor2");
/*
* 链式调用,最后到 LLM 调用
*/
ChatClientResponse chatClientResponse = callAdvisorChain.nextCall(chatClientRequest);
/*
* 后置逻辑
*/
System.out.println("MyCustomAdvisor2: end");
return chatClientResponse;
}
@Override
public String getName() {
return this.getClass().getSimpleName();
}
@Override
public int getOrder() {
return -2;
}
}以上仅展示了同步调用的方式,流式调用需要实现 StreamAdvisor,可以参考 org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor 进行实现。
文章的最后,如果您觉得本文对您有用,请打赏一杯咖啡!感谢!
