Spring AI 是一个专注于人工智能应用的开发框架,其核心目标是将 Spring 生态系统的设计理念—— 如可移植性与模块化设计,注入到人工智能领域,同时将传统 Java 开发中 “以普通 Java 对象(POJO)作为应用程序基础组件” 的设计范式引入 AI 开发领域,从而简化 AI 应用开发复杂度,提升开发效率。

新建一个Spring Boot工程,本文使用的是3.4.5

接着,在 pom.xml 文件中,添加 Spring AI 框架的 pom 依赖管理,它里面管理了所有 Spring AI 相关组件的版本号,后续直接添加依赖即可,无需单独指定具体版本号,能够确保组件版本之间不会存在兼容性问题:

<properties>
    <!-- JDK 版本 -->
    <java.version>21</java.version>
    <!-- Spring AI 版本 -->
    <spring-ai.version>1.0.0</spring-ai.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-bom</artifactId>
            <version>${spring-ai.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

添加 DeepSeek 模型依赖

添加完 Spring AI 的依赖管理后,咱们添加一个具体想对接的模型依赖,如 DeepSeek, 在 节点下,添加如下:

   <dependencies>
        // 省略...

        <!-- Deepseek 模型 -->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-model-deepseek</artifactId>
        </dependency>
    </dependencies>

最后启动项目,若控制台能够提示 DeepSeek API key must be set , 则表示 Spring AI 整合成功了。之所以报错,是因为 DeepSeek 还需配置请求的 API Key 值,才能对接大模型成功。

在这里插入图片描述

API Key 是一串唯一的密钥(类似密码),用于标识和授权你的应用程序访问特定的 AI 服务。通常情况下,每个 AI 服务提供商都会为注册用户生成独立的 API Key,通过它来:

  • 验证身份:确保请求来自合法用户。
  • 计费统计:根据 API 调用次数或资源消耗收费。
  • 权限控制:限制访问范围或频率。

申请 API Key

接下来,我们浏览器访问 DeepSeek 官网:https://www.deepseek.com/ , 来申请一下 Api Key。如下图所示,点击右上角的 “API 开放平台” , 进入管理后台后:

在这里插入图片描述
由于官方的 API 是收费的,为了能够测试,点击 “充值” 菜单,可以先充个 1 块钱。另外,如果你之前没使用过 DeepSeek 官方 API , 在充值页的上方,会提示你先去 “实名认证”,操作一下也很简单,输入姓名与身份证号就行:

在这里插入图片描述
实名认证完成后,点击左侧栏中的 “API Keys” 菜单,点击 “创建 API Key” 按钮,创建属于你的 Key 凭证,创建成功后,记得复制一下,等会需要用到

在这里插入图片描述

添加配置

回到后端项目中,编辑 application.yml 配置文件

spring:
  ai:
    deepseek:
      api-key: sk-xxx # 填写 DeepSeek Api Key, 改成你自己的
      base-url: https://api.deepseek.com # DeepSeek 的请求 URL, 可不填,默认值为 api.deepseek.com
      chat:
        options:
          model: deepseek-chat # 使用哪个模型
          temperature: 0.8 # 温度值

解释一下上述各项配置:

  • api-key : 填写刚刚申请的 DeepSeek Api Key;
  • base-url: 填写 DeepSeek 官方的 API 请求链接,可不填,默认值为 api.deepseek.com;
  • chat.options.models: 想要使用的模型名称,可访问 DeepSeek 官方文档:https://api-docs.deepseek.com/zh-cn/ ,来查看具体的模型名称:
    指定 model=‘deepseek-chat’ 即可调用 DeepSeek-V3 模型;
    指定 model=‘deepseek-reasoner’,即可调用 DeepSeek-R1 模型;
  • temperature: 在机器学习模型中,temperature 参数用于控制生成文本的随机性和创造性。
    值越低(接近 0),则表示输出更确定和保守,模型倾向于选择概率最高的词,适合需要准确性的场景;
    值越高(如 0.8 或更高), 增加随机性,生成内容更多样化、富有创造性;

配置完成后,重新启动项目,就会发现之前的报错已经不存在了。

实现对话效果

为了能够实现对话功能,先新建一个 /controller 包,如下图,并新建一个 DeepSeekChatController 对话控制器:

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

    @Resource
    private DeepSeekChatModel chatModel;

    /**
     * 普通对话
     * @param message
     * @return
     */
    @GetMapping("/generate")
    public String generate(@RequestParam(value = "message", defaultValue = "你是谁?") String message) {
        // 一次性返回结果
        return chatModel.call(message);
    }

}

解释一下上述代码中核心的地方:

首先,我们通过 @Resource 注解,注入了 DeepSeekChatModel 模型实例类,它封装了与 DeepSeek API 的交互逻辑;
@RequestParam:用于获取 URL 中参数的值:
value = “message”:获取对应参数名的值,比如请求链接是 /ai/generator?message=你好, 则获取到的值为 你好;
defaultValue:未传参数时的默认值;
chatModel.call(message) : 请求官方 DeepSeek,并携带上 message 中填写的问题;

重启项目,浏览器访问地址:http://localhost:8080/ai/generate?message=你是谁哇 , 测试一波刚刚添加的接口,是否能够实现与 DeepSeek 进行对话,message 中的值,填写你想要问的问题

经测试发现,等待一会后, 会一次性将结果返回,说明调用 DeepSeek 官方 API 成功了。

流式对话

我们在使用相关 AI 产品,进行提问时,回答的结果是流式输出的,并不是像上面这样,等待好一会,才一次性返回,使得交互上不太友好。

流式对话(Streaming Chat)是一种实时、分块传输对话内容的技术模式,其核心特点是 逐片段实时返回生成结果,而非等待整个内容生成完毕后一次性返回。

与非流式对话相比:
在这里插入图片描述
接下来, 我们编辑 DeepSeekChatController 控制器,另外添加一个 /ai/generateStream 接口,用于实现流式对话效果,代码如下:

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

    @Resource
    private DeepSeekChatModel chatModel;

    // 省略...

    /**
     * 流式对话
     * @param message
     * @return
     */
    @GetMapping(value = "/generateStream", produces = "text/html;charset=utf-8")
    public Flux<String> generateStream(@RequestParam(value = "message", defaultValue = "你是谁?") String message) {
        // 构建提示词
        Prompt prompt = new Prompt(new UserMessage(message));

        // 流式输出
        return chatModel.stream(prompt)
                .mapNotNull(chatResponse -> chatResponse.getResult().getOutput().getText());
    }
}

解释一下上述代码中,核心的地方:

produces = “text/html;charset=utf-8” :
text/html:告知客户端(浏览器/HTTP客户端)返回的是 HTML 格式文本;
charset=utf-8:字符集定义, 强制响应使用 UTF-8 编码,不然会出现中文乱码情况;
Prompt prompt = new Prompt(new UserMessage(message)): 构建提示词;
chatModel.stream() : 使用流式输出:
chatResponse.getResult().getOutput().getText() : 获取每个响应片段的文本内容,返回给前端;

重启后端项目,浏览器访问地址:http://localhost:8080/ai/generateStream?message=你是谁哦 , 测试一波流式输出结果,交互要友好多了。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐