Spring AI 1.0.0 新变化,从 0.8.1 如何升级

Spring AI 1.0.0-M1 版本已经发布,距离 1.0.0 正式版又更近了一步。同时这也意味着,Spring AI 1.0.0 的 API 已经基本确定,不会发生大的改动。这里介绍一下,相对于上一个发布版本 0.8.1,Spring AI 1.0.0 的一些重要的变化。

首先是把与 AI 模型进行交互的 ModelClient 拆分成了两个接口。Model 接口负责与模型进行交互,承接了之前的 ModelClient 的功能。Client 则负责创建调用 Model 时的请求,以及对 Model 返回的结果进行解析。每个不同类型的 Model , 都应该有与之对应的 Client。目前来说,只提供了与 ChatModel 对应的 ChatClient。ChatClient 提供的是流式 API 接口,在设计上类似 Spring 中已有的 RestClient 和 WebClient。

2ca91ba61d93c17d76c0d5df3f10b974.png

ChatClient 由 ChatClient.Builder 来负责创建。在创建时,可以配置 ChatClient 的默认行为。ChatClient 的流式 API,可以对发送给 ChatModel 的 Prompt 进行配置,并对返回的 ChatResponse 进行解析。

使用了 ChatClient 的流式 API 之后,调用大模型并返回结果的基本方式如下所示。

String output = chatClient.prompt().user(input).call().content();

第二个改动是增加了 RequestResponseAdvisor 接口。这个接口的作用是对发送给模型的请求和得到的响应,进行统一的处理。从接口名称中可以看出来,用到的是 AOP 的思想。多个 Advisor 可以串联成一个链条,依次对请求和响应进行处理。多个 Advisor 通过一个 Map 来共享上下文。Spring AI 提供了一些内置的 RequestResponseAdvisor 实现,包括在请求中添加历史消息,以及实现基于向量数据库的问答功能。

public interface RequestResponseAdvisor {


  default AdvisedRequest adviseRequest(AdvisedRequest request, Map<String, Object> context) {
    return request;
  }


  default ChatResponse adviseResponse(ChatResponse response, Map<String, Object> context) {
    return response;
  }


  default Flux<ChatResponse> adviseResponse(Flux<ChatResponse> fluxResponse, Map<String, Object> context) {
    return fluxResponse;
  }


}

第三个改动是添加了内置的 Memory 支持,也就是 ChatMemory 接口,以及一个基于内存中的 ConcurrentHashMap 的实现。

public interface ChatMemory {


  default void add(String conversationId, Message message) {
    this.add(conversationId, List.of(message));
  }


  void add(String conversationId, List<Message> messages);


  List<Message> get(String conversationId, int lastN);


  void clear(String conversationId);


}

ChatMemory 一般与 RequestResponseAdvisor 搭配使用,以非侵入的方式实现消息历史记录功能。Spring AI 内置提供了 MessageChatMemoryAdvisor 和 PromptChatMemoryAdvisor 两种实现来添加消息历史记录。这两种实现都用到了 ChatMemory。

第四个改动是废弃了解析模型输出的 OutputParser 接口及其实现,改为使用 StructuredOutputConverter 接口及其实现。同样提供了 List、Map 和 Bean 三种内置实现。新的接口及其实现,可以完全替代之前的接口和实现。

5a37564dfa1bbe1fc1c0cc68f6931dea.png

第五个改动是新增了对大模型的输出进行评价的 Evaluator 接口,以及一个默认的实现 RelevancyEvaluator。该默认实现使用大模型来进行评价。

public interface Evaluator {


  EvaluationResponse evaluate(EvaluationRequest evaluationRequest);


}

第六个改动是新增了 DocumentRetriever 接口,表示根据查询条件,获取相关的文档。

public interface DocumentRetriever extends Function<String, List<Document>> {


  List<Document> retrieve(String query);


  default List<Document> apply(String query) {
    return retrieve(query);
  }


}

以上就是 Spring AI 1.0.0 中比较大的变化。

下面看一下怎么从 Spring AI 0.8.1 升级到 1.0.0。最大的改动来自于 ChatClient。Spring Boot 的自动配置功能,不会再创建 ChatClient 对象,取而代之的是创建 ChatClient.Builder 对象,需要从 Builder 中创建出 ChatClient。

Spring Boot 的自动配置功能会创建 ChatModel。也可以自己创建 Builder 对象。在创建 Builder 对象时必须提供的是 ChatModel。ChatClient 的使用方式也发生了变化,根据新的 API 来调整即可。

下面的代码展示了如何从自定义的 ChatClient.Builder 中创建出 ChatClient。

public class AppConfiguration {


  @Bean
  public ChatClient chatClient(ChatModel chatModel) {
    return ChatClient.builder(chatModel).build();
  }
}

如果使用了解析输出的 OutputParser 接口,把每个 OutputParser 实现替换成对应的 StructuredOutputConverter 实现即可。比如,ListOutputParser 替换成 ListOutputConverter。解析时调用的方法,从 parse 改成 convert 即可。功能上并没有什么变化。

其他的功能属于新增的内容,对使用 Spring AI 0.8.1 的代码并没有影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/771719.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】—— 文件操作(上)

【C语言】—— 文件操作&#xff08;上&#xff09; 一、 为什么使用文件二、 什么是文件2.1、 程序文件2.2、 数据文件2.3、 文件名2.4、二进制文件与文本文件 三、 文件的打开和关闭3.1、流和标准流&#xff08;1&#xff09;流&#xff08;2&#xff09;标准流 3.2、文件指针…

@PostConstruct注解

1.简介 PostConstruct是java5的时候引入的注解&#xff0c;主要用于标记一个方法&#xff0c;表示该方法应在依赖注入完成后自动调用。通常在使用Java EE或者Spring框架时使用这个注解&#xff0c;以便在Bean初始化之后执行一些初始化工作&#xff0c; 可作为一些数据的常规化…

hadoop集群部署【二】YARN MapReduce 的部署

提前注意&#xff1a;请注意路径是否和我的相同&#xff0c;放置的位置不同&#xff0c;请修改标红处 HDFS部署 HDFS介绍及部署http://t.csdnimg.cn/Q3H3Y 部署说明 Hadoop HDFS分布式文件系统&#xff0c;我们会启动&#xff1a; NameNode进程作为管理节点 DataNode进程…

WRF学习——使用CMIP6数据驱动WRF/基于ncl与vdo的CMIP6数据处理

动力降尺度 国际耦合模式比较计划&#xff08;CMIP&#xff09;为研究不同情景下的气候变化提供了大量的模拟数据&#xff0c;而在实际研究中&#xff0c;全球气候模式输出的数据空间分辨率往往较低&#xff08;>100Km&#xff0c;缺乏区域气候特征&#xff0c;为了更好地研…

K8s 集群(kubeadm) CA 证书过期解决方案

Author&#xff1a;Arsen Date&#xff1a;2024/07/04 目录 一、现象描述二、解决方案三、集群验证 一、现象描述 之前有篇文章《K8s Token 过期解决方案&#xff08;Kubeadm&#xff09;》提到了默认生成的 Token 有效期只有 24 小时&#xff0c;过期后 Token 将不可用&#…

C# 类型转换之显式和隐式

文章目录 1、显式类型转换2. 隐式类型转换3. 示例4. 类型转换的注意事项5. 类型转换的应用示例总结 在C#编程中&#xff0c;类型转换是一个核心概念&#xff0c;它允许我们在程序中处理不同类型的数据。类型转换可以分为两大类&#xff1a;显式类型转换&#xff08;Explicit Ca…

18. JAVA 多线程锁介绍

1. 前言 本节内容主要是对 Java 多线程锁进行介绍&#xff0c;是对锁的一个全方位的概述&#xff0c;为我们对后续深入学习不同的锁的使用方法奠定一个良好的基础。本节内容的知识点如下&#xff1a; 乐观锁与悲观锁的概念&#xff0c;以及两种锁之间的区别&#xff0c;这是并…

文华财经T9多空波段趋势量化交易策略模型源码

// 定义变量 Vars Numeric STEP1,MVALUE1,SARVAL,C; Numeric SARLINE,COND,ZBMA1,ZBMA2; Begin CCLOSE; STEP13/11; MVALUE120/22; SARVALSAR(4, STEP1, MVALUE1); PlotLine("",IIF(SARVAL>0,SARVAL,InvalidNumeric),RED,Circledot); PlotLine("&q…

今晚19点,《语音和心理健康》开讲!

《2024GAS声学大讲堂—音频产业创新技术公益讲座》面向医疗健康的声音与音乐技术系列专题讲座 第五讲 将于 今晚 19点 开讲&#xff0c;本次邀请了 湖南大学 教授 张子兴 演讲&#xff0c;讲座主题&#xff1a;《语音和心理健康》。此次直播方式为腾讯会议、小鹅通和中国电子音…

初出茅庐的小李博客之C语言文件操作

C语言文件操作 在C语言中&#xff0c;文件操作主要是通过标准库函数来实现的。 今天有时间就来学习下一些常用的文件操作函数&#xff1a; C 语言提供了一个 FILE 数据结构&#xff0c;记录了操作一个文件所需要的信息。该结构定义在头文件stdio.h&#xff0c;所有文件操作函…

如何通过IP地址查询地理位置及运营商信息

在数字时代&#xff0c;IP地址&#xff08;Internet Protocol Address&#xff0c;互联网协议地址&#xff09;已经成为我们日常网络活动的重要组成部分。每台连接到互联网的设备都被分配了一个唯一的IP地址&#xff0c;它不仅可以识别设备&#xff0c;还可以揭示设备的地理位置…

python数据分析入门学习笔记

目录 一、 数据分析有关的python库简介 (一)numpy (二)pandas (三)matplotlib (四)scipy (五)statsmodels (六)scikit-learn 二、 数据的导入和导出 三、 数据筛选 四、 数据描述 五、 数据处理 六、 统计分析 七、 可视化 八、 其它![](https://…

【C语言】—— 文件操作(下)

【C语言】—— 文件操作&#xff08;下&#xff09; 前言&#xff1a;五、文件的顺序读写5.1、 顺序读写函数介绍5.2、 f p u t c fputc fputc 函数5.3、 f g e t c fgetc fgetc 函数5.4、 f p u t s fputs fputs 函数5.5、 f g e t s fgets fgets 函数5.6、 f p r i n t f…

html+css+js淘宝商品界面

点击商品&#xff0c;alert弹出商品ID 图片使用了占位符图片&#xff0c;加载可能会慢一点 你可以把它换成自己的图片&#x1f603;源代码在图片后面 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"…

Word “当前页“ 与 “前一页“ (含部分内容)间有大半页空白,删除空白方法

鼠标光标选中需要向上移的句子&#xff0c;右键点击“段落”&#xff0c;然后在跳出的窗口中按照“换行和分页”中的红色方框内取消勾选后&#xff0c;点击确定即可。

金斗云 HKMP智慧商业软件 任意用户创建漏洞复现

0x01 产品简介 金斗云智慧商业软件是一款功能强大、易于使用的智慧管理系统,通过智能化的管理工具,帮助企业实现高效经营、优化流程、降低成本,并提升客户体验。无论是珠宝门店、4S店还是其他零售、服务行业,金斗云都能提供量身定制的解决方案,助力企业实现数字化转型和智…

Proteus-51单片机-DS18B20多点测温

DS18B20多点测温 一、Proteus仿真演示 每个DS18B20都有一个唯一的64位序列号,这使得在同一总线上可以挂载多个传感器,无需额外的地址分配。主机(通常为单片机)通过特定的时序控制,可以依次读取各个DS18B20的温度数据,实现分布式测温。 二、代码特点 三、开发环境介绍 本…

【unity实战】使用unity的新输入系统InputSystem+有限状态机设计一个玩家状态机控制——实现玩家的待机 移动 闪避 连击 受击 死亡状态切换

最终效果 文章目录 最终效果前言人物素材新输入系统InputSystem的配置动画配置代码文件路径状态机脚本创建玩家不同的状态脚本玩家控制源码完结 前言 前面我们已经写过了使用有限状态机制作一个敌人AI&#xff1a;【unity实战】在Unity中使用有限状态机制作一个敌人AI 那么玩…

收银系统源码分享-PHP可二开

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 私有化独立…

面向对象-封装

一.包 1.简介 当我们把所有的java类都写src下的第一层级&#xff0c;如果是项目中&#xff0c;也许会有几百个java文件。 src下的文件会很多&#xff0c;开发的时候不方便查找&#xff0c;也不方便维护如果较多的文件中有同名的&#xff0c;十分麻烦 模块1中有一个叫test.ja…