spring-ai 1.0.0 (3)交互增强:Advisor 顾问模块

核心组件

API 由非流式处理方案和 和 流式处理方案组成。

在1.0.0版本中,顾问链AdvisorChain相关接口已经弃用,可能是老版本的思想不太合伦理吧

可以使用下面的方式实现多个顾问按oder顺序访问模型

复制代码
    public ChatController(ChatClient.Builder chatClientBuilder) {
        MySimpleLoggerAdvisor advisor3=  new MySimpleLoggerAdvisor(3);
        MySimpleLoggerAdvisor advisor2= new MySimpleLoggerAdvisor(2);
        MySimpleLoggerAdvisor advisor1= new MySimpleLoggerAdvisor(1);
        this.chatClient = chatClientBuilder
                //此处执行顺序由order决定,并非添加顺序决定
                .defaultAdvisors(List.of(
                        advisor3,
                        advisor2,
                        advisor1)
                )
                .defaultSystem("You are a helpful assistant")
                .build();
    }

下图说明了顾问链和聊天模型之间的交互:

顾问advice之间的request和response 基于order 对称,比如三个女孩子按顺序123追你,你给出的答复顺序则应该是321

交互返回:

Spring AI 提供了两种类型的内存顾问程序来维护对话上下文:

顾问 存储机制 模板占位符
PromptChatMemoryAdvisor 内存中或自定义 instructions,memory
VectorStoreChatMemoryAdvisor 向量数据库 instructions,long_term_memory

下面是一个简单顾问的实现用于参考学习:

复制代码
package com.example.advisor;


import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
import org.springframework.ai.chat.client.advisor.api.CallAdvisor;
import org.springframework.ai.chat.client.advisor.api.CallAdvisorChain;
import org.springframework.ai.chat.client.advisor.api.StreamAdvisor;
import org.springframework.ai.chat.client.advisor.api.StreamAdvisorChain;
import reactor.core.publisher.Flux;


public class MySimpleLoggerAdvisor implements CallAdvisor, StreamAdvisor {


    private Integer order;
    public MySimpleLoggerAdvisor() {
        super();
    }

    public MySimpleLoggerAdvisor(Integer preOrder) {
        order = preOrder;
    }


    public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain callAdvisorChain) {
        System.out.println("BEFORE: {}" + chatClientRequest);
        System.out.println("do something order  " + this.order);

        ChatClientResponse chatClientResponse = callAdvisorChain.nextCall(chatClientRequest);

        System.out.println("AFTER: {}" + chatClientResponse);

        System.out.println("was do something order  " + this.order);
        return chatClientResponse;
    }

    @Override
    public String getName() {
        return "MySimpleLoggerAdvisor";
    }

    @Override
    public int getOrder() {
        return this.order == null ? 0 : this.order;
    }


//	@Override
//	public AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain) {
//
//		logger.debug("BEFORE: {}", advisedRequest);
//
//		AdvisedResponse advisedResponse = chain.nextAroundCall(advisedRequest);
//
//		logger.debug("AFTER: {}", advisedResponse);
//
//		return advisedResponse;
//	}
//

    @Override
    public Flux<ChatClientResponse> adviseStream(ChatClientRequest chatClientRequest, StreamAdvisorChain streamAdvisorChain) {
        System.out.println("BEFORE: {}" + chatClientRequest);
        System.out.println("do something");

        Flux<ChatClientResponse> chatClientResponse = streamAdvisorChain.nextStream(chatClientRequest);

        System.out.println("AFTER: {}" + chatClientResponse);

        System.out.println("was do something");

        return chatClientResponse;
    }

//	@Override
//	public Flux<AdvisedResponse> aroundStream(AdvisedRequest advisedRequest, StreamAroundAdvisorChain chain) {
//
//		logger.debug("BEFORE: {}", advisedRequest);
//
//		Flux<AdvisedResponse> advisedResponses = chain.nextAroundStream(advisedRequest);
//
//        return new MessageAggregator().aggregateAdvisedResponse(advisedResponses,
//                    advisedResponse -> logger.debug("AFTER: {}", advisedResponse));
//	}
}

最后分析一下顾问模块的依赖关系:chatclient客户端是依赖于它的,他和chatclient客户端也同时依赖于spring-ai-模型,Core Advisor 框架在spring-ai-模型中得到定义和泛化

相关推荐
淘源码d2 小时前
什么是医院随访系统?成熟在用的智慧随访系统源码
java·spring boot·后端·开源·源码·随访系统·随访系统框架
程序猿阿越3 小时前
Kafka源码(七)事务消息
java·后端·源码阅读
m0_748248023 小时前
C++20 协程:在 AI 推理引擎中的深度应用
java·c++·人工智能·c++20
笑我归无处3 小时前
强引用、软引用、弱引用、虚引用详解
java·开发语言·jvm
02苏_3 小时前
秋招Java面
java·开发语言
爱吃甜品的糯米团子3 小时前
详解 JavaScript 内置对象与包装类型:方法、案例与实战
java·开发语言·javascript
程序定小飞4 小时前
基于springboot的学院班级回忆录的设计与实现
java·vue.js·spring boot·后端·spring
攀小黑4 小时前
基于若依-内容管理动态修改,通过路由字典配置动态管理
java·vue.js·spring boot·前端框架·ruoyi
青云交5 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市空气质量监测与污染溯源中的应用
java·spark·lstm·可视化·java 大数据·空气质量监测·污染溯源
森语林溪5 小时前
大数据环境搭建从零开始(十七):JDK 17 安装与配置完整指南
java·大数据·开发语言·centos·vmware·软件需求·虚拟机