当前位置: 首页 > news >正文

Spring AI API 介绍

目录:
Spring AI 框架介绍
Spring AI API

核心API简介

Spring AI 提供了很多便利的功能,主要如下:

AI Model API

“Model API” 提供了聊天、文本转图像、音频转录、文本转语音、嵌入等功能,且不局限于某个固定的大模型提供商,如 OpenAI,Microsoft,Amazon, Google, Amazon Bedrock, Huggung Face等等。

下面是支持的 AI 模型的示意图:

在这里插入图片描述

ChatClient前文介绍过,是Spring AI 中与大模型交互的主要组件,即支持同步API,也支持异步API。

向量存储API

向量存储API(Vector Store API)支持多种实现,包括新的类SQL的元数据过滤器API,多达14种向量数据库。

函数调用API

Spring AI 让大模型调用你的业务函数变得更简单。

自动配置

Springboot的自动配置和各种starter让AI模型和向量存储使用起来非常方便。

ETL数据工程

ETL框架为数据加载到向量数据库奠定了基础,有助于实现检索增强生成(RAG)模式,使您能够将数据融入AI模型,以丰富其响应内容。

下面将对这些功能进行具体介绍。

对话模型API

对话大模型API可以帮助开发者将AI对话集成到应用中,比如chatGPT。

ChatModel

ChatModel的定义如下:

public interface ChatModel extends Model<Prompt, ChatResponse> {default String call(String message) {...}@OverrideChatResponse call(Prompt prompt);
}

默认的call()方法简化了初始使用,避免了更复杂的Prompt和ChatResponse类的复杂性。在实际的应用程序中,更常见的做法是使用下面的call()方法,它接受一个Prompt实例并返回一个ChatResponse。

StreamingChatModel

StreamingChatModel 的定义如下:

public interface StreamingChatModel extends StreamingModel<Prompt, ChatResponse> {default Flux<String> stream(String message) {...}@OverrideFlux<ChatResponse> stream(Prompt prompt);
}

与ChatModel差不多,使用了响应式Flux API对响应进行流处理。

响应式Flux 是一种基于 Reactor 库实现的响应式编程模式,用于处理异步流式数据的框架。它是 Reactor 提供的两种核心 Publisher(发布者)之一,主要用于处理多元素的数据流,与 Mono(用于单一数据或无数据流)相辅相成。

Prompt

Prompt是一个ModelRequest,包含消息列表和ChatOptions,如下所示:

public class Prompt implements ModelRequest<List<Message>> {private final List<Message> messages;private ChatOptions modelOptions;@Overridepublic ChatOptions getOptions() {...}@Overridepublic List<Message> getInstructions() {...}// constructors and utility methods omitted
}

Message

消息继承于Content接口,其中包含消息内容,类型和元数据Map:

public interface Content {String getContent();Map<String, Object> getMetadata();
}public interface Message extends Content {MessageType getMessageType();
}

消息接口根据消息类型的不同而有多种不同的实现,如下所示:

在这里插入图片描述

Chat Options

对话选项ChatOptions指可以传递给AI模型的参数项,它是ModelOptions的子类,定义如下:


public interface ChatOptions extends ModelOptions {String getModel();Float getFrequencyPenalty();Integer getMaxTokens();Float getPresencePenalty();List<String> getStopSequences();Float getTemperature();Integer getTopK();Float getTopP();ChatOptions copy();}

每个特定于模型的ChatModel/StreamingChatModel实现都可以有自己的选项。比如说,OpenAI的选项有logitBias seeduser

这是一个很强大的功能,可以让用户在应用启动时使用模型特有的参数,然后在运行时用Prompt 请求来覆盖它们,如下图所示:
在这里插入图片描述

每个特定于模型的ChatModel/StreamingChatModel实现都可以有自己的选项。比如说,OpenAI的选项有logitBias seeduser

这是一个很强大的功能,可以让用户在应用启动时使用模型特有的参数,然后在运行时用Prompt 请求来覆盖它们,如下图所示:

ChatResponse

ChatResponse的定义如下:

public class ChatResponse implements ModelResponse<Generation> {private final ChatResponseMetadata chatResponseMetadata;private final List<Generation> generations;@Overridepublic ChatResponseMetadata getMetadata() {...}@Overridepublic List<Generation> getResults() {...}// other methods omitted
}

ChatResponse对象持有AI模型的输出,其中包含元数据ChatResponseMetadata

Generation

Generation指模型输出结果,实现了ModelResult接口:

public class Generation implements ModelResult<AssistantMessage> {private final AssistantMessage assistantMessage;private ChatGenerationMetadata chatGenerationMetadata;@Overridepublic AssistantMessage getOutput() {...}@Overridepublic ChatGenerationMetadata getMetadata() {...}// other methods omitted
}

ChatModel的实现

ChatModel 的具体实现有很多种,在上文介绍Spring AI支持的AI模型示意图中可以看到。

在这些实现中,有些仅支持文本处理,有些不支持函数调用,有些不可调试,不支持JSON输出,各有各的特点。

Amazon Bedrock

Amazon Bedrock支持来自不同模型提供商的多个基础模型,如Anthropic3、Anthropic2、Llama、Cohere、Titan、Jurassic2。

使用Amazon Bedrock的好处是无需管理底层硬件或模型训练的基础设施,而是交给Amazon来托管。降低了构建生成式AI应用的技术门槛,简化了部署流程。

Amazon Bedrock与AWS的其他服务无缝集成,提供了端到端的AI开发解决方案。

Amazon Bedrock 目前尚未对中国区开放,美国和欧洲等地区是可用的。

Azure OpenAI

由ChatGPT驱动的Azure OpenAI超越了传统的OpenAI功能,提供了人工智能驱动的文本生成,并增强了功能。Azure提供了额外的AI安全和负责任的AI功能。Azure OpenAI可以与其他Azure服务无缝集成,包括Azure 的向量存储服务。

在前文的例子中,我们就是以Azure OpenAI为例来演示的。Azure OpenAI的配置项均以spring.ai.azure.openai为前缀。如下所示:

属性描述默认
spring.ai.azure.openai.api-keyAzure AI OpenAI的key-
spring.ai.azure.openai.endpointAzure AI OpenAI的端点-
spring.ai.azure.openai.openai-api-key直连OpenAI,而不是Azure OpenAI。此时系统会自动将endpoint默认设置为https://api.openai.com/v1。spring.ai.azure.openai.chat.options.deployment-name参数必须为OpenAI的模型-
spring.ai.azure.openai.custom-headers一个包含请求头的mapempty map
以下是ChatModel的配置
spring.ai.azure.openai.chat.enabled是否开启Azure OpenAItrue
spring.ai.azure.openai.chat.options.deployment-nameAzure OpenAI的模型部署名。需要注意的是,部署名与模型本身的名字不是一个概念。gpt-4o
spring.ai.azure.openai.chat.options.maxTokens生成的tokens的最大数量-
spring.ai.azure.openai.chat.options.temperature生成内容的创造性。值越大表示随机性越大,值越小表示确定性越高0.7
spring.ai.azure.openai.chat.options.topP控制生成文本时的多样性,与温度参数类型,但工作原理不同。具体来说,就是从前n个概率和大于topP的候选词中随机采样一个词作为下一个生成词。不建议与温度同时使用,避免复杂度-

除此之外,还有spring.ai.azure.openai.chat.options.logitBiasspring.ai.azure.openai.chat.options.userspring.ai.azure.openai.chat.options.n等参数,这里就不一一列举了。ChatModel相关参数均可以在请求时动态传递运行时选项来复写。如下所示:

ChatResponse response = chatModel.call(new Prompt("Generate the names of 5 famous pirates.",AzureOpenAiChatOptions.builder().withDeploymentName("gpt-4o").withTemperature(0.4).build()));

函数调用

函数调用让开发者在代码中创建一个函数描述,然后将该描述通过请求传递给大模型。大模型将返回函数名和调用函数的参数。

你可以通过AzureOpenAiChatModel 来注册自定义Java函数,并让模型智能地选择输出一个包含调用这些注册函数参数的JSON对象。

Azure OpenAI API 并不直接调用函数,而是生成一个JSON对象,然后让开发者自己去调用函数,并将函数返回值给到模型来完善对话。

下面来看看具体如何做。

假设有一个Weather Service API:

public class MockWeatherService implements Function<Request, Response> {public enum Unit { C, F }public record Request(String location, Unit unit) {}public record Response(double temp, Unit unit) {}public Response apply(Request request) {return new Response(30.0, Unit.C);}
}

首先需要将函数注册为Bean,如下所示:

@Configuration
static class Config {@Bean@Description("Get the weather in location") // function descriptionpublic Function<MockWeatherService.Request, MockWeatherService.Response> weatherFunction1() {return new MockWeatherService();}...
}

这里的@Description注释用来帮助模型理解什么时候来调用这个函数。这是一个很重要的属性。当然,也可以通过在Requset上添加@JsonClassDescription 注释来描述函数:

@Configuration
static class Config {@Beanpublic Function<Request, Response> currentWeather3() {return new MockWeatherService();}...
}@JsonClassDescription("Get the weather in location")
public record Request(String location, Unit unit) {}

推荐在Request上添加注释来作为函数描述。

除了直接以Bean的方式注册函数外,还可以通过函数回调来注册:

@Configuration
static class Config {@Beanpublic FunctionCallback weatherFunctionInfo() {return FunctionCallback.builder().function("CurrentWeather", new MockWeatherService()) // (1) function name.description("Get the current weather in a given location") // (2) function description.inputType(MockWeatherService.Request.class) // (3) function input type.build();}...
}

然后在chat选项中指定回调函数:

AzureOpenAiChatModel chatModel = ...UserMessage userMessage = new UserMessage("What's the weather like in San Francisco, Tokyo, and Paris?");ChatResponse response = this.chatModel.call(new Prompt(List.of(this.userMessage),AzureOpenAiChatOptions.builder().withFunction("CurrentWeather").build())); // (1) Enable the functionlogger.info("Response: {}", response);

还有第三种方法,那就是直接在chat选项中声明回调函数:

AzureOpenAiChatModel chatModel = ...UserMessage userMessage = new UserMessage("What's the weather like in San Francisco, Tokyo, and Paris?  Use Multi-turn function calling.");var promptOptions = AzureOpenAiChatOptions.builder().withFunctionCallbacks(List.of(FunctionCallback.builder().function("CurrentWeather", new MockWeatherService()) // (1) function name and instance.description("Get the current weather in a given location") // (2) function description.inputType(MockWeatherService.Request.class) // (3) function input type.build())).build();ChatResponse response = this.chatModel.call(new Prompt(List.of(this.userMessage), this.promptOptions));

其他ChatModel

除了Amazon和Azure提供的对话式大模型之外,还有众多AI提供商,如Google VertexAIGroqHugging FaceMistral AIMiniMaxMoonshot AINVIDIAOllamaPerplexity AIOCI Generative AIOpenAI,还有百度的QianFanZhiPu AI,IBM的watsonx.AI等。

参考资料

[1]. https://docs.spring.io/spring-ai/reference/api/index.html

相关文章:

Spring AI API 介绍

目录&#xff1a; Spring AI 框架介绍 Spring AI API 核心API简介 Spring AI 提供了很多便利的功能&#xff0c;主要如下&#xff1a; AI Model API “Model API” 提供了聊天、文本转图像、音频转录、文本转语音、嵌入等功能&#xff0c;且不局限于某个固定的大模型提供商…...

【MySQL】Linux使用C语言连接安装

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…...

2024年第十五届蓝桥杯青少组C++国赛—割点

割点 题目描述 一张棋盘由n行 m 列的网格矩阵组成&#xff0c;每个网格中最多放一颗棋子。当前棋盘上已有若干棋子。所有水平方向或竖直方向上相邻的棋子属于同一连通块。 现给定棋盘上所有棋子的位置&#xff0c;如果要使棋盘上出现两个及以上的棋子连通块&#xff0c;请问…...

【软件开发】做出技术决策

文章目录 专注于核心业务除非绝对必要,不要重写代码保持技术栈简单尽量减少依赖避免范围蔓延按照业务实际情况确定优先级在做出高风险决策前构建原型跨职能团队协作信任你的团队在过去的二十年里,我曾在多家初创企业担任软件开发人员、技术负责人以及首席技术官(包括创办自己…...

Airborne使用教程

1.安装环境 前提条件&#xff1a;系统已安装Ruby 打开终端输入如下命令 gem install airborne 或者在Gemfile添加 gem airborne 然后运行bundle install 2.编写脚本 在项目中新建api_tests_spec.rb文件 以GET接口"https://www.thunderclient.com/welcome"为…...

WPF实现曲线数据展示【案例:震动数据分析】

wpf实现曲线数据展示&#xff0c;函数曲线展示&#xff0c;实例&#xff1a;震动数据分析为例。 如上图所示&#xff0c;如果你想实现上图中的效果&#xff0c;请详细参考我的内容&#xff0c;创作不易&#xff0c;给个赞吧。 一共有两种方式来实现&#xff0c;一种是使用第三…...

EasyExcel 动态设置表格的背景颜色和排列

项目中使用EasyExcel把数据以excel格式导出&#xff0c;其中设置某一行、某一列单元格的背景颜色、排列方式十分常用&#xff0c;记录下来方便以后查阅。 1. 导入maven依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easy…...

【 C++11 】类的新功能

C类的新功能 一、默认成员函数二、类成员变量初始化三、default关键字四、delete关键字六、final关键字七、override关键字 一、默认成员函数 八个默认成员函数 在C11之前&#xff0c;一个类中有如下六个默认成员函数&#xff1a; 构造函数。析构函数。拷贝构造函数。拷贝赋值…...

防止SQL注入:PHP安全最佳实践

防止SQL注入&#xff1a;PHP安全最佳实践 SQL注入是一种常见的网络攻击方式&#xff0c;攻击者通过向应用程序的SQL查询中插入恶意代码&#xff0c;来获取、操控或破坏数据库中的数据。为了保护PHP应用免受SQL注入攻击&#xff0c;开发者需要遵循一系列安全最佳实践。本文将介…...

自动化生产或质量检测准备工作杂记

自动化生产或质量检测一个流程是&#xff1a; 上料位上料&#xff1a; “上料位”指的是物料被放置以供机器或设备处理的位置。“上料”指的是将物料从存储位置移动到加工或检测位置的过程。移动到对位相机位置&#xff1a; “对位相机”是一种高精度相机&#xff0c;用于精确…...

张志辰医生

在医学领域&#xff0c;北京中医药大学东方医院的张志辰副主任医师宛如一颗璀璨的明星。自 2011 年于北京中医药大学获取博士学位后&#xff0c;他便扎根临床一线&#xff0c;以精湛医术和仁心仁术&#xff0c;为众多患者排忧解难 张志辰曾先后前往北京天坛医院、广东中山医院…...

CodeMirror 如何动态更新definemode

CodeMirror 如何动态更新definemode 问题描述&#xff1a;解决方法&#xff1a; 问题描述&#xff1a; 项目中有一部分用到了CodeMirror组件&#xff0c;其高亮显示的内容需要根据最新的json动态的更新&#xff0c;需要使用definemode自定义高亮内容。 想要的效果如下&#xf…...

舵机SG90详解

舵机&#xff0c;也叫伺服电机&#xff0c;在嵌入式开发中&#xff0c;舵机作为一种常见的运动控制组件&#xff0c;具有广泛的应用。其中&#xff0c;SG90 舵机以其高效、稳定的性能特点&#xff0c;成为了许多工程师和爱好者的首选&#xff0c;无论是航模、云台、机器人、智能…...

程序设计考题汇总(四:SQL练习)

文章目录 查询结果限制返回行数 查询结果限制返回行数 select device_id from user_profile LIMIT 2;...

明达IOT平台助力工业废水运维智能化

背景简介 相较于生活污水&#xff0c;工业废水的处理挑战性更高&#xff0c;原因在于其源于多样化的工业生产流程&#xff0c;成分复杂且多变&#xff0c;可能包含重金属、有毒化学…...

深入理解 Ansible Playbook:组件与实战

目录 1 playbook介绍 2 YAML语言 2.1语法简介 2.2数据类型 3 Playbook核心组件 3.1 hosts组件 3.2 remote_user组件 3.3 task列表和action组件 3.4 handlers 3.5 tags组件 3.6 其他组件说明 1 playbook介绍 playbook 剧本是由一个或多个"play"组成的列表。…...

JavaEE初阶——多线程(线程安全-锁)

复习上节内容&#xff08;部分-掌握程度不够的&#xff09; 加锁&#xff0c;解决线程安全问题。 synchronized关键字&#xff0c;对锁对象进行加锁。 锁对象&#xff0c;可以是随便一个Object对象&#xff08;或者其子类的对象&#xff09;&#xff0c;需要关注的是&#xff…...

Stable Diffusion 提示词语法

1.提示词基础 1.提示词之间用英文逗号,分隔 2.提示词之间是可以换行的 3.权重默认为1,越靠前权重越高 4.数量控制在75个单位以内 2.提示词各种符号的意义 2.1 ()、[]、{}符号 权重值()小括号[]中括号{}大括号默认1111层()1.1[]0.9{}1.052层(()) 1.121.21[[]]0.920.81{{}}1.…...

【功能安全】安全确认

目录 01 功能安全确认介绍 02 安全确认用例 03 安全确认模板 01 功能安全确认介绍 定义: 来源...

在pycharm2024.3.1中配置anaconda3-2024-06环境

version: anaconda3-2024.06-1 pycharm-community-2024.3.1 1、安装anaconda和pycharm 最新版最详细Anaconda新手安装配置环境创建教程_anaconda配置-CSDN博客 【2024最新版】超详细Pycharm安装保姆级教程&#xff0c;Pycharm环境配置和使用指南&#xff0c;看完这一篇就够了…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...