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

news/2024/7/7 19:11:15 标签: spring, 人工智能, java, 后端

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 之后,调用大模型并返回结果的基本方式如下所示。

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

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

javascript">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 接口,表示根据查询条件,获取相关的文档。

java">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。

java">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 的代码并没有影响。


http://www.niftyadmin.cn/n/5534942.html

相关文章

速度是conda的10倍以上,mamba的4倍,Pixi是何方神圣呢?真有这么快吗?

原文链接&#xff1a;速度是conda的10倍以上&#xff0c;mamba的4倍&#xff0c;Pixi是何方神圣呢&#xff1f;真有这么快吗&#xff1f; 本期教程 写在前面 今天中午看到通哥分享的教程&#xff0c;conda转圈圈&#xff0c;为何不试试pixi&#xff0c;Pixi是第一次了解。但是…

等保2.0是否强制要求所有物联网设备都必须支持自动更新?

等保2.0对物联网设备自动更新的要求 等保2.0&#xff08;网络安全等级保护2.0&#xff09;是中国政府为了加强网络安全而推出的一套标准和要求。在物联网设备的安全管理方面&#xff0c;等保2.0确实提出了一系列措施&#xff0c;以确保设备的软件安全更新。这些措施包括&#…

PostgreSQL的系统视图pg_stat_wal_receiver

PostgreSQL的系统视图pg_stat_wal_receiver 在 PostgreSQL 中&#xff0c;pg_stat_wal_receiver 视图提供了关于 WAL&#xff08;Write-Ahead Logging&#xff09;接收进程的统计信息。WAL 接收器是 PostgreSQL 集群中流复制的一部分&#xff0c;它在从节点中工作&#xff0c;…

JDK21 | 借鉴了近十种语言,String终于变好用了

JDK21 概述 JDK21 是最新的长期支持(LTS)版本。引入了多个新特性&#xff0c;特别是 JEP430&#xff0c;即字符串模板。 字符串模板动机 字符串模板作为预览功能&#xff0c;简化了字符串的拼接。编译和执行需要添加参数&#xff1a;javac --enable-preview --release 21 Te…

【JavaEE】多线程代码案例(2)

&#x1f38f;&#x1f38f;&#x1f38f;个人主页&#x1f38f;&#x1f38f;&#x1f38f; &#x1f38f;&#x1f38f;&#x1f38f;JavaEE专栏&#x1f38f;&#x1f38f;&#x1f38f; &#x1f38f;&#x1f38f;&#x1f38f;上一篇文章&#xff1a;多线程代码案例(1)&a…

Python酷库之旅-第三方库Pandas(001)

目录 一、Pandas库的由来 1、背景与起源 1-1、开发背景 1-2、起源时间 2、名称由来 3、发展历程 4、功能与特点 4-1、数据结构 4-2、数据处理能力 5、影响与地位 5-1、数据分析“三剑客”之一 5-2、社区支持 二、Pandas库的应用场景 1、数据分析 2、数据清洗 3…

【Android面试八股文】Looper如何在子线程中创建?

文章目录 一、Looper的几个重要方法二、子线程中使用Looper的方式1三、子线程中使用Looper的方式23.1 使用HandlerThread实现3.2 HandlerThread源码解析创建子线程的 Looper必须要通过 Looper.prepare()初始化looper,然后再通过 Looper.loop()方法让 Loop运行起来。 那么具…

在Windows 11上更新应用程序的几种方法,总有一种适合你

序言 让你安装的应用程序保持最新是很重要的,而Windows 11使更新Microsoft应用商店和非Microsoft应用商店的应用程序变得非常容易。我们将向你展示如何使用图形方法以及命令行方法来更新你的应用程序。 如何更新Microsoft Store应用程序 如果你的一个或多个应用程序是从Mic…