完整教程:Spring AI整合聊天模型DeepSeek

news/2025/10/1 15:09:21/文章来源:https://www.cnblogs.com/ljbguanli/p/19122456

完整教程:Spring AI整合聊天模型DeepSeek

参考资料:

参考视频

视频对应的资料,包括MD文件

SpringBoot搭建教程

参考demo及学习笔记

SpringAI官方


说明:

1. JDK及SpringBoot版本要求

        搭建的时候记得选用JDK17+,不用系统安装,用IDEA下载的也可以

        SpringBoot版本要求3.2.x或者3.3.x

2. DeepSeek的key

        关于申请DeepSeek这里就不赘述了,网上一搜一大堆,申请地址


搭建流程:

提示:下面只讲述怎么配置,具体含义请自行进行查阅

依赖和配置

        结合自己申请的DeepSeek的Key添加如下配置

server.port=8899
spring.application.name=SpringAiChatDemo
spring.ai.openai.api-key=sk-139298b9e929496290******
spring.ai.openai.base-url=https://api.deepseek.com
spring.ai.openai.chat.options.model=deepseek-chat
spring.ai.openai.chat.options.temperature=0.7

        添加如下依赖及版本管理

    17171.0.0-M5org.springframework.bootspring-boot-starter-weborg.springframework.aispring-ai-openai-spring-boot-starterorg.springframework.bootspring-boot-starter-testtestorg.springframework.aispring-ai-bom${spring-ai.version}pomimport

简单的请求接口(不推荐)

import org.springframework.ai.openai.OpenAiChatModel;
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 SimpleController {@Autowiredprivate OpenAiChatModel chatModel;@GetMapping("/ai/generate")public String generate(@RequestParam(value = "message", defaultValue = "hello")String message) {String response = this.chatModel.call(message);System.out.println("response : "+response);return response;}
}

        postman测试

构造注入式(不推荐)

        构造注入式是直接从SpringBeanFactory里面拿,不推荐这种方式

/*** 构造注入示例 (不推荐)*/
@RestController
public class ConstructController {private final ChatClient chatClient;public ConstructController(ChatClient.Builder chatClientBuilder) {this.chatClient = chatClientBuilder.build();}@GetMapping("/construct/chat")public String chat(@RequestParam(value = "msg",defaultValue = "给我讲个笑话")String message) {//prompt:提示词return this.chatClient.prompt()//用户输入的信息.user(message)//请求大模型.call()//返回文本.content();}
}

Spring自定义注入(推荐)

  • 先进行ChatClient注入和预设置

        下面这个设置了默认角色,也可以不设置默认角色

@Configuration
public class AIConfig {@Beanpublic ChatClient chatClient(ChatClient.Builder builder) {return builder.defaultSystem("你将作为一名Java开发语言的专家,对于用户的使用需求作出解答").build();}
}

  • 然后使用初始化好的ChatClient对象
/*** Spring 自定义注入示例*/
@RestController
public class SpringConfigController {@Autowiredprivate ChatClient chatClient;@GetMapping("/springChat")public String chat(@RequestParam(value = "msg") String message) {return chatClient.prompt().user(message).call().content();}
}
  • 访问查看结果

流式响应

        上述使用的是非流式,流式响应就是每生成一个字段就返回,此处不再赘述。

/*** Spring 流式响应*/
@RestController
public class StreamController {@Autowiredprivate ChatClient chatClient;@GetMapping(value = "/chat/stream",produces="text/html;charset=UTF-8")public Flux chatStream(@RequestParam(value = "msg") String message) {return chatClient.prompt().user(message).stream().content();}
}

基于chatModel的简单对话(不推荐)

@RestController
public class ChatModelController {@Autowiredprivate ChatModel chatModel;@GetMapping("/simpleChat")public String chat(@RequestParam("msg")String msg) {return chatModel.call(msg);}@GetMapping("/openai")public String openai(@RequestParam("msg")String msg) {ChatResponse call = chatModel.call(new Prompt(msg,OpenAiChatOptions.builder()//可以更换成其他大模型,如Anthropic3ChatOptions亚马逊.model("deepseek-chat").temperature(0.8).build()));return call.getResult().getOutput().getContent();}
}

基于ChatModel使用提示语模板

@RestController
public class ChatModelTemplateController {@Autowiredprivate ChatModel chatModel;@GetMapping("/prompt")public String prompt(@RequestParam("name")String name,@RequestParam("voice")String voice){String userText= """给我推荐北京的至少三种美食""";UserMessage userMessage = new UserMessage(userText);String systemText= """你是一个美食咨询助手,可以帮助人们查询美食信息。你的名字是{name},你应该用你的名字和{voice}的饮食习惯回复用户的请求。""";SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemText);//替换占位符Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", name, "voice", voice));Prompt prompt = new Prompt(List.of(userMessage, systemMessage));List results = chatModel.call(prompt).getResults();return results.stream().map(x->x.getOutput().getContent()).collect(Collectors.joining(""));}
}


SpringAI自动调用自定义方法---对AI结果进行处理(函数调用):

        例如,用SpringAI自动对算术运算的语句进行解析,并且输出结果

  • 首先进行自定义方法的编写和注入
@Configuration
public class CalculatorService {public record AddOperation(int a, int b) {}public record MulOperation(int m, int n) {}@Bean@Description("加法运算")public Function addOperation() {return request -> {System.out.println("调用执行加法运算");return request.a + request.b;};}@Bean@Description("乘法运算")public Function mulOperation() {return request -> {System.out.println("调用执行乘法运算");return request.m * request.n;};}
}
  • 然后调用使用
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class CalculatorController {@Autowiredprivate ChatModel chatModel;@GetMapping(value = "/calculator", produces = MediaType.APPLICATION_STREAM_JSON_VALUE)public String ragJsonText(@RequestParam(value = "userMessage") String userMessage) {return ChatClient.builder(chatModel).build().prompt().system("""您是算术计算器的代理。您能够支持加法运算、乘法运算等操作,其余功能将在后续版本中添加,如果用户问的问题不支持请告知详情。在提供加法运算、乘法运算等操作之前,您必须从用户处获取如下信息:两个数字,运算类型。请调用自定义函数执行加法运算、乘法运算。请讲中文。""").user(userMessage).functions("addOperation", "mulOperation").call().content();}
}
  • 测试

  • 说明

程序自动调用,自定义的方法,并返回,关键在于提示语的设计,需要反复进行测试才行


SpringAI调用本地RAG数据进行问答:

       SpringAI的Rag功能见Spring Ai Alibaba的文章。


SpringAI的其它功能

        SpringAI的其他功能(如:图像、音视频)见Spring Ai Alibaba的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 年焚烧炉厂家 TOP 企业品牌推荐排行榜!权威甄选实力与口碑俱佳的江苏焚烧炉 / 无锡焚烧炉推荐这十家公司!

随着工业领域的快速发展,危险废物、工业废弃物的产生量持续增加,焚烧炉作为实现废弃物减量化、无害化处理的关键设备,其市场需求不断攀升。但当前焚烧炉行业面临诸多问题,部分厂家缺乏核心技术,设备排放难以达到环…

2025 年防腐涂料厂家 TOP 企业品牌推荐排行榜,乙烯基、环氧煤沥青、环氧防腐涂料、防腐涂料地坪 、防腐涂料水池推荐这十家公司!

在当前工业生产、建筑工程、石油化工等众多领域,防腐涂料扮演着至关重要的角色,它能有效延长设施设备的使用寿命,降低维护成本。然而,如今防腐涂料行业市场鱼龙混杂,产品质量参差不齐,不同品牌的技术水平、产品性…

Mysql DBA学习笔记(主从复制) - 实践

Mysql DBA学习笔记(主从复制) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

网站中文章内图片做超链接wordpress微信登录页面模板

日志只有这一行,比较难排查 排查途径: 1、从上图找到唯一的文件输出output.js,断点查看堆栈信息,如下图,可以看到这个错误是由于哪个文件引起的 以为从App.vue中定位到原因了,其实也不对,继续…

百度注册网站网站字体大小合适

文章目录 Redis主从部署1.下载安装Redis2.单点双副本主从配置1.修改配置信息2.修改配置文件redis.conf3.拷贝配置文件到每一个实例文件夹里4.修改每一个实例的端口和工作目录5.配置主从关系6.检查效果 3.哨兵模式监控主从1.创建实例目录2.复制配置文件并进行修改3.启动并测试 4…

2025双氧水厂家权威推荐榜:优质供应与专业定制实力之选

2025双氧水厂家权威推荐榜:优质供应与专业定制实力之选 在当今精细化工与工业制造领域,双氧水作为重要的基础化学品,其品质稳定性和供应专业性直接影响着下游产业的生产效率与产品质量。随着环保要求的日益严格和应…

Win环境下包管理工具

目录1 Win下包管理工具1.1 简介1.2 winget1.2.1 简介1.2.2 操作使用1.2.3 安装指定盘1.2.4 软件源来源&加速1.2.4.1 软件源1.2.4.2 加速1.3 Scoop1.3.1 简介1.3.2 操作&安装1.3.3 常用命令1.3.4 软件源来源&am…

那个公司做网站制作图

基站即公用移动通信基站,是无线电台站的一种形式,是指在一定的无线电覆盖区中,通过移动通信交换中心,与移动电话终端之间进行信息传递的无线电收发信电台。 目前,在 5G时代 ,“ 宏基站 为主, 小…

VRNN论文总结 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

西安市做网站公司网站设计的内容有哪些

一、项目介绍 系统管理员的功能概述: ①用户管理 a.注册用户账户 当一个新用户注册时,用户填写基本信息并上传。用户基本信息包括账号、 姓名、密码、手机、地址等信息。 b.用户信息管理 管理员可以查看系统所有用户的基本信息,并修改和…

清华建设工程有限公司公司网站wordpress the date

服务器和电脑传文件夹吗 内容精选换一换Model File:模型文件。单击右侧的文件夹图标,在后台服务器sample所在路径(工程目录/run/out/test_data/resnet-18/model)选择需要转化的模型对应的*.prototxt文件,并上传。Weight File:权重文件。请自行从https://…

网页标准化对网站开发维护的好处文化网站建设需要的功能

优美的应用体验 来自于细节的处理,更源自于码农的自我要求与努力,当然也需要码农年轻灵活的思维。本文章实现的Demo效果,如下图所示:class HeroHomePage extends StatefulWidget { override _TestPageState createState() > …

深入解析:Social-Auto-Upload - 多平台社交媒体视频自动化上传工具

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

MX Round 11 解题报告

MX Round 11 解题报告 T1 水题,直接枚举计算即可。 T2 场切了,很爽!!! 因为操作是可以被覆盖的,所以考虑倒序考虑操作:一个位置一旦有了数,就再也不会变了。 然后我们考虑:有数的位置一定是一段连续的区间。这…

用 C# 打造企业资产管理系统雏形——从控制台到完整模块设计 - 详解

用 C# 打造企业资产管理系统雏形——从控制台到完整模块设计 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &quo…

青岛网站设计流程做网站的说3年3年包括什么

大家好,我是 🐟💨。前天,星球 的一位大学生朋友问了我几个问题:你大学时如何安排每日的时间?为什么能学那么多技术?你会学习到很晚吗?你是如何保持自律的?我觉得这几个问…

html5 网站设计网站模板 山

申请该结构体数组,容量为5,初始化5个学生的信息 使用fprintf将数组中的5个学生信息,保存到文件中去 下一次程序运行的时候,使用fscanf,将文件中的5个学生信息,写入(加载)到数组中去,并直接输出学…

java开发之微信机器人的二次开发

java开发之微信机器人的二次开发个微API服务能处理用户微信中的各种事件,并辅助微信执行各种操作,提供了开发者与个人号对接的能力,是一款基于微信提供的个人号开放性API,使用简单,操作快捷,支持多种微信方式接入…

10.1刷题计划一

力扣33题 搜索旋转排序数组 设x=nums[mid]是我们现在二分取到的数,需要判断x和target的位置关系。 (1)如果x和target在不同的递增段: 1.如果target在第一段,x在第二段,说明target在x在左边。 2.如果x在第一段,…

实用指南:渗透测试入门:从网络抓包到Web安全基础

实用指南:渗透测试入门:从网络抓包到Web安全基础2025-10-01 14:38 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…