Spring Boot集成Spring Ai框架【详解 搭建Spring Ai项目,以及简单的ai大模型智能体应用,附有图文+示例代码】

news2025/4/25 7:43:07

文章目录

  • 一.Spring Ai介绍
    • 1.0 认识Spring Ai
    • 1.1 特征
    • 1.1 大模型专业名字介绍
      • 1.1.1 RAG(检索增强生成)
        • RAG 的基本原理
        • RAG 的关键技术
        • RAG 的优势
        • RAG 的应用场景
      • 1.1.2 fine-tuning(微调)
      • 1.1.3 function-call(函数调用)
    • 1.2 创建简单的Spring Ai项目
  • 二.Spring Ai简单的智能应用
    • 2.1 智能提问实现
    • 2.2 角色预设
    • 2.3 流式响应
    • 2.4 ChatClient和ChatMode区别
    • 2.5 文生图
    • 2.6 文生语音
    • 2.7 语音翻译
    • 2.8 多模态
    • 2.9 function-call请求
    • 持续待更新...........

一.Spring Ai介绍

Spring Ai 官方:https://spring.io/projects/spring-ai

1.0 认识Spring Ai

Spring AI 是一个用于 AI 工程的应用程序框架。 其目标是将 Spring 生态系统设计原则(如可移植性和模块化设计)应用于 AI 领域,并将使用 POJO 作为应用程序的构建块推广到 AI 领域。

在这里插入图片描述

Spring AI 的核心是解决了 AI 集成的根本挑战:将您的企业数据和 APIAI 模型连接起来。

1.1 特征

Spring AI 提供以下功能:

  • 支持所有主要的 AI 模型提供商,例如 Anthropic、OpenAI、Microsoft、Amazon、Google 和 Ollama。支持的模型类型包括:
    • 聊天完成
    • 嵌入
    • 文本到图像
    • 音频转录
    • 文本到语音
    • 适度
  • 支持跨 AI 提供商对同步和流式处理 API 选项的可移植 API 支持。此外,还可以访问特定于模型的特征。
  • 结构化输出 - AI 模型输出到 POJO 的映射。
  • 支持所有主要的矢量数据库提供商,例如 Apache Cassandra、Azure Vector Search、Chroma、Milvus、MongoDB Atlas、Neo4j、Oracle、PostgreSQL/PGVector、PineCone、Qdrant、Redis 和 Weaviate
  • 跨 Vector Store 提供商的可移植 API,包括一种新颖的类似 SQL 的元数据过滤器 API。
  • 工具/函数调用 - 允许模型请求执行客户端工具和函数,从而根据需要访问必要的实时信息。
  • 可观察性 - 提供对 AI 相关作的见解。
  • 用于数据工程的文档注入 ETL 框架。
  • AI 模型评估 - 帮助评估生成的内容并防止幻觉响应的实用程序。
  • ChatClient API - 用于与 AI 聊天模型通信的 Fluent API,惯用性类似于 WebClient 和 RestClient API。
  • Advisors API - 封装重复的生成式 AI 模式,转换发送到和传出语言模型 (LLM) 的数据,并提供跨各种模型和用例的可移植性。
  • 支持 Chat Conversation Memory and Retrieval Augmented Generation (RAG)。
  • Spring Boot 所有 AI 模型和向量存储的自动配置和启动器 - 使用 start.spring.io 选择所需的模型或向量存储。

上述内容摘自:Spring Ai 官网。

1.1 大模型专业名字介绍

1.1.1 RAG(检索增强生成)

在这里插入图片描述

大致思路:假如有个智能客服,它会优先去查询向量数据中数据,将查到的相关数据给 prompt对象 ,然后通过大模型响应给应用程序。

RAG 的基本原理

RAG 主要由 两个阶段 组成:

  1. 检索阶段(Retrieval)

    • 在生成文本之前,模型会从一个 外部知识库(如向量数据库、文档集合等)检索出相关的信息。
    • 这种检索通常使用 向量搜索(如 FAISS、Milvus)或基于搜索引擎(如 Elasticsearch)。
  2. 生成阶段(Generation)

    • 结合检索到的内容,大语言模型(如 GPT、LLaMA)使用这些外部信息来生成更准确、符合事实的回答。
    • 这种方式可以减少幻觉(hallucination),让生成的内容更加可信。
RAG 的关键技术

向量数据库

  • 用于存储和检索文本嵌入(text embeddings)。
  • 常见的向量数据库:
    • FAISS(Facebook AI Similarity Search)
    • Milvus
    • Pinecone
    • Weaviate

文本嵌入(Embedding)

  • 使用模型(如 OpenAI Embeddings、BERT、Sentence-BERT)将文本转换为向量,便于相似度搜索。

检索策略

  • 稠密检索(Dense Retrieval):基于神经网络(如 DPR、ColBERT),效果更优,但计算成本较高。
  • 稀疏检索(Sparse Retrieval):如 BM25,传统的基于关键词的检索方法。
RAG 的优势
  • 减少幻觉:模型基于真实检索到的内容生成回答,降低胡编乱造的概率。
  • 增强知识:即使预训练数据缺乏某些信息,模型仍可动态检索外部知识库。
  • 实时更新:相比 LLM 需要重新训练,RAG 只需更新知识库,适用于动态领域(如法律、医学等)。
  • 更精准回答:相比纯 LLM,RAG 结合检索数据,可提供更精确的参考来源。
RAG 的应用场景
  • 智能问答系统(如企业知识库问答、金融/法律咨询)
  • 代码自动补全(检索 GitHub 代码库,提高准确性)
  • 医疗辅助诊断(结合医学文献,提高生成答案的专业性)
  • 法律法规检索(查询法律条文,生成更符合规范的解读)
  • 客服机器人(实时检索 FAQ,提升客服效率)

1.1.2 fine-tuning(微调)

在这里插入图片描述

1.1.3 function-call(函数调用)

在这里插入图片描述

1.2 创建简单的Spring Ai项目

官方提示:Spring AI 支持 Spring Boot 3.2.x 和 3.3.x

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二.Spring Ai简单的智能应用

(延续使用1.2中创建的Spring Ai 应用。)

2.1 智能提问实现

【yml配置】

spring:
  ai:
    openai:
      api-key: you_api_key
      base-url: 你的api_key的请求路径
      chat:
        options:
          model: gpt-3.5-turbo  # 调用的哪个模型名称

由于调用 的是国外的open ai 大模型,需要“魔法”,所以我这里搞了中转站,请求中转站的 api-key和base-url,具体的做法 淘宝 搜 open api key

【controller】

package com.hz.controller;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: weiyi
 * @Description:
 * @Date 2025/2/28 21:24
 * @ClassName AiController
 * @Version 1.0
 */

@RestController
@RequestMapping("/ai")
public class AiController {


    //智能对话的客户端
    private final ChatClient chatClient;

    public AiController(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder.build();
    }

    @GetMapping("/ai01")
    public String generation(
            @RequestParam(value = "message", 
                          defaultValue = "给我讲个笑话")
            String message) {
      
        return this.chatClient.prompt()  // prompt:提示词
                .user(message) // message:用户输入的信息
                .call() // 调用大模型 远程请求大模型
                .content(); // 获取大模型的返回结果
    }
}

上述代码是 参考的spring Ai 官方文档

在这里插入图片描述

【测试】

http://localhost:8080/ai/ai01?message=列出spring中的重点概念

在这里插入图片描述

这个场景模拟的是在大模型如deepseek等对话窗口的提问。

2.2 角色预设

假如你希望是一个特定场景下的智能体对话,可以进行角色预设。

在项目中的config包中创建AiConfig配置类

/**
 * @Author: weiyi
 * @Description:
 * @Date 2025/2/28 21:40
 * @ClassName AiConfig
 * @Version 1.0
 */
@Configuration
public class AiConfig {

    @Bean
    ChatClient chatClient(ChatClient.Builder builder) {
        return builder
                .defaultSystem("你现在不是 chat gpt 了," +
                        "你是一个精通古代诗人的智能助手,有个诗人叫维一,知识渊博")
                .build();

    }

}

【修改controller】

在这里插入图片描述

/**
 * @Author: weiyi
 * @Description:
 * @Date 2025/2/28 21:24
 * @ClassName AiController
 * @Version 1.0
 */

@RestController
@RequestMapping("/ai")
public class AiController {

    //智能对话的客户端
    @Autowired
    private  ChatClient chatClient;

    // public AiController(ChatClient.Builder chatClientBuilder) {
    //     this.chatClient = chatClientBuilder.build();
    // }

    @GetMapping("/ai01")
    public String generation(
            @RequestParam(value = "message", defaultValue = "给我讲个笑话")
            String message) {
        // prompt:提示词
        return this.chatClient.prompt()
                .user(message) // message:用户输入的信息
                .call() // 调用大模型 远程请求大模型
                .content(); // 获取大模型的返回结果
    }
}

测试

在这里插入图片描述

2.3 流式响应

通俗点说流式响应就是将生成的文本内容一个字一个字的显示出来。

/**
     * @description: 流式响应
     * @author: weiyi
     * @date: 2025/3/1 19:08
     * @param: [message]
     * @return: reactor.core.publisher.Flux<java.lang.String>
     **/
    @GetMapping(value = "/ai02", 
                produces = "text/html;charset=utf-8")
    public Flux<String> generation02(String message){
        Flux<String> output = chatClient.prompt()
                .user(message)
                .stream()
                .content();
        return output;
    }

如果不设置 produces = “text/html;charset=utf-8” 输出内容会出现中文乱码。

在这里插入图片描述

2.4 ChatClient和ChatMode区别

ChatClient Api 里是大模型通用的功能。

ChatMode Api 是大模型特有功能。假如用deepseek特有的模型功能需要用ChatMode Api

在这里插入图片描述

如:用open ai 下模型:

在这里插入图片描述


 @Autowired
 private ChatModel chatModel;

@GetMapping(value = "/ai03", 
            produces = "text/html;charset=utf-8")
    public String generation03(
      @RequestParam(value = "message",
            defaultValue = "给我讲个笑话") String message){
        ChatResponse response = chatModel.call(
                new Prompt(
                        message, // new UserMessage(message)
                        OpenAiChatOptions.builder()
                                .model("gpt-3.5-turbo")
                                .temperature(0.4)//让生成文字更有温度
                                .build()
                ));
        //等同于 .content
        return response.getResult().getOutput().getText();
    }

在这里插入图片描述

2.5 文生图

在这里插入图片描述


@GetMapping(value = "/ai05")
    public String generation05(
      @RequestParam(value = "message",
            defaultValue = "画个猫") String message) {
        ImageResponse response = openaiImageModel.call(
                new ImagePrompt(message, // 图片提示词
                        OpenAiImageOptions.builder()
                                .quality("hd") // 图片质量
                                .withModel(OpenAiImageApi.DEFAULT_IMAGE_MODEL)
                                .N(1) // 生成图片数量
                                .height(1024)
                                .width(1024).build())

        );
        return response.getResult().getOutput().getUrl();
    }

会生成图片的url地址:

在这里插入图片描述

将生成的图片地址粘贴浏览器地址栏:

在这里插入图片描述

2.6 文生语音

持续待更新…

2.7 语音翻译

持续待更新…

2.8 多模态

持续待更新…

2.9 function-call请求

持续待更新…

持续待更新…

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

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

相关文章

OpenHarmony启动系统-U-Boot简介和源码下载与编译

OpenHarmony系统启动流程简述 设备上电后&#xff0c;OpenHarmony系统大致经历以下3个阶段&#xff1a; 1.BootRom代码引导加载UBoot&#xff1b; 2.UBoot启动初始化硬件资源&#xff0c;引导并加载系统内核(Linux内核)&#xff1b; 3.Kernel(LiteOs,Linux内核)启动、加载驱动…

Metal 学习笔记六:坐标空间

要在网格上轻松找到一个点&#xff0c;您需要一个坐标系。例如&#xff0c;如果网格恰好是您的 iPhone 15 屏幕&#xff0c;则中心点可能是 x&#xff1a;197、y&#xff1a;426。但是&#xff0c;该点可能会有所不同&#xff0c;具体取决于它所处的空间。 在上一章中&#xf…

Java测试框架Mockito快速入门

Mockito结合TestNG快速入门 什么是Mockito Mockito 是一个专门用于 Java 的强大测试框架&#xff0c;主要用来创建和管理模拟对象&#xff0c;辅助开发者进行单元测试&#xff0c;具有以下特点和功能&#xff1a; 创建模拟对象&#xff1a;能通过简洁的语法创建类或接口的模…

LabVIEW 无法播放 AVI 视频的编解码器解决方案

用户在 LabVIEW 中使用示例程序 Read AVI File.vi&#xff08;路径&#xff1a; &#x1f4cc; C:\Program Files (x86)\National Instruments\LabVIEW 2019\examples\Vision\Files\Read AVI File.vi&#xff09;时发现&#xff1a; ✅ LabVIEW 自带的 AVI 视频可正常播放 这是…

AI编程界的集大成者——通义灵码AI程序员

一、引言 随着软件行业的快速发展和技术的进步&#xff0c;人工智能&#xff08;AI&#xff09;正在成为软件开发领域的一个重要组成部分。近年来&#xff0c;越来越多的AI辅助工具被引入到开发流程中&#xff0c;旨在提高效率、减少错误并加速创新。在这样的背景下&#xff0…

第三十三:6.3. 【mitt】 任意组件通讯

概述&#xff1a;与消息订阅与发布&#xff08;pubsub&#xff09;功能类似&#xff0c;可以实现任意组件间通信。 // 引入mitt import mitt from "mitt";// 创建emitter const emitter mitt()/*// 绑定事件emitter.on(abc,(value)>{console.log(abc事件被触发,…

6.7 数据库设计

文章目录 数据库设计6个阶段新奥尔良法完整导图 数据库设计6个阶段 数据库设计是指&#xff0c;根据应用环境&#xff0c;构造数据库模式&#xff0c;建立数据库、应用系统&#xff0c;实现有效地数据存储&#xff0c;以满足用户需求。 数据库设计过程包含6个阶段 数据库规划&…

Java 大视界 -- Java 大数据在智能安防入侵检测与行为分析中的应用(108)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

Vue3实现文件上传、下载及预览全流程详解(含完整接口调用)

文章目录 一、环境准备1.1 创建Vue3项目1.2 安装依赖1.3 配置Element Plus 二、文件上传实现2.1 基础上传组件2.2 自定义上传逻辑&#xff08;Axios实现&#xff09; 三、文件下载实现3.1 直接下载&#xff08;已知文件URL&#xff09;3.2 后端接口下载&#xff08;二进制流&am…

【云原生】SpringCloud-Spring Boot Starter使用测试

目录 Spring Boot Starter是什么&#xff1f; 以前传统的做法 使用 Spring Boot Starter 之后 starter 的理念&#xff1a; starter 的实现&#xff1a; ?创建Spring Boot Starter步骤 在idea新建一个starter项目、直接执行下一步即可生成项目。 ?在xml中加入如下配置…

介绍下pdf打印工具类 JasperPrint

JasperPrint 工具类深度解析 JasperPrint 是 JasperReports 框架中实现 PDF 打印的核心载体类&#xff0c;其本质是 填充数据后的可打印报表对象&#xff0c;承担着从模板编译、数据填充到格式输出的全流程控制。以下从 7 个维度展开深度解析&#xff1a; 一、核心定位与生命周…

idea中或pycharm中编写Markdown文件

参考 ltjt_aiseek: seek_backend_py 项目 数智科技ai探索API接口开发 1. 安装 Django 框架 在开始创建 Django 项目之前&#xff0c;需要先安装 Django 框架。可以通过 PyCharm 的终端或者系统的命令行工具来完成安装。 使用 PyCharm 终端安装 打开 PyCharm&#xff0c;如果…

Go红队开发—并发编程

文章目录 并发编程go协程chan通道无缓冲通道有缓冲通道创建⽆缓冲和缓冲通道 等协程sync.WaitGroup同步Runtime包Gosched()Goexit() 区别 同步变量sync.Mutex互斥锁atomic原子变量 SelectTicker定时器控制并发数量核心机制 并发编程阶段练习重要的细节端口扫描股票监控 并发编程…

使用自动化运维工具 Ansible 集中化管理服务器

一、概述 Ansible 是一款为类 Unix 系统开发的自由开源的配置和自动化工具 官方网站:https://www.ansible.com/ Ansible 成立于 2013 年,总部设在北卡罗来纳州达勒姆,联合创始人 ad Ziouani 和高级副总裁 Todd Barr都是红帽的老员工。Ansible 旗下的开源软件 Ansible 十分…

数据集笔记:新加坡 一些交通的时间序列统计量

1 机动车年度保有量 data.gov.sg 各类机动车年度保有量 数据范围&#xff1a;2005年1月 - 2020年12月 1.1 数据说明 非高峰时段车辆 包括周末车&#xff08;Weekend Cars&#xff09;和 修订版非高峰时段车辆&#xff08;Revised Off Peak Cars&#xff09;&#xff0c;该…

【FL0090】基于SSM和微信小程序的球馆预约系统

&#x1f9d1;‍&#x1f4bb;博主介绍&#x1f9d1;‍&#x1f4bb; 全网粉丝10W,CSDN全栈领域优质创作者&#xff0c;博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战&#xff0c;以及程序定制化开发…

智能图像处理平台:图像处理配置类

这里我们先修改一下依赖&#xff0c;不用JavaCV&#xff0c;用openCV。 导入依赖&#xff1a; <!-- JavaCV 依赖&#xff0c;用于图像和视频处理 --> <!-- <dependency>--> <!-- <groupId>org.bytedeco</groupId>--> &l…

一周一个Unity小游戏2D反弹球游戏 - 球板的发球

前言 本文将实现当游戏开始时球在球板上,且不具备物理性,在Windows平台上通过点击屏幕来球发射,安卓平台上当手指触摸到屏幕上时进行发球,并此时开始具备物理性。 发球逻辑 首先在球板上创建一个球的发射点,新建一个空的游戏物体,并命名为BallPoint,并将其作为SpringBoa…

012 rocketmq事务消息

文章目录 事务消息概念介绍交互流程事务消息原理TransactionListener接⼝TransactionProducer.javaTransactionConsumer.java 事务消息 内置topic中的消息对消费者不可见 本地事务mq消息事务消息 消息队列 RocketMQ 版提供的分布式事务消息适⽤于所有对数据最终⼀致性有强需求…

SpringBoot原理-02.自动配置-概述

一.自动配置 所谓自动配置&#xff0c;就是Spring容器启动后&#xff0c;一些配置类、bean对象就自动存入了IOC容器当中&#xff0c;而不需要我们手动声明&#xff0c;直接从IOC容器中引入即可。省去了繁琐的配置操作。 我们可以首先将spring项目启动起来&#xff0c;里面有一…