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

news2024/11/25 21:53:34

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【pearcmd】通过pearcmd.php 进行GetShell

https://cloud.tencent.com/developer/article/2204400 关于PHP 配置 register_argc_argv 小结 的一些研究文章。 应用例题 [NewStarCTF 2023 公开赛道]Include &#x1f350; <?phperror_reporting(0);if(isset($_GET[file])) {$file $_GET[file];if(preg_match(/flag|l…

国外惊现IDM命令行永久破解方法

IDM 想必大部分人都知道和使用过&#xff0c;这是一款在国内外都非常流行的下载神器&#xff0c;除了不能支持种子文件和磁力之外&#xff0c;完爆国内的迅雷&#xff0c;小编我在 6 年前就已经购买了永久更新正版。 image.png 不过最近国外有大神流传出了一个号称可以永久完美…

如何在Docker容器中,修改MySQL密码

如果MySQL运行在Docker容器中&#xff0c;修改MySQL密码的方法稍有不同。以下是如何在Docker中修改MySQL密码的步骤&#xff1a; 方法1&#xff1a;使用MySQL命令行工具 1. 找到MySQL容器的ID或者名字&#xff1a; docker ps 2. 进入MySQL容器&#xff1a; docker exec -i…

Hi3861 OpenHarmony嵌入式应用入门--UDP Client

本篇使用的是lwip编写udp客户端。需要提前准备好一个PARAM_HOTSPOT_SSID宏定义的热点&#xff0c;并且密码为PARAM_HOTSPOT_PSK。还需要准备一个udp服务&#xff0c;服务ip为PARAM_SERVER_ADDR宏定义&#xff0c;端口为PARAM_SERVER_PORT宏定义。 修改网络参数 在Hi3861开发板…

如何挑选短剧系统源码?

在选择短剧系统源码之前&#xff0c;我们需要明确什么是短剧系统源码。短剧系统源码是指用于构建和管理短剧内容的程序代码。选择适合的短剧系统源码可以提高短剧制作的效率和质量。下面是几个选择短剧系统源码的建议&#xff1a; 需求分析&#xff1a;在选择短剧系统源码之前&…

【代码随想录】【算法训练营】【第58天】 [卡码101]孤岛的总面积 [卡码102]沉没孤岛 [卡码103]水流问题 [卡码104]建造最大岛屿

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 58&#xff0c;周四&#xff0c;ding~ 题目详情 [卡码101] 孤岛的总面积 题目描述 卡码101 孤岛的总面积 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 […

word 转pdf 中图片不被压缩的方法

word 转pdf 中图片不被压缩的方法 法1&#xff1a; 调节word 选项中的图片格式为不压缩、高保真 法2&#xff1a; 1: word 中的图片尽可能使用高的分辨率&#xff0c;图片存为pnd或者 tif 格式&#xff08;最高清&#xff09; 2: 转化为pdf使用打印机器&#xff0c;参数如下…

实验七 SQL数据更新和视图

题目 &#xff08;1&#xff09;向商品类别表category中插入一条记录&#xff08;801&#xff0c;‘座椅套’&#xff0c;‘各种品牌的汽车座套’&#xff09; &#xff08;2&#xff09;向商品表product中插入一条记录&#xff1a;商品编号80101&#xff0c;商品名称“四季通…

基于Springboot的人格障碍诊断系统

结构图&#xff1a; 效果图&#xff1a; 后台&#xff1a; 前台:

AI免费英语学习在线工具:Pi;chatgpt;其他大模型AI 英语学习智能体工具

1、pi(强烈推荐&#xff1a;可以安卓下载使用) https://pi.ai/talk &#xff08;网络国内使用方便&#xff09; 支持实时聊天与语音对话 2、chatgpt&#xff08;强烈推荐&#xff1a;可以安卓下载使用) https://chat.openai.com/ &#xff08;网络国内使用不方便&#xf…

零基础入门怎么学习老挝语字母表?《老挝语翻译通》App真人发音教学,学习老挝语字母发音和词汇句子!

这段老挝文字翻译成中文是什么意思&#xff1f;有什么好用的老挝语翻译工具推荐吗&#xff1f; 快速翻译&#xff1a;中老语言无缝转换&#xff0c;实时翻译&#xff0c;让沟通更流畅。 学习工具&#xff1a;零基础入门到流利对话&#xff0c;老挝语真人发音&#xff0c;让你的…

ue5导航网格设置

AI使用导航网格进行移动&#xff0c;所以&#xff0c;先设置导航网格边界体积 2&#xff0c;使导航网格边界体积覆盖AI所需要的场景&#xff08;绿色区域&#xff09;&#xff0c;x,y&#xff0c;z在这里都扩大到原来的10倍 3&#xff0c;打开actor的“启用tick并开始” 4&…

使用java stream对集合中的对象按指定字段进行分组并统计

一、概述 有这样一个需求&#xff0c;在一个list集合中的对象有相同的name&#xff0c;我需要把相同name的对象进行汇总计算。使用java stream来实现这个需求&#xff0c;这里做一个记录&#xff0c;希望对有需求的同学提供帮助 一、根据指定字段进行分组 一、先准备好给前端要…

PDF内存如何变小,PDF内存压缩,PDF内存变小怎么调整

在数字化时代&#xff0c;pdf已成为工作、学习和生活中不可或缺的文件格式。它以其跨平台兼容性和安全性受到广大用户的喜爱。然而&#xff0c;随着pdf文件中嵌入的图片、图形和文本内容的增多&#xff0c;文件大小往往会变得相当可观&#xff0c;给文件的传输和存储带来一定的…

vue3渲染函数加入自定义指令(图文教程)

嗯&#xff0c;公众号“程序员野区”收到提问》 问了自己几个群里小伙伴&#xff0c;总算搞定了。 序&#xff1a; withDirectives是vue3.2.0版本上线的&#xff0c;所以你版本不要低&#xff0c;低了不行官方的demo在这里&#xff0c;懂的&#xff0c;直接看官方的就可以》h…

微信小程序禁止PC端打开防止白嫖广告或抓接口

前言 晓杰每日靠着微薄的小程序广告度日&#xff0c;继之前检测手机端微信跳过小程序广告插件检测后又发现小程序广告在电脑端经常没广告&#xff0c;导致收入备降&#xff01;虽然每天只有几块钱的收入&#xff0c;哈哈哈&#xff01;那么怎么做到禁止小程序使用电脑端微信打…

有没有好用的开源mes系统?

根据我多年的从业经验来看&#xff0c;我知道有很多工厂都想找一款好用的开源mes系统。简单来说&#xff0c;开源mes系统通过公开源代码&#xff0c;鼓励企业和用户共同参与系统的改进和定制&#xff0c;根据自己的需求进行二次开发&#xff0c;使得企业在有限的预算内也能获得…

《ClipCap》阅读笔记(上)

原文出处 [2111.09734] ClipCap: CLIP Prefix for Image Captioning (arxiv.org) 原文笔记 What ClipCap&#xff1a; CLIP Prefix for Image Captioning 一言以蔽之&#xff1a;使用 CLIP 编码作为标题的前缀&#xff0c;使用简单的映射网络&#xff0c;然后微调语言模型…

[el-form] 表单验证:一次验证两个值,传参

一次验证两个值 要在表单的el-form-item 一次验证两个值&#xff0c;都不能为空 在验证规则rules里&#xff0c;要验证的值里加上validator验证规则&#xff0c;“valTowValue”是自己定义的。 传参 const validateField (key, errorMessage) > (rule, value, callback) &g…

virtualbox(7.0) ubuntu(22) 和win11共享文件夹

在虚拟机中安装增强功能。在virtualbox中配置 执行命令将用户加入vboxsf组 sudo adduser your_usrname vboxsf 重启ubuntu即可