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

该文章已生成可运行项目,

一.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 提供以下功能:

上述内容摘自: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简单的智能应用

(延续使用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 文生图(gpt-4模型和deepseek-r1模型)

在这里插入图片描述
在这里插入图片描述

spring:
  ai:
    openai:
      api-key: xxxxx
      base-url: xxxxxx
      chat:
        options:
          model: gpt-4-32k

@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地址:

在这里插入图片描述

将生成的图片地址粘贴浏览器地址栏:
(这是调用gpt4模型生成的)
在这里插入图片描述
【换成deepseek-r1模型】
☞deepseek官网文档
在这里插入图片描述

在这里插入图片描述
这是调用deepseek-r1模型生成。
在这里插入图片描述

2.6 文生语音

持续待更新…

2.7 语音翻译

持续待更新…

2.8 多模态

持续待更新…

2.9 function-call请求

持续待更新…

持续待更新…

本文章已经生成可运行项目
### Spring Boot AI Integration or Implementation Spring BootAI 集成或实现主要依赖于扩展模块和第三方库的支持。以下是对如何在 Spring Boot 中实现 AI 功能的详细说明: #### 1. 使用 Spring Cloud Alibaba AI Spring Cloud Alibaba 提供了对 AI 应用的支持,例如聊天对话、文生图、文生语音等功能[^4]。这些功能可以通过集成 Spring Boot Starter 模块来快速实现。例如,`spring-ai-starter-mcp-client` 提供了工具回调的自动配置功能[^5]。 - **McpToolCallbackAutoConfiguration**:当 `spring.ai.mcp.client.enabled` 和 `spring.ai.mcp.client.toolcallback.enabled` 均为 `true` 时,会根据 `List<McpSyncClient>` 创建同步或异步的工具回调提供者。 - **代码示例**: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class AiApplication { public static void main(String[] args) { SpringApplication.run(AiApplication.class, args); } } ``` #### 2. 配置文件支持 为了启用 AI 功能,需要在 `application.yml` 或 `application.properties` 文件中添加相关配置。例如: ```yaml spring: ai: mcp: client: enabled: true toolcallback: enabled: true ``` 上述配置确保了 `McpToolCallbackAutoConfiguration` 的生效[^5]。 #### 3. 测试与模拟 在测试阶段,可以使用 `@SpringBootTest` 注解加载完整的 Spring Boot 上下文环境,并验证 AI 功能是否正常工作[^1]。此外,推荐使用 `@MockitoBean` 替代已弃用的 `@MockBean` 注解进行单元测试[^3]。 #### 4. 引入依赖 为了实现 AI 功能,需要在项目的 `pom.xml` 文件中引入相关依赖。例如: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-ai</artifactId> <version>最新版本号</version> </dependency> ``` 此外,还可以根据需求引入其他 Starter 模块,如 `spring-boot-starter-web` 或 `spring-boot-starter-webflux`[^2]。 #### 5. 示例应用 以下是一个简单AI 应用示例,展示如何通过 Prompt Template 实现文本生成功能: ```java import com.alibaba.cloud.ai.prompt.PromptTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class AiController { @Autowired private PromptTemplate promptTemplate; @GetMapping("/generate") public String generateText(@RequestParam String input) { return promptTemplate.apply(input); } } ``` ### 注意事项 - 确保项目中引入的依赖版本兼容。 - 测试时需注意弃用注解的影响,并及时更新代码逻辑[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔚一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值