Spring AI Image Model、TTS,RAG

article/2025/7/29 14:40:59

文章目录

    • Spring AI Alibaba
    • 聊天模型
    • 图像模型
      • Image Model API接口及相关类
      • 实现生成图像
    • 语音模型
      • Text-to-Speech API概述
      • 实现文本转语音
    • 实现RAG
      • 向量化
      • RAG
      • RAG工作流程概述
      • 实现基本 RAG 流程

Spring AI Alibaba

Spring AI Alibaba实现了与阿里云通义模型的完整适配,如果需要对接国内一些大模型来生成图像、语音,SpringAi官网目前支持模型有限,这时Spring AI Alibaba可能更适用。

在这里插入图片描述

使用前请先申请api_key:

  • 访问阿里云百炼页面并登录账号 https://www.aliyun.com/product/bailian
  • 申请api_key

官方文档:https://java2ai.com/docs/1.0.0-M6.1/get-started/?spm=4347728f.13ae80de.0.0.6fe5175cWxPTJZ

注意:因为 Spring AI Alibaba 基于 Spring Boot 3.x 开发,因此本地 JDK 版本要求为 17 及以上。

聊天模型

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>deepseek-apringai</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.5</version><relativePath/> <!-- lookup parent from repository --></parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><spring-ai.version>1.0.0-M5</spring-ai.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId><version>1.0.0-M5.1</version></dependency></dependencies><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories>
</project>
@RestController
public class DeepSeekController {private static final String DEFAULT_PROMPT = "你是一个博学的智能聊天助手,请根据用户提问回答!";@Autowiredprivate ChatClient dashScopeChatClient;public DeepSeekController(ChatClient.Builder chatClientBuilder) {this.dashScopeChatClient = chatClientBuilder.defaultSystem(DEFAULT_PROMPT)// 实现 Chat Memory 的 Advisor// 在使用 Chat Memory 时,需要指定对话 ID,以便 Spring AI 处理上下文。.defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()))// 实现 Logger 的 Advisor.defaultAdvisors(new SimpleLoggerAdvisor())// 设置 ChatClient 中 ChatModel 的 Options 参数.defaultOptions(DashScopeChatOptions.builder().withTopP(0.7).build()).build();}@GetMapping("/simple/chat")public String simpleChat(String query) {return dashScopeChatClient.prompt(query).call().content();}
}

图像模型

  • 在Spring AI框架中,Image Model API旨在为与专注于图像生成的各种AI模型进行交互提供一个简单且可移植的接口,使开发者能够以最小的代码改动切换不同的图像相关模型。这一设计符合Spring模块化和互换性的理念,确保开发者可以快速调整其应用程序以适应不同的图像处理相关的AI能力。

  • 此外,通过支持像ImagePrompt这样的辅助类来进行输入封装以及使用ImageResponse来处理输出,图像模型API统一了与致力于图像生成的AI模型之间的通信。它管理请求准备和响应解析的复杂性,为图像生成功能提供直接而简化的API交互。

  • Image Model API建立在Spring AI通用模型API之上,提供了特定于图像的抽象和实现。

Image Model API接口及相关类

ImageModel(图像模型)

这里展示的是ImageModel接口定义:

@FunctionalInterface
public interface ImageModel extends Model<ImagePrompt, ImageResponse> {ImageResponse call(ImagePrompt request);
}

ImagePrompt(图像提示)

ImagePrompt是一个封装了ImageMessage对象列表及可选模型请求选项的ModelRequest。下面显示的是ImagePrompt类的一个简化版本,省略了构造函数和其他工具方法:

public class ImagePrompt implements ModelRequest<List<ImageMessage>> {private final List<ImageMessage> messages;private ImageOptions imageModelOptions;@Overridepublic List<ImageMessage> getInstructions() {...}@Overridepublic ImageOptions getOptions() {...}
}

ImageMessage(图像消息)
ImageMessage类封装了用于影响生成图像的文本及其权重。对于支持权重的模型,它们可以是正数或负数。

public class ImageMessage {private String text; private Float weight;public String getText() {...}public Float getWeight() {...}
}

ImageOptions(图像选项)

表示可以传递给图像生成模型的选项。ImageOptions接口扩展了ModelOptions接口,并用于定义可以传递给AI模型的一些可移植选项。

public interface ImageOptions extends ModelOptions {Integer getN();String getModel();Integer getWidth();Integer getHeight();String getResponseFormat(); // openai - url or base64 : stability ai byte[] or base64
}

ImageResponse(图像响应)

持有AI模型的输出,每个ImageGeneration实例包含来自单一提示的可能多个输出结果之一。

public class ImageResponse implements ModelResponse<ImageGeneration> {private final ImageResponseMetadata imageResponseMetadata;private final List<ImageGeneration> imageGenerations;@Overridepublic ImageGeneration getResult() {// get the first result}@Overridepublic List<ImageGeneration> getResults() {...}@Overridepublic ImageResponseMetadata getMetadata() {...}
}

ImageGeneration(图像生成)

最终,ImageGeneration类扩展自ModelResult,代表输出响应及有关此结果的元数据。

public class ImageGeneration implements ModelResult<Image> {private ImageGenerationMetadata imageGenerationMetadata;private Image image;@Overridepublic Image getOutput() {...}@Overridepublic ImageGenerationMetadata getMetadata() {...}
}

实现生成图像

@Autowired
private DashScopeImageModel imageModel;@GetMapping(value = "/getImage")public void getImage(@RequestParam(value = "msg",defaultValue = "生成一条龙")String msg, HttpServletResponse res) {ImageResponse response = imageModel.call(new ImagePrompt(msg,DashScopeImageOptions.builder().withModel(DashScopeImageApi.DEFAULT_IMAGE_MODEL).withN(1)//要生成的图像数。必须介于 1 和 10 之间。.withHeight(1024)//生成的图像的高宽度。.withWidth(1024).build()));//获取生成图像地址String imageUrl = response.getResult().getOutput().getUrl();try {//使用输出流在浏览器输出URL url = URI.create(imageUrl).toURL();InputStream in = url.openStream();res.setHeader("Content-Type", MediaType.IMAGE_PNG_VALUE);res.getOutputStream().write(in.readAllBytes());res.getOutputStream().flush();}catch (Exception e) {}
}

语音模型

Text-to-Speech API概述

在Spring AI框架中,Text-to-Speech API提供了一个基于OpenAI的TTS(文本转语音)模型的语音端点,

使用户能够:

  • 朗读写好的博客文章。

  • 生成多种语言的语音音频。

  • 使用流媒体实现实时音频输出。

这一功能强大的API让用户可以轻松地将文字内容转化为语音内容,不仅支持多语言转换,还能满足实时语音输出的需求,极大地提升了内容的可访问性和用户的体验感。

实现文本转语音

  • 本示例基于spring ai alibaba开源框架

  • SpeechSynthesisModel 类是Spring AI Alibaba框架中用于表示和管理文本转语音模型的核心组件之一。

  • DashScopeSpeechSynthesisOptions 类通常用于配置文本转语音(TTS)服务的选项,这个类允许开发者指定一系列参数(比如:语速、音调、音量等)来定制化语音合成的结果,从而满足不同的应用场景需求。

@Autowired
private DashScopeSpeechSynthesisModel speechSynthesisModel;private static final String TEXT = "床前明月光, 疑是地上霜。 举头望明月, 低头思故乡。";
private static final String FILE_PATH = "src/main/resources/tts";@GetMapping("/tts")
public void tts() throws IOException {// 使用构建器模式创建 DashScopeSpeechSynthesisOptions 实例并设置参数DashScopeSpeechSynthesisOptions options = DashScopeSpeechSynthesisOptions.builder().withSpeed(1.0)        // 设置语速.withPitch(0.9)         // 设置音调.withVolume(60)         // 设置音量.build();SpeechSynthesisResponse response = speechSynthesisModel.call(new SpeechSynthesisPrompt(TEXT,options));File file = new File(FILE_PATH + "/output.mp3");try (FileOutputStream fos = new FileOutputStream(file)) {ByteBuffer byteBuffer = response.getResult().getOutput().getAudio();fos.write(byteBuffer.array());} catch (IOException e) {throw new IOException(e.getMessage());}
}

实现RAG

向量化

  • 向量数据库(Vector Database)是一种以数学向量的形式存储数据集合的数据库,通过一个数字列表来表示维度空间中的一个位置。在这里,向量数据库的功能是可以基于相似性搜索进行识别,而不是精准匹配。比如说在使用一个商城系统的向量数据库进行查询的时候,用户输入“北京”,其可能返回的结果会是 “中国、北京、华北、首都、奥运会” 等信息;输入“沈阳”,其返回结果可能会是“东北、辽宁、雪花、重工业”等信息。当然,返回的信息取决于向量数据库中存在的数据。用户可以通过参数的设置来限定返回的情况,进而适配不同的需求。

  • 嵌入模型(Embedding Model)和向量数据库(Vector Database/Vector Store)是一对亲密无间的合作伙伴,也是 AI 技术栈中紧密关联的两大核心组件,两者的协同作用构成了现代语义搜索、推荐系统和 RAG(Retrieval Augmented Generation,检索增强生成)等应用的技术基础。

RAG

RAG,全称 Retrieval-Augmented Generation ,中文叫做检索增强生成。RAG是一种结合了检索系统和生成模型的新型技术框架,其主要目的有:

  • 利用外部知识库
  • 帮助大模型生成更加准确、有依据、最新的回答

​ 通过使用RAG,解决了传统LLM存在的两个主要问题:

  • 知识局限性:LLM的知识被固定在训练数据中,无法知道最新消息。
  • 幻觉现象:LLM有时候会编造出并不存在的答案。

​ 通过检索外部知识,RAG让模型突破了知识局限性,也让LLM(大语言模型)的幻觉现象得到解决。

RAG工作流程概述

第一,用户输入问题

​ 用户在输入窗口输入自己的问题,这一数据被接收,并作为后续处理的查询入口

例如:用户提问

“我的智能手表出现蓝牙连接问题,怎么办?”

第二,问题向量化

​ 根据用户初始输入的问题,调用Embedding模型,将问题转换为高维向量,以便于后续的想来那个相似度检索。

文本:"我的智能手表出现蓝牙连接问题,怎么办?"
→ 向量:[0.123, 0.582, ..., 0.001]

第三,向量数据库检索

​ 系统会连接到一个向量数据库(如FAISS、Milvus、Pinecone、Weaviate)。然后用刚才生成的问题向量,检索知识库中与之最相似的文档片段。

​ 当检索的时候,常见的检索参数包括:

  • Tok-K :检索最相关的K条记录
  • 相似度阈值:控制检索到内容的相关性

​ 最后输出的结果往往是K条知识片段

1. "蓝牙连接问题通常可以通过重启设备和重新配对解决。"
2. "如果手表固件版本较旧,请更新到最新版本以兼容蓝牙。"
3. "某些环境下,如电磁干扰,也会导致连接失败。"

第四,构建上下文

这一阶段需要组织提示词(Prompt),让LLM更好地理解背景信息。

这一部分包括:

  • 系统提示词(System Prompt)

    提前告诉LLM需要遵循的行为规范,比如

    你是一个专业的智能手表客服助理。请基于提供的背景资料,准确回答用户的问题。如果资料中没有明确答案,请如实告诉用户而不是编造。
    

    系统提示词可以有效地设定模型角色、控制回答风格、防止幻觉

  • 构造最终输入(Final Prompt)

    一般会结合以上内容,按照如下格式进行组织

    【背景资料】
    1. 蓝牙连接问题通常可以通过重启设备和重新配对解决。
    2. 如果手表固件版本较旧,请更新到最新版本以兼容蓝牙。
    3. 某些环境下,如电磁干扰,也会导致连接失败。【用户问题】
    我的智能手表出现蓝牙连接问题,怎么办?【回答要求】
    请结合以上资料,用简洁明了的方式回答用户的问题。如果答案无法直接从资料中找到,请礼貌告知用户。
    

第五,调用LLM

​ 将构造好的Prompt提交给LLM(比如Deepseek、Qwen、GPT-4o、Claude等)

  • 模型读取检索到的内容和问题
  • 组织自然、连贯、准确的回答

生成结果示例:

您好! 根据我们的资料,您可以尝试重启智能手表并重新进行蓝牙配对。如果问题仍未解决,请检查手表固件是否为最新版本。如处于高电磁干扰环境,也可能影响连接质量,建议更换使用环境。”

第六,返回最终回答给用户

​ 最终系统将生成的回答返回前端,展示给用户。

总结:

在RAG工作时,其运行流程大致为:

  1. 用户输入问题
  2. 问题向量化
  3. 向量数据库检索
  4. 构建上下文(含系统提示词)
  5. 携带检索内容,调用大模型进行回答
  6. 返回最终答案给用户

实现基本 RAG 流程

创建配置类

@Configuration
public class RagConfig {@BeanChatClient chatClient(ChatClient.Builder builder) {return builder.defaultSystem("你将作为一名行天下公司的客服,对于用户的使用需求作出解答").build();}@BeanVectorStore vectorStore(EmbeddingModel embeddingModel) {SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(embeddingModel).build();//1 提取文本内容String filePath="file.txt"; //resources目录下TextReader textReader = new TextReader(filePath);textReader.getCustomMetadata().put("filePath",filePath);List<Document> documents = textReader.get();//2 文本切分段落TokenTextSplitter splitter =new TokenTextSplitter(1200,350, 5,100, true);splitter.apply(documents);//3 添加simpleVectorStore.add(documents);return simpleVectorStore;}}

file.txt

公司主营养猪业务,公司总部在山西省临汾市
  • 通过这个配置类,完成以下内容:

1、配置 ChatClient 作为 Bean,其中设置系统默认角色为Java开发语言专家, 负责处理用户查询并生成回答向量存储配置。

2、初始化 SimpleVectorStore,加载Java开发语言说明文档,将文档转换为向量形式存储。

Controller

@Autowired
private ChatClient dashScopeChatClient;@Autowired
private VectorStore vectorStore;@GetMapping(value = "/chat", produces = "text/plain; charset=UTF-8")
public String generation(String userInput) {// 发起聊天请求并处理响应return dashScopeChatClient.prompt().user(userInput).advisors(new QuestionAnswerAdvisor(vectorStore)).call().content();
}
  • 通过添加 QuestionAnswerAdvisor 并提供对应的向量存储,可以将之前放入的文档作为参考资料,并生成增强回答。

测试结果

在这里插入图片描述

通过RAG可以构建更专业的知识库来让AI模型回答更具体化,支持的文档可以是word、pdf等其他格式,向量数据也可以持久化存储在向量数据库中。


http://www.hkcw.cn/article/GDGBqjGynP.shtml

相关文章

多地机关食堂端午假期向社会开放 特色套餐迎客来

端午假期期间,全国多地政府机关食堂面向社会公众开放。5月31日中午,荣昌区政府机关食堂如约向游客开放,首日第一餐吸引了超过3000名游客前来体验。荣昌区特别推出了61元的“六一”家庭套餐,包含荣昌卤鹅、猪油泡粑、黄凉粉等特色菜品,还新增了粽子和儿童喜欢的薯条、鸡腿、…

韩国大选“5选1”投票将启 三强格局形成

6月3日,韩国将迎来新一届总统选举。最初有7名候选人登记参选,但截至6月2日,已有两名候选人宣布退出,形成了“5选1”的局面。目前李在明、金文洙和李俊锡基本形成三强格局。4名韩国前总统也各自进行着“路演”,通过各种方式表达对各自阵营候选人的支持。尹锡悦5月31日表态支…

美联邦调查局称科罗拉多州发生恐袭 燃烧瓶袭击游行人群

美国联邦调查局(FBI)局长卡什帕特尔在社交媒体上表示,6月1日科罗拉多州博尔德市发生了一起有针对性的恐怖袭击事件。FBI正在对此进行全面调查。FBI特工和当地执法人员已到达案发现场,并将在获得更多信息后分享最新情况。同日下午,科罗拉多州博尔德市的一个购物中心发生了袭…

第二轮谈判 乌公布代表团14人名单 防长继续带队

俄罗斯代表团已抵达土耳其伊斯坦布尔,准备参加即将举行的俄乌谈判。俄谈判代表团团长梅金斯基在抵达后表示,关于乌克兰谈判的所有评论将在6月2日公布,并会在当天详细说明俄罗斯在乌克兰问题上的立场。对于乌克兰对俄罗斯境内目标可能发起的攻击及其影响,俄方代表团成员、俄…

MQTT入门实战宝典:从零起步掌握物联网核心通信协议

MQTT入门实战宝典&#xff1a;从零起步掌握物联网核心通信协议 前言 物联网时代&#xff0c;万物互联已成为现实&#xff0c;而MQTT协议作为这个时代的"数据总线"&#xff0c;正默默支撑着从智能家居到工业物联的各类应用场景。本文将带你揭开MQTT的神秘面纱&#…

腾讯位置商业授权行政区划开发指南

概述 本服务提供中国标准行政区划数据查询功能&#xff0c;支持&#xff1a; 1 . 全国省、市、区/县、乡镇/街道 四级行政区划数据&#xff1b; 2 . 支持三级区划&#xff08;省/市 - 区/县&#xff09;轮廓数据&#xff1b; 3 . 支持区划查询、省市区列表、查询子级区划等功能…

GIS数据类型综合解析

GIS数据类型综合解析 目录 GIS数据类型综合解析1. 总体介绍2. GIS数据类型分类与对比2.1 主要数据类型对比表 3. 详细解析与扩展内容3.1 矢量数据&#xff08;Vector Data&#xff09;3.2 栅格数据&#xff08;Raster Data&#xff09;3.3 属性数据&#xff08;Attribute Data&…

Spring框架学习day5--AOP概念以及示例实现

AOP(面向切面编程) 1.概述 AOP为AspectOrientedProgramming 的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过 预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 AOP是OOP的延续&#xff0c;是软件开发中的一个热点&#xff0c;是java开发中的…

Python实现HPSO-TVAC优化算法优化支持向量机SVC分类模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在当今数据驱动的时代&#xff0c;支持向量机&#xff08;SVM&#xff09;作为一种经典的机器学习算法&#xff0c;…

警方回应10岁男孩儿童节前走失 仍在全力搜寻中

6月1日,山东省滕州市姜屯镇黄坡村一名10岁的小男孩赵某超走失,孩子家属通过网络社交媒体求助。事后家属查看家门口的监控发现,孩子是5月31日下午5时左右走失的。当时孩子消失在家门口的监控中后几分钟返回了一次,孩子的外公王先生在屋后的黄瓜地里插杆子,邻居还给了孩子一…

[SAP] 矩阵复制(Matrix Copy)

SAP中的复制粘贴功能被称为矩阵复制&#xff0c;通过点击对话框或屏幕&#xff0c;并执行下述命令&#xff0c;使用矩阵复制就可以复制多行文本 ① 按下Ctrl-Y&#xff0c;从左上到右下拖拉鼠标来选择文本 ② 文本高亮显示后&#xff0c;按下Ctrl-C ③ 移到新的位置插入文本…

2024年数维杯国际大学生数学建模挑战赛B题空间变量协同估计方法研究解题全过程论文及程序

2024年数维杯国际大学生数学建模挑战赛 B题 空间变量协同估计方法研究 原题再现&#xff1a; 在数理统计学中&#xff0c;简单采样通常假设来自相同总体的采样点彼此独立。与数理统计相反&#xff0c;空间统计假设空间变量的采样点是相依的&#xff0c;并在其值中表现出某些趋…

SPA-RL:通过Stepwise Progress Attribution训练LLM智能体

SPA-RL&#xff1a;通过Stepwise Progress Attribution训练LLM智能体 在大语言模型&#xff08;LLM&#xff09;驱动智能体发展的浪潮中&#xff0c;强化学习&#xff08;RL&#xff09;面临着延迟奖励这一关键挑战。本文提出的SPA-RL框架&#xff0c;通过创新的分步进度归因机…

基于 Zynq 平台的 EtherCAT 主站的软硬件协同设计

摘要: 针对工业自动化对控制能力和强实时性的需求&#xff0c;提出了一种基于 FPGA 的改进型 EtherCAT 硬件主站方案 。 该方案利用 Zynq&#xff0d;7000 平台&#xff0c;在 PL 端实现 FPGA 协议栈&#xff0c;以保证核心功能的高效执 行 。 基于 AXI4 总线设计…

【IC】BSIM-CMG:用于高级电路设计的标准FinFET紧凑型模型

摘要 这项工作提出了新的紧凑型模型&#xff0c;这些模型捕捉了工业FinFET中呈现的高级物理效应。所提出的模型被引入到行业标准紧凑型模型BSIM-CMG中。核心模型被更新为新的统一FinFET模型&#xff0c;该模型计算具有复杂鳍片横截面的晶体管的电荷和电流。此外&#xff0c;来…

BFD工作原理(双向转发检测)

BFD的工作原理 BFD 会在两台网络设备之间建立会话&#xff0c;并通过周期性地交换 BFD 控制报文来检测路径的连通性。如果在检测时间内没有收到对方的报文&#xff0c;则视为链路故障&#xff0c;是依赖于路由协议来发现邻居的 故障检测 故障检测时间 协同接收间隔 * 检测倍数…

【JNI】JNI环境搭建

1 前言 JNI (Java Native Interface) 是 JDK 提供的一种机制&#xff0c;用于实现 Java 代码与其他语言&#xff08;主要是 C 和 C&#xff09;编写的本地代码之间的交互。 JNI 接口详见 JDK 安装目录中的 include/jni.h 文件&#xff0c;Android NDK 对 JDK 的 JNI 进行了扩展…

利用IEEE 802.15.4z-IR UWB系统进行手势检测

本文介绍了一种符合 IEEE 802.15.4z 标准的脉冲无线电超宽带 (IR-UWB) 手势检测雷达系统。该系统可检测车辆乘客座椅上的人员是否执行了 12 个预定义手势中的某一个。这些预定义手势包括各种手部动作&#xff0c;例如左右滑动或顺时针旋转手掌。为了进行手势检测&#xff0c;我…

STM标准库-GPIO输入

文章目录 一、GPIO输入按键简介传感器模块简介硬件电路 二、C语言C语言数据类型C语言宏定义C语言typedefC语言结构体C语言枚举 三、练习3.1按键控制LED3.1.1接线图3.1.2代码效果&#xff1a; 3.2光敏电阻控制蜂鸣器3.2.1接线图3.2.2代码效果&#xff1a; 一、GPIO输入 STM32 的…

HackMyVM-Jabita

信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-01 05:20 EDT Nmap scan report for 192.168.43.1 Host is up (0.020s latency). MAC Address: C6:45:66:05:91:88 (Unknown) Nmap scan repo…