Spring Ai Advisors
本文主要介绍Spring AI advisors 的概念,以及advisors的用途和使用方法、自定义advisors等。
什么是Advisors
Advisors 中文翻译过来的意思是顾问,它是用于拦截、修改和增强AI驱动的交互。类似于Spring 的AOP,通过Advisor可以实现请求返回的日志、对敏感词的过滤、对用户问题的增强以及chatMemory的保存都可以实现。
Advisor的使用
1.SimpleLoggerAdvisor
SimpleLoggerAdvisor 主要是用于打印对话日志,对话日志中包含metedata、output、result等信息,可以看到messageType、id、使用token数、返回信息整个结构。
首先需要再application.yml中添加配置:
logging:
level:
org:
springframework:
ai:
chat:
client:
advisor:
SimpleLoggerAdvisor: DEBUG
其次在使用中通过defaultAdvisors
,设置为new SimpleLoggerAdvisor()
代码如下:
@Test
public void testAdvisor(){
ChatClient client = ChatClient.builder(deepSeekChatModel).
defaultAdvisors(new SimpleLoggerAdvisor())//对话日志记录
.build();
Flux<String> flux = client.prompt("HELLO")
.user("你好")
.stream()
.content();
flux.toIterable().forEach(System.out::println);
}
返回数据如下:
2.SafeGuardAdvisor
SafeGuardAdvisor 用于定义敏感词,在问题中出现敏感词中止回答。
使用new SafeGuardAdvisor
新建一个敏感词Advisor,使用list.of
定义敏感词集合。
如下代码:
@Test
public void testAdvisor1(){
ChatClient client = ChatClient.builder(deepSeekChatModel).
defaultAdvisors(new SimpleLoggerAdvisor(),new SafeGuardAdvisor(List.of("SB","王八蛋","TMD")))//SafeGuardAdvisor 敏感词定义,若出现敏感词中断
.build();
String content = client.prompt()
.user("TMD,天气为什么这么热")
.call()
.content();
System.out.println(content);
}
执行结果,中止执行,并给出以下提示:
I'm unable to respond to that due to sensitive content. Could we rephrase or discuss something else?
自定义Advisor
自定义Advisor需要继承BaseAdvisor
,重写before、after、getOrder方法。
before表示在调用大模型之前的操作。
after 表示在调用大模型之后的操作。
getOrder 表示多个Advisor的执行顺序,从0开始执行
以下是新增一个增强的Advisor,用于对用户问题的加强,符合用户需要的答案。代码如下:
public class ReReadAdvisor implements BaseAdvisor {
private static final String DEFAULT_USER_TEST_ADVISE= """
{re2_input_query}
Read the question agin:{re2_input_query}
""";
@Override
public ChatClientRequest before(ChatClientRequest chatClientRequest, AdvisorChain advisorChain) {
String contents = chatClientRequest.prompt().getContents();
String re2InputQuery=PromptTemplate.builder().template(DEFAULT_USER_TEST_ADVISE).build().render(Map.of("re2_input_query",contents));
ChatClientRequest request = chatClientRequest.mutate().prompt(Prompt.builder().content(re2InputQuery).build())
.build();
return request;
}
@Override
public ChatClientResponse after(ChatClientResponse chatClientResponse, AdvisorChain advisorChain) {
return chatClientResponse;
}
@Override
public int getOrder() {
return 0;
}
}
使用方法:
@Test
public void testReReadAdvisor1(){
ChatClient client = ChatClient.builder(deepSeekChatModel).
defaultAdvisors(new ReReadAdvisor())
.build();
String content = client.prompt()
.user("天气为什么这么热")
.call()
.content();
System.out.println(content);
}
返回内容:
天气炎热的原因通常涉及多种自然和人为因素的综合作用,以下是主要解释:
1. 季节与太阳辐射
- 夏季高温:北半球夏季(6-8月)太阳直射角度大,日照时间长,地表吸收的热量显著增加。
- 太阳活动:若处于太阳活动活跃期,到达地球的辐射可能略增强。
2. 气候系统影响
- 高压系统控制:副热带高压或大陆高压下沉气流抑制云雨,导致晴热干燥(如中国的"伏旱")。
- 厄尔尼诺现象:太平洋异常增温会扰乱全球气候模式,引发部分地区极端高温。
3. 人类活动加剧
- 温室效应:燃烧化石燃料(煤炭、石油)排放的CO₂等气体阻止热量散逸,导致全球变暖。2023年全球平均气温已突破历史记录。
- 城市热岛效应:混凝土建筑、沥青路面吸热,加上空调排热,使城市比郊区高3-5℃。
4. 地理与天气异常
- 地形影响:盆地地形(如四川盆地)热量不易扩散,易积聚高温。
- 干旱少雨:持续缺乏降水会降低蒸发冷却作用,加剧炎热感。
5. 短期天气波动
- 热浪事件:大气环流异常(如阻塞高压)可能导致连续多日异常高温,如欧洲2022年热浪。
应对建议
- 减少午间户外活动,注意防暑补水。
- 倡导节能减碳,缓解长期气候变暖趋势。
若您关注特定地区或时间的高温,可结合当地气象数据进一步分析。
以上就是所有Advisor部分内容,更多详情见官网https://docs.spring.io/spring-ai/reference/api/advisors.html