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
,seed
和user
。
这是一个很强大的功能,可以让用户在应用启动时使用模型特有的参数,然后在运行时用Prompt
请求来覆盖它们,如下图所示:
每个特定于模型的ChatModel/StreamingChatModel实现都可以有自己的选项。比如说,OpenAI的选项有logitBias
,seed
和user
。
这是一个很强大的功能,可以让用户在应用启动时使用模型特有的参数,然后在运行时用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-key | Azure AI OpenAI的key | - |
spring.ai.azure.openai.endpoint | Azure 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 | 一个包含请求头的map | empty map |
以下是ChatModel的配置 | ||
spring.ai.azure.openai.chat.enabled | 是否开启Azure OpenAI | true |
spring.ai.azure.openai.chat.options.deployment-name | Azure 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.logitBias
,spring.ai.azure.openai.chat.options.user
,spring.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 VertexAI
,Groq
,Hugging Face
,Mistral AI
,MiniMax
,Moonshot AI
,NVIDIA
,Ollama
,Perplexity AI
,OCI Generative AI
,OpenAI
,还有百度的QianFan
,ZhiPu AI
,IBM的watsonx.AI
等。
参考资料
[1]. https://docs.spring.io/spring-ai/reference/api/index.html
相关文章:

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

【MySQL】Linux使用C语言连接安装
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...

2024年第十五届蓝桥杯青少组C++国赛—割点
割点 题目描述 一张棋盘由n行 m 列的网格矩阵组成,每个网格中最多放一颗棋子。当前棋盘上已有若干棋子。所有水平方向或竖直方向上相邻的棋子属于同一连通块。 现给定棋盘上所有棋子的位置,如果要使棋盘上出现两个及以上的棋子连通块,请问…...

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

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

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

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

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

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

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

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

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

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

程序设计考题汇总(四:SQL练习)
文章目录 查询结果限制返回行数 查询结果限制返回行数 select device_id from user_profile LIMIT 2;...

明达IOT平台助力工业废水运维智能化
背景简介 相较于生活污水,工业废水的处理挑战性更高,原因在于其源于多样化的工业生产流程,成分复杂且多变,可能包含重金属、有毒化学…...

深入理解 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初阶——多线程(线程安全-锁)
复习上节内容(部分-掌握程度不够的) 加锁,解决线程安全问题。 synchronized关键字,对锁对象进行加锁。 锁对象,可以是随便一个Object对象(或者其子类的对象),需要关注的是ÿ…...

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安装保姆级教程,Pycharm环境配置和使用指南,看完这一篇就够了…...

linux不同发行版中的主要差异
一、初始化系统 Linux不同发行版中的系统初始化系统(如 System V init、Upstart 或 systemd) System V init: 历史:System V init 是最传统的 Linux 系统初始化系统,起源于 Unix System V 操作系统。运行级别ÿ…...

概率论得学习和整理29: 用EXCEL 描述二项分布
目录 1 关于二项分布的基本内容 2 二项分布的概率 2.1 核心要素 2.2 成功K次的概率,二项分布公式 2.3 期望和方差 2.4 具体试验 2.5 概率质量函数pmf 和cdf 3 二项分布的pmf图的改进 3.1 改进折线图 3.2 如何生成这种竖线图呢 4 不同的二项分布 4.1 p0.…...

C++打造局域网聊天室第九课: 客户端队列及其处理线程
文章目录 前言一、添加客户端队列的参数初始化二、相关函数总结 前言 C打造局域网聊天室第九课: 客户端队列及其处理线程 一、添加客户端队列的参数初始化 在Server.cpp的 ListenThreadFunc()函数内的其他操作处实现客户端队列的添加。 首先进行部分参数的初始化…...

请求go web后端接口 java安卓端播放视频
前端代码 添加gradle依赖 implementation com.squareup.retrofit2:retrofit:2.9.0 implementation com.squareup.retrofit2:converter-gson:2.9.0 添加访问网络权限 <uses-permission android:name"android.permission.INTERNET" />允许http 请求请求 andro…...

XML Schema 复合类型 - 混合内容
XML Schema 复合类型 - 混合内容 XML Schema 是一种用于定义 XML 文档结构和内容的语言。在 XML Schema 中,复合类型是一种包含其他元素和/或属性的复杂类型。混合内容(Mixed Content)是复合类型的一种特殊形式,它允许元素包含其…...

第8章 搬移特性
8.1 搬移函数 模块化是优秀软件设计的核心所在,好的模块化能够让我在修改程序时只需理解程序的一小部分。为了设计出高度模块化的程序,我得保证互相关联的软件要素都能集中到一块,并确保块与块之间的联系易于查找、直观易懂。同时,…...

ARM/Linux嵌入式面经(五九):海尔
1.以后打算在哪里工作 问题回答: 1. 以后打算在哪里工作? 回答这个问题时,我首先会考虑我的个人目标、职业规划以及家庭和生活因素。从职业发展的角度来看,我希望能够在技术氛围浓厚、创新能力强、且能提供良好职业成长机会的地方工作。具体来说,我对以下几个方向特别感…...

java中的List、数组和set
在Java中,List、数组(Array)和Set 是三种常用的数据结构,它们各自有不同的特性、用途和实现方式。下面我们将深入探讨这三者的特点、区别以及它们在 Java 中的常见使用场景。 1. 数组(Array) 特性&#x…...

freeswitch(配置文件结构)
vars.xml<X-PRE-PROCESS cmd="set" data="default_password=1234"/>default_password:设置默认密码,为安全起见,建议在部署后立即更改此密码,以防止盗用。<X-PRE-PROCESS cmd=<...

ARMS 用户体验监控正式发布原生鸿蒙应用 SDK
作者:羿莉 背景 对企业数据进行敏感数据扫描和保护可以提升企业或组织的数据安全。一方面敏感数据可能包括个人身份信息、财务记录、医疗记录等,定期扫描这些数据可以防止未经授权的访问和泄露。 另一方面,许多国家和地区都有关于数据保护的…...