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

【Spring AI】调用 DeepSeek 实现问答聊天

文章目录

  • 一、基础概念解析
    • 1.Spring AI 框架
    • 2.DeepSeek 模型
  • 二、开发环境搭建
    • 1.JDK 环境准备
    • 2.开发工具选择
  • 三、项目创建与依赖添加
    • 1.创建 Spring Boot 项目
    • 2.DeepSeek API
  • 四、代码编写实现调用
    • 1.创建问答服务类
    • 2.创建 Controller 类
    • 3.前端调用示例
  • 五、项目运行与调试

在人工智能交互应用愈发普及的今天,DeepSeek 作为高效的语言模型,具备出色的问答聊天能力。借助 Spring AI 框架,开发者能够轻松将 DeepSeek 集成到 Java 应用中。

一、基础概念解析

1.Spring AI 框架

Spring AI 是基于 Spring Boot 的开发框架,旨在降低 Java 开发者集成 AI 服务的门槛。它提供了标准化的编程接口和配置方式,支持接入多种 AI 模型与服务,无论是文本处理、图像识别还是智能对话功能,都能通过简洁的代码实现集成,极大提升了 AI 应用开发效率 。

2.DeepSeek 模型

DeepSeek 是一款先进的语言模型,通过大量文本数据训练,在自然语言理解和生成方面表现优异。它能够理解用户提问意图,并生成连贯、准确的回答,适用于智能客服、智能助手、在线问答等多种场景。在调用 DeepSeek 时,主要通过其 API 接口发送用户问题,并接收返回的答案数据。

二、开发环境搭建

1.JDK 环境准备

由于 Spring AI 基于 Java 开发,首先要确保系统安装了 Java Development Kit(JDK),推荐使用 JDK 11 及以上版本。可以从 Oracle 官网或 OpenJDK 官网下载对应操作系统的安装包。安装完成后,配置JAVA_HOME环境变量,在命令行中输入java -versionjavac -version,若能正确显示版本信息,说明 JDK 安装配置成功。

2.开发工具选择

建议使用 IntelliJ IDEA 作为开发工具,它对 Spring 项目有良好的支持,可方便地创建、运行和调试 Spring Boot 项目。当然,也可根据个人习惯选择 Eclipse 等其他 Java 开发工具,其核心功能均可满足项目开发需求。

三、项目创建与依赖添加

1.创建 Spring Boot 项目

打开 IntelliJ IDEA,通过 “Spring Initializr” 创建新的 Spring Boot 项目。在创建过程中,设置好项目的基本信息,如 Group、Artifact、Name 等。在依赖选择环节,务必勾选 “Spring Web” 依赖,用于后续创建 Web 服务,以实现通过 API 接口调用 DeepSeek;同时,添加 Spring AI 相关依赖。

对于使用 Maven 构建的项目,在pom.xml文件中添加以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ai</artifactId><version>{具体版本号}</version>
</dependency>

若使用 Gradle 构建项目,在build.gradle文件中添加如下依赖:

implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-ai:{具体版本号}'

具体的版本号可在 Maven 中央仓库或 Spring 官方文档中查询获取,确保使用稳定且兼容的版本。

2.DeepSeek API

要调用 DeepSeek 进行问答聊天,需要获取其 API 访问权限。前往 DeepSeek 官方平台申请 API Key,申请成功后,在 Spring Boot 项目的application.yml(或application.properties)配置文件中进行配置:

spring:ai:deepseek:api-key: {你的API密钥}base-url: {DeepSeek API基础地址}

{你的API密钥}替换为实际申请到的 API Key,{DeepSeek API基础地址}填写官方提供的 API 服务地址。如果 DeepSeek 支持自定义请求参数配置,如设置最大响应长度、温度参数等,也可在此文件中进行相应配置。

四、代码编写实现调用

1.创建问答服务类

在项目合适的包路径下,创建一个问答服务类,用于封装与 DeepSeek 交互的逻辑。示例代码如下:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;@Service
public class DeepSeekChatService {@Value("${spring.ai.deepseek.api-key}")private String apiKey;@Value("${spring.ai.deepseek.base-url}")private String baseUrl;private final RestTemplate restTemplate;public DeepSeekChatService(RestTemplate restTemplate) {this.restTemplate = restTemplate;}public String sendQuestion(String question) {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);headers.set("Authorization", "Bearer " + apiKey);String requestBody = "{\"question\": \"" + question + "\"}";HttpEntity<String> request = new HttpEntity<>(requestBody, headers);ResponseEntity<String> response = restTemplate.postForEntity(baseUrl, request, String.class);if (response.getStatusCode().is2xxSuccessful()) {// 解析返回数据获取答案,此处假设返回数据为JSON格式,包含"answer"字段// 实际需根据DeepSeek真实返回结构解析return extractAnswerFromResponse(response.getBody());}return "问答失败";}private String extractAnswerFromResponse(String responseBody) {// 实现具体的JSON解析逻辑,提取答案字段// 例如使用Jackson或Gson库解析return "";}
}

上述代码定义了DeepSeekChatService类,通过@Service注解将其声明为服务类。sendQuestion方法负责构建与 DeepSeek API 交互的请求,包括设置请求头(添加 API Key 进行认证)、构建请求体(包含用户问题),并使用RestTemplate发送 POST 请求。请求成功后,从返回数据中提取答案,不过实际应用中需要根据 DeepSeek 真实的返回数据结构,使用 JSON 解析库(如 Jackson、Gson)完成答案提取。

2.创建 Controller 类

创建 Controller 类用于接收前端请求,并调用问答服务类与 DeepSeek 交互,返回答案给前端。示例代码如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/chat")
public class ChatController {private final DeepSeekChatService deepSeekChatService;@Autowiredpublic ChatController(DeepSeekChatService deepSeekChatService) {this.deepSeekChatService = deepSeekChatService;}@PostMappingpublic ResponseEntity<String> chat(@RequestBody String question) {try {String answer = deepSeekChatService.sendQuestion(question);return new ResponseEntity<>(answer, HttpStatus.OK);} catch (Exception e) {return new ResponseEntity<>("问答异常", HttpStatus.INTERNAL_SERVER_ERROR);}}
}

ChatController类通过@RestController@RequestMapping注解配置为处理问答请求的控制器。chat方法接收前端传递的用户问题,调用DeepSeekChatServicesendQuestion方法获取答案,并将答案返回给前端。

3.前端调用示例

在项目的resources/static目录下,创建一个 HTML 文件,编写前端代码实现与后端交互,进行问答聊天:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Spring AI与DeepSeek问答聊天</title>
</head><body><input type="text" id="question" placeholder="输入你的问题"><button onclick="sendQuestion()">发送问题</button><div id="answer"></div><script>function sendQuestion() {const question = document.getElementById('question').value;fetch('/chat', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify(question)}).then(response => response.text()).then(data => {document.getElementById('answer').innerHTML = data;}).catch(error => {console.error('请求失败:', error);});}</script>
</body></html>

上述前端代码创建了一个输入框用于输入问题,一个按钮触发问题发送操作,答案将显示在页面的<div>标签中。通过fetch函数向后端发送 POST 请求,并处理后端返回的答案数据进行展示。

五、项目运行与调试

完成代码编写后,启动 Spring Boot 项目。在浏览器中打开前端 HTML 页面,在输入框中输入问题,点击 “发送问题” 按钮,观察是否能成功调用 DeepSeek 获取答案并显示在页面上。

通过以上步骤,我们能够使用 Spring AI 成功调用 DeepSeek 实现问答聊天功能。在实际应用中,我们还可对功能进一步拓展,如增加对话历史记录管理、优化答案展示样式、实现更复杂的交互逻辑等。

相关文章:

【Spring AI】调用 DeepSeek 实现问答聊天

文章目录 一、基础概念解析1.Spring AI 框架2.DeepSeek 模型 二、开发环境搭建1.JDK 环境准备2.开发工具选择 三、项目创建与依赖添加1.创建 Spring Boot 项目2.DeepSeek API 四、代码编写实现调用1.创建问答服务类2.创建 Controller 类3.前端调用示例 五、项目运行与调试 在人…...

Java消息队列与安全实战:谢飞机的烧饼摊故事

Java消息队列与安全实战&#xff1a;谢飞机的烧饼摊故事 第一轮&#xff1a;消息队列与缓存 面试官&#xff1a;谢飞机&#xff0c;Kafka和RabbitMQ在电商场景如何选型&#xff1f; 谢飞机&#xff1a;&#xff08;摸出烧饼&#xff09;Kafka适合订单日志处理&#xff0c;像…...

parquet :开源的列式存储文件格式

1. Parquet文件定义与核心概念 Parquet是一种开源的列式存储文件格式,由Twitter和Cloudera合作开发,2015年成为Apache顶级项目。其设计目标是为大数据分析提供高效存储和查询,主要特点包括: 列式存储:数据按列而非按行组织,相同数据类型集中存储,显著提升分析查询效率(…...

SpringBoot关于文件上传超出大小限制--设置了全局异常但是没有正常捕获的情况+捕获后没有正常响应返给前端

项目背景 一个档案管理系统&#xff0c;在上传比较大的文件时由于系统设置的文件大小受限导致文件上传不了&#xff0c;这时候设置的异常捕捉未能正常报错导致前端页面一直在转圈&#xff0c;实际上后端早已校验完成。 全局异常类设置的捕捉 添加了ControllerAdvice以及RestCon…...

【Go语言】Ebiten游戏库开发者文档 (v2.8.8)

1. 简介 欢迎来到 Ebiten (现已更名为 Ebitengine) 的世界&#xff01;Ebiten 是一个使用 Go 语言编写的开源、极其简洁的 2D 游戏库&#xff08;或称为游戏引擎&#xff09;。它由 Hajime Hoshi 发起并主要维护&#xff0c;旨在提供一套简单直观的 API&#xff0c;让开发者能…...

Spring Boot应用开发实战

Spring Boot应用开发实战&#xff1a;从零到生产级项目的深度指南 在当今Java生态中&#xff0c;Spring Boot已占据绝对主导地位——据统计&#xff0c;超过75%的新Java项目选择Spring Boot作为开发框架。本文将带您从零开始&#xff0c;深入探索Spring Boot的核心精髓&#xf…...

实验设计与分析(第6版,Montgomery著,傅珏生译) 第9章三水平和混合水平析因设计与分式析因设计9.5节思考题9.1 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第9章三水平和混合水平析因设计与分式析因设计9.5节思考题9.1 R语言解题。主要涉及方差分析。 YieldDesign <-expand.grid(A gl(3, 1, labels c("-", "0","…...

Pycharm 配置解释器

今天更新了一版pycharm&#xff0c;因为很久没有配置解释器了&#xff0c;发现一直失败。经过来回试了几次终于成功了&#xff0c;记录一下过程。 Step 1 Step 2 这里第二步一定要注意类型要选择python 而不是conda。 虽然我的解释器是conda 里面建立的一个环境。挺有意思的...

learn react course

从零开始构建 React 应用 – React 中文文档 弃用 Create React App 虽然 Create React App 让入门变得简单&#xff0c;但其存在的若干限制 使得构建高性能的生产级应用颇具挑战。理论上&#xff0c;我们可以通过将其逐步发展为 框架 的方式来解决这些问题。 然而&#xff…...

SQL进阶之旅 Day 11:复杂JOIN查询优化

【SQL进阶之旅 Day 11】复杂JOIN查询优化 在数据处理日益复杂的今天&#xff0c;JOIN操作作为SQL中最强大的功能之一&#xff0c;常常成为系统性能瓶颈。今天我们进入"SQL进阶之旅"系列的第11天&#xff0c;将深入探讨复杂JOIN查询的优化策略。通过本文学习&#xf…...

web第八次课后作业--分层解耦

一、分层 Controller&#xff1a;控制层。接收前端发送的请求&#xff0c;对请求进行处理&#xff0c;并响应数据。Service&#xff1a;业务逻辑层。处理具体的业务逻辑。Dao&#xff1a;数据访问层(Data Access Object)&#xff0c;也称为持久层。负责数据访问操作&#xff0…...

MySQL 事务深度解析:面试核心知识点与实战

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Java 中 MySQL 事务深度解析&#xff1a;面试…...

使用Redis作为缓存,提高MongoDB的读写速度

在现代Web应用中,随着数据量和访问量的增长,数据库性能常常成为系统瓶颈。MongoDB作为NoSQL数据库,虽然具备高扩展性和灵活性,但在某些读密集型场景下仍可能遇到性能问题。 本文将介绍如何使用Redis作为缓存层来显著提升MongoDB的读写性能,包括架构设计、详细设计、Pytho…...

【图片自动识别改名】识别图片中的文字并批量改名的工具,根据文字对图片批量改名,基于QT和腾讯OCR识别的实现方案

现在的工作单位经常搞一些意义不明的绩效工作&#xff0c;每个月都搞来一万多张图片让我们挨个打开对应图片上的名字进行改名操作以方便公司领导进行检查和搜索调阅&#xff0c;图片上面的内容有数字和文字&#xff0c;数字没有特殊意义不做识别&#xff0c;文字有手写的和手机…...

Kafka消息队列笔记

一、Kafka 核心架构 四大组件 Producer&#xff1a;发布消息到指定 Topic。 Consumer&#xff1a;订阅 Topic 并消费消息&#xff08;支持消费者组并行&#xff09;。 Broker&#xff1a;Kafka 服务器节点&#xff0c;存储消息&#xff0c;处理读写请求。 ZooKeeper/KRaft&a…...

机器人变量类型与配置

机器人变量类型与配置 机器人变量类型与配置知识 1. 变量类型 1.1 按创建位置分类 程序变量&#xff1a; 仅适用于当前运行程序程序停止后变量值丢失可在赋值程序节点中直接创建 配置变量&#xff1a; 可用于多个程序变量名和值在机器人安装期间持续存在需预先在配置变量界面…...

nssm配置springboot项目环境,注册为windows服务

NSSM 的官方下载地址是&#xff1a;NSSM - the Non-Sucking Service Manager1 使用powershell输入命令,java项目需要手动配置和依赖nacos .\nssm.exe install cyMinio "D:\minio\启动命令.bat" .\nssm.exe install cyNacos "D:\IdeaProject\capacity\nacos-s…...

20-项目部署(Docker)

在昨天的课程中&#xff0c;我们学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目。大家想一想自己最大的感受是什么&#xff1f; 我相信&#xff0c;除了个别天赋异禀的同学以外&#xff0c;大多数同学都会有相同的…...

Python学习(6) ----- Python2和Python3的区别

Python2 和 Python3 是两个主要版本的 Python 编程语言&#xff0c;它们之间有许多重要的区别。Python3 是对 Python2 的一次重大升级&#xff0c;不完全兼容旧版本。以下是它们的主要区别&#xff1a; &#x1f9f5; 基本语法差异 1. 打印语法 Python2&#xff1a;print 是一…...

零基础安装 Python 教程:从下载到环境配置一步到位(支持 VSCode 和 PyCharm)与常用操作系统操作指南

零基础安装 Python 教程&#xff1a;从下载到环境配置一步到位&#xff08;支持 VSCode 和 PyCharm&#xff09;与常用操作系统操作指南 本文是一篇超详细“Python安装教程”&#xff0c;覆盖Windows、macOS、Linux三大操作系统的Python安装方法与环境配置&#xff0c;包括Pyt…...

SAP学习笔记 - 开发18 - 前端Fiori开发 应用描述符(manifest.json)的用途

上一章讲了 Component配置&#xff08;组件化&#xff09;。 本章继续讲Fiori的知识。 目录 1&#xff0c;应用描述符(Descriptor for Applications) 1&#xff09;&#xff0c; manifest.json 2&#xff09;&#xff0c;index.html 3&#xff09;&#xff0c;Component.…...

分类与逻辑回归 - 一个完整的guide

线性回归和逻辑回归其实比你想象的更相似 😃 它们都是所谓的参数模型。让我们先看看什么是参数模型,以及它们与非参数模型的区别。 线性回归 vs 逻辑回归 线性回归:用于回归问题的线性参数模型。逻辑回归:用于分类问题的线性参数模型。参数回归模型: 假设函数形式 模型假…...

一键试衣,6G显存可跑

发现一个好玩的一键换衣的工作流&#xff0c;推荐给大家。 https://github.com/chflame163/ComfyUI_CatVTON_Wrapper 作者参考的是开源项目&#xff0c;做成了工作流形式。 https://github.com/Zheng-Chong/CatVTON 先来看下效果&#xff0c;使用动画人物也可换衣&#xff…...

跟着deepseek浅学分布式事务(2) - 两阶段提交(2PC)

文章目录 一、核心角色二、流程详解三、关键示例四、致命缺点五、改进方案六、适用场景七、伪代码1. 参与者&#xff08;Participant&#xff09;2. 协调者&#xff08;Coordinator&#xff09;3. 模拟运行&#xff08;Main Class&#xff09;4. 关键问题模拟 八、待改进问题总…...

【仿生机器人软件架构】通过整合认知系统实现自主精神性——认知系统非常具有可执行性

来自Claude 4.0 pro深度思考 仿生机器人软件架构&#xff1a;通过整合认知系统实现自主精神性 要创建具有真正情感深度的、完全自主的仿生机器人&#xff0c;需要超越基于规则的系统&#xff0c;转向能够实现涌现行为、自适应个性和类似意识处理的架构。根据截至2024年初的现…...

20250602在Ubuntu20.04.6下修改压缩包的日期和时间

rootrootrootroot-X99-Turbo:~$ ll -rwxrwxrwx 1 rootroot rootroot 36247187308 5月 23 10:23 Android13.0地面站.tgz* rootrootrootroot-X99-Turbo:~$ touch 1Android13.0地面站.tgz rootrootrootroot-X99-Turbo:~$ ll -rwxrwxrwx 1 rootroot rootroot 36247187308 6月…...

Fullstack 面试复习笔记:项目梳理总结

Fullstack 面试复习笔记&#xff1a;项目梳理总结 之前的笔记&#xff1a; Fullstack 面试复习笔记&#xff1a;操作系统 / 网络 / HTTP / 设计模式梳理Fullstack 面试复习笔记&#xff1a;Java 基础语法 / 核心特性体系化总结 这篇笔记主自用&#xff0c;系统地梳理一下最近…...

星闪开发之Server-Client 指令交互控制OLED灯案例

系列文章目录 星闪开发之Server-Client 指令交互控制OLED灯案例 文章目录 系列文章目录前言一、核心流程服务端客户端 二、图片资源三、源代码四、在Hispark Studio中配置将sle_oled-master文件夹下的相sle_oled放在peripheral文件夹下。peripheral目录下的 Kconfig文件中添加…...

MySQL补充知识点学习

书接上文&#xff1a;MySQL关系型数据库学习&#xff0c;继续看书补充MySQL知识点学习。 1. 基本概念学习 1.1 游标&#xff08;Cursor&#xff09; MySQL 游标是一种数据库对象&#xff0c;它允许应用程序逐行处理查询结果集&#xff0c;而不是一次性获取所有结果。游标在需…...

《前端面试题:CSS有哪些单位!》

CSS单位大全&#xff1a;从像素到容器单位的前端度量指南 精通CSS单位是构建响应式、灵活布局的关键技能&#xff0c;也是面试中的必考知识点 一、CSS单位的重要性与分类 在网页设计中&#xff0c;CSS单位是控制元素尺寸、间距和定位的基础。不同的单位提供了不同的计算方式和…...