Spring Ai Advisors

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

相关推荐
NAGNIP1 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab1 天前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab1 天前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP1 天前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年1 天前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼1 天前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS1 天前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区1 天前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈1 天前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang1 天前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx