个人随笔
目录
Spring AI2.0 advisor的简单学习
2026-11-02 23:06:55

Spring AI Advisors API 提供了一种灵活而强大的方式,用于拦截、修改和增强 Spring 应用程序中的 AI 驱动交互。通过利用 Advisors API,开发人员可以构建更复杂、可重用且易于维护的 AI 组件。

简单来说,就是在发送给大模型之前拦截请求对请求做一些处理,比如打印日志,操作数据库什么的都可以,然后从大模型返回后又做一些处理。

一、advisor介绍

1、交互流程

下图展示了advisors链与聊天模型之间的交互流程:

1、首先Spring AI会根据用户的提示词创建一个ChatClientRequest对象
2、链中的每个advisor都会处理该请求,并可能对其进行修改,也可以选择通过不调用下一个实体来阻止该情趣
3、框架提供的最终advisor会将请求发送至大模型。
4、随后,模型的响应会沿着advisor链回传,并被转换为ChatClientResponse。
5、每个advisor都可以处理或者修改这个response.

2、order

advisor链的执行顺序由getOrder()方法决定,order越小会优先执行,advisor链以栈的方式运行,链中的第一个advisor将最先处理该请求,它也是最后一个处理响应的组件。越大表名优先级越低。如果多个advisor顺序相同,框架不保证其执行顺序。

顺序与执行顺序之间的表面矛盾源于advisor链的栈式结构:

优先级最高的advisor(顺序值最低)会被添加到栈顶。它将在栈展开时最先处理该请求。当栈回退时,它将是最后一个处理响应的。

二、简单例子

1、使用系统自带的advisor

  1. @Bean
  2. public ChatClient openaiChatClient(OpenAiChatModel openAiChatModel){
  3. return ChatClient.
  4. builder(openAiChatModel) //设置模型
  5. .defaultAdvisors(SimpleLoggerAdvisor.builder().build())
  6. .build();//创建对象
  7. }

配置文件需要设置打印日志级别

  1. logging:
  2. level:
  3. org.springframework.ai: debug

这样请求就能看到日志了。

2、自定义advisor

这里也自定义一个日志advisor,关键点是实现CallAdvisor or StreamAdvisor。对应两种访问模式。

  1. public class MySimpleLoggerAdvisor implements CallAdvisor, StreamAdvisor {
  2. private static final Logger logger = LoggerFactory.getLogger(MySimpleLoggerAdvisor.class);
  3. @Override
  4. public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain callAdvisorChain) {
  5. logRequest(chatClientRequest);
  6. ChatClientResponse chatClientResponse = callAdvisorChain.nextCall(chatClientRequest);
  7. logResponse(chatClientResponse);
  8. return chatClientResponse;
  9. }
  10. @Override
  11. public Flux<ChatClientResponse> adviseStream(ChatClientRequest chatClientRequest, StreamAdvisorChain streamAdvisorChain) {
  12. logRequest(chatClientRequest);
  13. return streamAdvisorChain.nextStream(chatClientRequest).
  14. doOnNext(chatClientResponse -> logResponse(chatClientResponse));
  15. }
  16. @Override
  17. public String getName() {
  18. return "自定义日志输出advisors";
  19. }
  20. @Override
  21. public int getOrder() {
  22. return 0;
  23. }
  24. private void logRequest(ChatClientRequest request) {
  25. logger.info("request: {}", request);
  26. }
  27. private void logResponse(ChatClientResponse chatClientResponse) {
  28. logger.info("response: {}", chatClientResponse);
  29. }
  30. }

使用

  1. @Configuration
  2. public class AIConfigration {
  3. @Bean
  4. public ChatClient openaiChatClient(OpenAiChatModel openAiChatModel){
  5. return ChatClient.
  6. builder(openAiChatModel) //设置模型
  7. .defaultAdvisors(new MySimpleLoggerAdvisor())
  8. .build();//创建对象
  9. }
  10. }

三、补充

1、最佳实践

为获得最大灵活性,请同时实现顾问的流式与非流式版本。

2、内置advisor

  • MessageChatMemoryAdvisor:检索记忆,并将其作为消息集合添加到提示中。这种方法能够保持对话历史的结构。请注意,并非所有AI模型都支持此方法。

  • VectorStoreChatMemoryAdvisor:从向量存储中检索内存,并将其添加到提示的系统文本中。此顾问有助于从大型数据集中高效地搜索和检索相关信息。

  • QuestionAnswerAdvisor:该顾问使用向量存储来提供问答功能,实现了朴素的RAG(检索增强生成)模式。

  • RetrievalAugmentationAdvisor:它利用 org.springframework.ai.rag 包中定义的基础构建块,并遵循模块化 RAG 架构,来实现常见的检索增强生成(RAG)流程。

  • ReReadingAdvisor:实现了一种针对大语言模型推理的重读策略,称为RE2,以增强输入阶段的理解能力。

  • ToolCallingAdvisor:作为顾问链的一部分,处理工具调用循环。此顾问始终由ChatClient它执行模型请求的工具调用,并将结果发回,循环往复,直到不再需要任何工具调用。实现了ToolAdvisor

  • SafeGuardAdvisor:一种旨在防止模型生成有害或不当内容的简单顾问。

3、参考文档

https://docs.spring.io/spring-ai/reference/api/advisors.html#_core_components

 1

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2