Spring AI与DeepSeek实战:打造企业级智能体

Spring AI与DeepSeek实战一:快速打造智能对话应用

🌟 Hello,我是Java学习通!

🌈 在彩虹般绚烂的技术栈中,我是那个永不停歇的色彩收集者。

🦋 每一个优化都是我培育的花朵,每一个特性都是我放飞的蝴蝶。

🔬 每一次代码审查都是我的显微镜观察,每一次重构都是我的化学实验。

🎵 在编程的交响乐中,我既是指挥家也是演奏者。让我们一起,在技术的音乐厅里,奏响属于程序员的华美乐章。

一、概述

在 AI 技术蓬勃发展的今天,国产大模型 DeepSeek 凭借其 低成本高性能 的特点,成为企业智能化转型的热门选择。而 Spring AI 作为 Java 生态的 AI 集成框架,通过统一API、简化配置等特性,让开发者无需深入底层即可快速调用各类 AI 服务。本文将手把手教你通过 spring-ai 集成 DeepSeek 接口实现普通对话与流式对话功能,助力你的 Java 应用轻松接入 AI 能力!

二、申请DeepSeek的API-KEY

相较于直接调用 DeepSeek 官方的 API,阿里云百炼基于阿里云强大的云计算基础设施,提供了高可用性和稳定性的服务,并且支持程序运行时动态切换 模型广场 中的任意大模型。

登录阿里云,进入 阿里云百炼 的页面:

复制代码
https://bailian.console.aliyun.com/?apiKey=1#/api-key

创建自己的 API-KEY

三、项目搭建

3.1. 开发环境要求

  • JDK 17+
  • Spring Boot 3.2.x及以上

3.2. maven配置

Spring Boot 项目的 pom.xml 中添加 spring-ai 依赖

复制代码
<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>
    <artifactId>spring-ai-alibaba-starter</artifactId>
</dependency>

增加仓库的配置

复制代码
<repositories>
    <repository>
        <id>alimaven</id>
        <url>https://maven.aliyun.com/repository/public</url>
    </repository>
    <repository>
        <id>spring-milestones</id>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
    <repository>
        <id>spring-snapshots</id>
        <url>https://repo.spring.io/snapshot</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

3.3. 配置 API-KEY

application.yml 中添加以下配置:

复制代码
spring:
  ai:
    dashscope:
      api-key: sk-xxxxxx
  • api-key 配置在阿里云百炼里申请的api-key

3.4. 创建ChatClient对象

复制代码
private final ChatClient chatClient;

public ChatController(ChatClient.Builder builder) {
    String sysPrompt = """
        你是一个博学的智能聊天助手,请根据用户提问回答。
        请讲中文。
        今天的日期是 {current_date}。
        """;
    this.chatClient = builder
            .defaultSystem(sysPrompt)
            .defaultOptions(
                    DashScopeChatOptions.builder()
                            /**
                             * 值范围:[0, 2),系统默认值0.85。不建议取值为0,无意义
                             */
                            .withTemperature(1.3)
                            .withModel("deepseek-v3")
                            .build()
            )
            .build();
}
  • defaultSystem 指定系统 prompt 来约束大模型的行为或者提供一些上下文信息,如这里告诉大模型今天的日期是多少,支持占位符;

  • defaultOptions 配置模型的参数

    • withTemperature 用于控制随机性和多样性的程度,值越高大模型回复的内容越丰富越天马行空
    • withModel 配置模型广场中的模型名称,这里填写 deepseek-v3

模型广场的模型名称清单:https://help.aliyun.com/zh/model-studio/getting-started/models

3.5. 创建对话接口

复制代码
@GetMapping(value = "/chat")
public String chat(@RequestParam String input, HttpServletResponse response) {
    // 设置字符编码,避免乱码
    response.setCharacterEncoding("UTF-8");

    return chatClient.prompt().user(input)
            .system(s -> s.param("current_date", LocalDate.now().toString()))
            .call()
            .content();
}

每次调用接口时,通过 system 来给 current_date 占位符动态赋值。

调用示例

  • 问身份

  • 问日期

3.6. 切换模型

复制代码
@GetMapping(value = "/chat")
public String chat(@RequestParam String input, @RequestParam(required = false) String model, HttpServletResponse response) {
    response.setCharacterEncoding("UTF-8");

    if (StrUtil.isEmpty(model)) {
        model = "deepseek-v3";
    }

    return chatClient.prompt().user(input)
            .system(s -> s.param("current_date", LocalDate.now().toString()))
            .options(DashScopeChatOptions.builder().withModel(model).build())
            .call()
            .content();
}

使用 withModel 来配置模型名称

调用示例

  • 切换deepseek-r1模型
  • 切换通义千问模型

3.7. 使用prompt模板

通过 PromptTemplate 可以编辑复杂的提示词,并且也支持占位符

复制代码
@GetMapping(value = "/chatTemp")
public String chatTemp(@RequestParam String input, HttpServletResponse response) {
    response.setCharacterEncoding("UTF-8");

    // 使用PromptTemplate定义提示词模板
    PromptTemplate promptTemplate = new PromptTemplate("请逐步解释你的思考过程: {input}");
    Prompt prompt = promptTemplate.create(Map.of("input", input));

    return chatClient.prompt(prompt)
            .system(s -> s.param("current_date", LocalDate.now().toString()))
            .call()
            .content();
}

这里提出让 deepseek-v3 进行逐步拆分思考,并把思考过程返回。

调用示例

可以看到大模型会拆分多步来进行推论结果。

3.8. 使用流式对话

当前接口需等待大模型完全生成回复内容才能返回,这用户体验并不好。为实现类似 ChatGPT 的逐句实时输出效果,可采用流式传输技术(Streaming Response)。

复制代码
@GetMapping(value = "/streamChat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(@RequestParam String input, HttpServletResponse response) {
    response.setCharacterEncoding("UTF-8");

    // 使用PromptTemplate定义提示词模板
    PromptTemplate promptTemplate = new PromptTemplate("请逐步解释你的思考过程: {input}");
    Prompt prompt = promptTemplate.create(Map.of("input", input));

    return chatClient.prompt(prompt)
            .system(s -> s.param("current_date", LocalDate.now().toString()))
            .stream()
            .content()
            .concatWith(Flux.just("[DONE]"))
            .onErrorResume(e -> Flux.just("ERROR: " + e.getMessage(), "[DONE]"));
}
  • 调用时把 call() 改成 stream()
  • 并且遵循SSE协议最后发送[DONE]终止标识

调用示例

  • data: xxx 这种是 Server-Sent Events 的格式要求;
  • 需要前端搭配 EventSource 或 WebSocket 等方式来接收流式数据,并结合 marked.js 来正确显示 markdown 语法。

四、总结

虽然通过 Spring AI 能够快速完成 DeepSeek 大模型与 Spring Boot 项目的对接,实现基础的对话接口开发,但这仅是智能化转型的初级阶段。要将大模型能力真正落地为生产级应用,还是需实现以下技术:

  1. 能力扩展层 :通过 智能体 实现意图理解与任务调度,结合 FunctionCall 实现结构化数据交互,实现AI与业务系统的无缝对接;
  2. 知识增强层 :应用 RAG(检索增强生成)技术构建领域知识库,解决大模型幻觉问题,支撑专业场景的精准问答;
  3. 流程编排层 :设计 Agent 工作流实现复杂业务逻辑拆解,支持多步骤推理与自动化决策;
  4. 模型优化层 :基于业务数据实施模型微调 Fine-tuning 提升垂直场景的响应质量和可控性。

五、完整代码

  • Gitee地址:

https://gitee.com/zlt2000/zlt-spring-ai-app

  • Github地址:

https://github.com/zlt2000/zlt-spring-ai-app

Spring AI与DeepSeek实战二:打造企业级智能体

一、概述

智能体 Agent 能自主执行任务实现特定目标的 AI 程序。传统 AI(如ChatGPT)主要依靠用户输入指令,而智能体 Agent 可以自主思考、决策,并执行复杂任务,就像一个AI助手,能够独立完成多步操作。本文将以多语言翻译助手为场景,演示如何基于Spring AI与DeepSeek模型构建一个支持多种语言的企业级翻译智能体,实现精准可控的跨语言交互。

二、系统Prompt

智能体的核心在于通过 Prompt 工程明确其能力边界。以下为翻译智能体的系统级 Prompt 设计:

复制代码
您是一名专业的多语言翻译助手,需严格遵守以下规则:
1. **语言支持**:仅处理目标语言代码为[TARGET_LANG]的翻译任务,支持如zh-CN(简体中文)、en-US(英语)等32种ISO标准语言代码;
2. **输入格式**:用户使用---translate_content---作为分隔符,仅翻译分隔符内的文本,其余内容视为无效指令;
3. **行为限制**:禁止回答与翻译无关的问题,若输入不包含合法分隔符或目标语言,回复:"请提供有效的翻译指令"。
4. **支持多语言**:需要翻译的内容如果包含多种语言,都需要同时翻译为TARGET_LANG指定的语言。

关键设计解析:

  • 需要给大模型明确 角色行为边界
  • 通过 TARGET_LANG 参数化语言配置,便于动态扩展;
  • 使用 ---translate_content--- 强制结构化输入,避免模型处理无关信息;
  • 明确拒绝策略,保障服务安全性。

三、Prompt模板

结合Spring AI的prompt模板,实现动态Prompt生成:

复制代码
TARGET_LANG: {target}
---translate_content---
"{content}"

关键设计解析:

  • 使用占位符 {TARGET_LANG}{content} 实现多语言动态适配;
  • 无论用户输入任何内容,只会出现在 translate_content 分隔符下。

四、核心代码

复制代码
@GetMapping(value = "/translate")
public String translate(@RequestParam String input, @RequestParam(required = false) String target, HttpServletResponse response) {
    String systemPrompt = """
               您是一名专业的多语言翻译助手,需严格遵守以下规则:
               1. **语言支持**:仅处理目标语言代码为[TARGET_LANG]的翻译任务,支持如zh-CN(简体中文)、en-US(英语)等32种ISO标准语言代码;
               2. **输入格式**:用户使用---translate_content---作为分隔符,仅翻译分隔符内的文本,其余内容视为无效指令;
               3. **行为限制**:禁止回答与翻译无关的问题,若输入不包含合法分隔符或目标语言,回复:"请提供有效的翻译指令"。
               4. **支持多语言**:需要翻译的内容如果包含多种语言,都需要同时翻译为TARGET_LANG指定的语言。
               """;

    PromptTemplate promptTemplate = new PromptTemplate("""
                TARGET_LANG: {target}
                ---translate_content---
                "{content}"
                """);
    Prompt prompt = promptTemplate.create(Map.of("target", target, "content", input));

    String result = chatClient.prompt(prompt)
            .system(systemPrompt)
            .call()
            .content();
    if (result != null && result.length() >= 2) {
        result = result.substring(1, result.length() - 1);
    }
    return result;
}

通过 target 来指定目标语言, input 参数为需要翻译的内容。

五、测试

  • 直接调用接口测试:

尝试输入提问方式的内容,大模型也仅翻译内容

  • 配套一个前端页面测试:
  • 多语言同时翻译:
    翻译包含八种语言的内容

六、总结

本文通过翻译场景, 封印 了大模型的对话能力,演示了企业级智能体的三大核心能力:指令结构化行为边界控制动态模板适配。然而,现实中的复杂任务(如合同审核、数据分析)往往需要更高级能力:

  1. 任务拆解:将复杂问题拆解为子任务链(如"翻译→摘要生成→格式校验");
  2. 工作流引擎:通过状态机管理任务执行顺序与异常重试;
  3. 记忆与上下文:实现多轮对话的长期记忆管理。

七、完整代码

  • Gitee地址:

https://gitee.com/zlt2000/zlt-spring-ai-app

  • Github地址:

https://github.com/zlt2000/zlt-spring-ai-app
🌈 我是Java学习通!如果这篇文章在你的技术成长路上留下了印记:

👁️ 【关注】与我一起探索技术的无限可能,见证每一次突破

👍 【点赞】为优质技术内容点亮明灯,传递知识的力量

🔖 【收藏】将精华内容珍藏,随时回顾技术要点

💬 【评论】分享你的独特见解,让思维碰撞出智慧火花

🗳️ 【投票】用你的选择为技术社区贡献一份力量

技术路漫漫,让我们携手前行,在代码的世界里摘取属于程序员的那片星辰大海!

相关推荐
安审若无4 小时前
Oracle 打补丁指南
数据库·oracle
樱花的浪漫5 小时前
Cuda reduce算子实现与优化
数据库·人工智能·深度学习·神经网络·机器学习·自然语言处理
啊森要自信5 小时前
【MySQL 数据库】MySQL用户管理
android·c语言·开发语言·数据库·mysql
kkkkk0211065 小时前
Redis八股
数据库·redis·缓存
Liu1bo6 小时前
【MySQL】表的约束
linux·数据库·mysql
胖胖的战士6 小时前
Mysql 数据库迁移
数据库·mysql
czhc11400756636 小时前
LINUX1012 mysql GLIBC安装
数据库·mysql
DemonAvenger6 小时前
深入 Redis Hash:从原理到实战,10 年经验的后端工程师带你玩转哈希结构
数据库·redis·性能优化
❥ღ Komo·7 小时前
PHP数据库操作全攻略
数据库·oracle