当前位置: 首页 > news >正文

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学习通!如果这篇文章在你的技术成长路上留下了印记:
    👁️     【关注】与我一起探索技术的无限可能,见证每一次突破
    👍     【点赞】为优质技术内容点亮明灯,传递知识的力量
    🔖     【收藏】将精华内容珍藏,随时回顾技术要点
    💬     【评论】分享你的独特见解,让思维碰撞出智慧火花
    🗳️    【投票】用你的选择为技术社区贡献一份力量
    技术路漫漫,让我们携手前行,在代码的世界里摘取属于程序员的那片星辰大海!

    http://www.dtcms.com/a/511046.html

    相关文章:

  • MFE: React + Angular 混合demo
  • CR0 控制位解释
  • 半成品网站周村网站制作哪家好
  • 自然语言处理NLP的数据预处理:从原始文本到模型输入(MindSpore版)
  • 清空显存占用
  • UNTER++模型简介
  • PHP Error 处理指南
  • Linux学习笔记(十)--进程替换与创建一个自己的简易版shell
  • go语言实现 基于 Session 和 Redis 实现短信验证码登录
  • 福建网站建设制作阿里巴巴旗下跨境电商平台有哪些
  • 潇洒郎:最佳完美——Windows防火墙与端口管理工具——支持ipv6、ipv4端口转发管理
  • Elastic MCP 服务器:向任何 AI agent 暴露 Agent Builder 工具
  • 小说网站建设详细流程游戏开发有前途吗
  • echarts tooltip数据太长导致显示不全
  • 用户选剧情,AI写故事:Trae Solo+GLM-4.6实现沉浸式小说创作体验
  • 【Linux】初始Linux和Linux下基本指令:ls pwd cd touch mkdir rmdir rm 指令
  • 《Linux系统编程之入门基础》【Linux基础 理论+命令】(下)
  • 农业网站建设招标书网站导航条内容
  • LLAMA Factory 微调Qwen2.0-VL-2B视觉大模型
  • 婚纱网站建设案例wordpress默认主题twenty
  • 网站访问者qq企业网站备案名称窍门
  • 个人网站源码下载有口皆碑的域名备案加急
  • 农用地转建设用地结果查询网站苏州品牌网站设计
  • 做外贸的网站怎么建立wordpress建网站主页
  • 建设部网站中天人建筑工程有限公司网站设计是怎么做的
  • 网站建设管理工作经验介绍建美食网站有哪些原因
  • 电子商务网站后台功能wordpress thesis 开发
  • 自已做的网站怎么做域名解析沐众科技网站建设
  • 一款app开发需要多少钱郑州seo网络营销技术
  • 做动漫的网站合肥seo公司