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
@Beanpublic ChatClient openaiChatClient(OpenAiChatModel openAiChatModel){return ChatClient.builder(openAiChatModel) //设置模型.defaultAdvisors(SimpleLoggerAdvisor.builder().build()).build();//创建对象}
配置文件需要设置打印日志级别
logging:level:org.springframework.ai: debug
这样请求就能看到日志了。
2、自定义advisor
这里也自定义一个日志advisor,关键点是实现CallAdvisor or StreamAdvisor。对应两种访问模式。
public class MySimpleLoggerAdvisor implements CallAdvisor, StreamAdvisor {private static final Logger logger = LoggerFactory.getLogger(MySimpleLoggerAdvisor.class);@Overridepublic ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain callAdvisorChain) {logRequest(chatClientRequest);ChatClientResponse chatClientResponse = callAdvisorChain.nextCall(chatClientRequest);logResponse(chatClientResponse);return chatClientResponse;}@Overridepublic Flux<ChatClientResponse> adviseStream(ChatClientRequest chatClientRequest, StreamAdvisorChain streamAdvisorChain) {logRequest(chatClientRequest);return streamAdvisorChain.nextStream(chatClientRequest).doOnNext(chatClientResponse -> logResponse(chatClientResponse));}@Overridepublic String getName() {return "自定义日志输出advisors";}@Overridepublic int getOrder() {return 0;}private void logRequest(ChatClientRequest request) {logger.info("request: {}", request);}private void logResponse(ChatClientResponse chatClientResponse) {logger.info("response: {}", chatClientResponse);}}
使用
@Configurationpublic class AIConfigration {@Beanpublic ChatClient openaiChatClient(OpenAiChatModel openAiChatModel){return ChatClient.builder(openAiChatModel) //设置模型.defaultAdvisors(new MySimpleLoggerAdvisor()).build();//创建对象}}
三、补充
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
