如何用Spring AI的Advisor,让AI应用像“瑞士军刀”一样灵活?

629 阅读4分钟

如何用Spring AI的Advisor,让AI应用像“瑞士军刀”一样灵活?


一、Advisor:AI应用的“智能管家”

Spring AI的Advisor,本质上是一个拦截器,专门负责在AI模型的请求和响应流中“搞事情”——动态修改输入、增强输出,甚至中途拦截敏感请求。它就像给AI应用装了个“智能管家”,既能帮你处理重复性工作(比如记录聊天历史),又能让模型回答更精准(比如结合知识库检索)。
核心功能

  • 拦截请求:在用户问题发送给AI模型前,Advisor可以修改问题或添加上下文(比如加一句“深呼吸,慢慢想”)。
  • 增强响应:在模型返回答案后,Advisor可以格式化结果(比如将字符串转为JSON)或添加安全校验。
  • 链式处理:多个Advisor像流水线一样串联,每个环节都能对数据动手脚。

适用场景:聊天记忆管理、敏感词过滤、知识库检索(RAG)、日志记录等。


二、用法:内置Advisor的“全家桶套餐”

Spring AI贴心地提供了多种内置Advisor,开箱即用:

  1. MessageChatMemoryAdvisor
    • 功能:自动记录聊天历史,让AI记住“你刚才说了啥”。
    • 坑点:不是所有模型都支持上下文记忆,用前先查文档。
  2. QuestionAnswerAdvisor
    • 功能:执行RAG(检索增强生成),从知识库中捞答案,让AI不再“一本正经地胡说八道”。
    • 原理:用户提问时,先检索相似文本,拼接到提示词中。
  3. SafeGuardAdvisor
    • 功能:敏感词拦截器,遇到“颜色内容”直接打断施法,保护应用合规性。
  4. VectorStoreChatMemoryAdvisor
    • 功能:将聊天记录存入向量数据库,实现长期记忆,但需小心chat_memory_conversation_id管理不当引发“数据海啸”。

三、案例:手把手写一个“复读机Advisor”

假设你想让AI每次回答前先“复读”一遍问题(防止它跑偏),可以这样实现:

public class ReReadingAdvisor implements CallAroundAdvisor {
    private static final String PROMPT_TEMPLATE = """
        {original_query}
        请再读一遍问题:{original_query}
        然后回答:
        """;

    @Override
    public AdvisedRequest before(AdvisedRequest request) {
        String query = request.getUserText();
        Map<String, Object> params = new HashMap<>(request.getUserParams());
        params.put("original_query", query);
        return request.withUserText(PROMPT_TEMPLATE).withUserParams(params);
    }
}

效果:用户问“如何减肥?”,AI会先看到:“如何减肥?请再读一遍问题:如何减肥?然后回答:...”。


四、原理:Advisor的“流水线魔法”

Advisor的运作模式类似快递分拣流水线:

  1. 请求进入:封装成AdvisedRequest对象,携带用户输入和参数。
  2. 链式处理:每个Advisor依次处理请求,可修改、转发或拦截。
  3. 模型响应:AI返回结果后,Advisor再次处理响应,最终返回AdvisedResponse
    类比Spring AOP
  • 传统AOP的Advisor拦截方法调用,Spring AI的Advisor拦截AI交互。
  • 优势:专为AI场景设计,支持流式处理和非结构化数据。

五、避坑指南:Advisor的“七宗罪”

  1. 乱用chat_memory_conversation_id
    • 不维护此ID会导致向量数据库被垃圾数据淹没,记得按用户或会话区分。
  2. 忽略模型兼容性
    • 例如MessageChatMemoryAdvisor需要模型支持上下文,否则会报错。
  3. 过度依赖提示词工程
    • 结构化输出(如JSON)可能需要多次交互,别指望一次Prompt搞定。
  4. 不处理令牌限制
    • 提示词太长会被模型拒绝,记得用TokenCounter提前校验。

六、最佳实践:Advisor的“黄金三原则”

  1. 模块化设计:每个Advisor只干一件事(比如记录日志或过滤敏感词),避免“瑞士军刀变杀猪刀”。
  2. 合理使用链式顺序
    • 安全校验(如SafeGuardAdvisor)应放在最前面,避免无效请求浪费资源。
  3. 监控与测试
    • SimpleLoggerAdvisor记录请求日志,结合监控指标(如延迟、错误率)优化性能。

七、面试考点:Advisor的灵魂拷问

  1. Q:Advisor和AOP的Advice有什么区别?
    • A:Advisor专为AI交互设计,支持流式处理和复杂数据流;AOP Advice针对方法调用。
  2. Q:RAG场景中,QuestionAnswerAdvisor如何工作?
    • A:先检索向量数据库,将相关文本拼接到用户问题后,再交给模型生成答案。
  3. Q:VectorStoreChatMemoryAdvisor的常见问题?
    • A:chat_memory_conversation_id管理不当会导致数据冗余,需定期清理旧数据。

八、总结:Advisor——AI应用的“超级外挂”

Spring AI的Advisor,就像给AI模型装上了一套“可编程插件系统”。无论是增强回答准确性、保障安全性,还是实现长期记忆,它都能让开发者灵活定制AI行为。记住:用好Advisor的关键是“分工明确、顺序得当、监控到位”。未来,随着多模态模型的发展,Advisor或许还能处理图像、音频的拦截与增强——毕竟,AI的“瑞士军刀”,只会越来越锋利!

参考资料