SpringAI+DeepSeek大模型应用开发实战

article/2025/8/5 10:04:38

内容来自黑马程序员

这里写目录标题

  • 认识AI和大模型
  • 大模型应用开发
    • 模型部署方案对比
    • 模型部署-云服务
    • 模型部署-本地部署
    • 调用大模型
    • 什么是大模型应用
      • 传统应用和大模型应用
      • 大模型应用
    • 大模型应用开发技术架构
  • SpringAI
    • 对话机器人
      • 快速入门
      • 会话日志
      • 会话记忆

认识AI和大模型

  • AI的发展
    AI,人工智能(Artificial Intelligence),使机器能够像人类一样思考、学习和解决问题的技术。
    在这里插入图片描述
  • 大语言模型

我们所熟知的大模型(Large Language Models, LLM),例如GP、DeepSeek底层都是采用Transformer神经网络模型。
在这里插入图片描述

  • Transformer
    在这里插入图片描述
    在这里插入图片描述

大模型应用开发

模型部署方案对比

在这里插入图片描述

模型部署-云服务

国内知名的云服务平台都提供了全球知名的大模型的私有部署功能,甚至还提供了这些模型的API开发平台,无需部署就能提供。

云平台公司地址
阿里百炼阿里巴巴https://bailian.console.aliyun.com
干帆平台百度https://console.bce.baidu.com/qianfan/overview
腾讯TI平台腾讯https://cloud.tencent.com/product/ti
SiliconCloud硅基流动https://siliconflow.cn/zh-cn/siliconcloud
火山方舟-火山引擎字节跳动https://www.volcengine.com/product/ark

模型部署-本地部署

本地部署最简单的一种方案就是使用ollama,官网地址:https//ollama.com

在这里插入图片描述

在这里插入图片描述

调用大模型

以下是DeepSeek官方给出的一段API实例代码:

# Please install OpenAI SDK first: `pip3 install openai`from openai import OpenAIclient = OpenAI(api_key="<DeepSeek API Key>", base_url="https://api.deepseek.com")response = client.chat.completions.create(model="deepseek-chat",messages=[{"role": "system", "content": "You are a helpful assistant"},{"role": "user", "content": "Hello"},],stream=False
)print(response.choices[0].message.content)

在这里插入图片描述

什么是大模型应用

传统应用和大模型应用

大模型应用是基于大模型的推理、分析、生成能力,结合传统编程能力,开发出的各种应用。
在这里插入图片描述

大模型应用

大模型对话产品公司地址
GPT-3.5、GPT-4oChatGPTOpenAIhttps://chatgpt.com/
Claude 3.5Claude AIAnthropichttps://claude.ai/chats
DeepSeek-R1DeepSeekDeepSeekhttps://www.deepseek.com/
文心大模型3.5文心一言百度https://yiyan.baidu.com/
星火3.5讯飞星火科大讯飞https://xinghuo.xfyun.cn/desk
Qwen-Max通义千问阿里巴巴https://tongyi.aliyun.com/qianwen/
MoonshootKimi月之暗面https://kimi.moonshot.cn/
Yi-Large零一万物零一万物https://platform.lingyiwanwu.com/

在这里插入图片描述

大模型应用开发技术架构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SpringAI

在这里插入图片描述

对话机器人

快速入门

  1. 引入依赖
<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>
  1. 配置模型
spring:ai:ollama:base-url: http://localhost:11434chat:model: deepseek-r1:7b
spring:ai:openai:base-url: https://dashscope.aliyuncs.com/compatible-modelapi-key: ${OPENAI_API_KEY}chat:options:model: qwen-max # 模型名称temperature: 0.8 # 模型温柔度,值越大,输出结果越随机
  1. 配置客户端
   @Beanpublic ChatClient chatClient(OllamaChatModel model){return ChatClient.builder(model).defaultSystem("你是可爱的助手,名字叫小团团").build();}
 String content = chatClient.prompt().user("你是谁?").call().content();// 流式
Flux<String> content = chatClient.prompt().user("你是谁?").stream().content();

在这里插入图片描述

会话日志

SpringAI利用了AOP原理提供了AI会话是的拦截、增强等功能,也就是Advisor。
在这里插入图片描述

@Bean
public ChatClient chatClient(OllamaChatModel model){return ChatClient.builder(model)   // 创建ChatClient工厂实例.defaultSystem("你是可爱的助手,名字叫小团团") .defaultAdvisors(new SimpleLoggerAdvisor()) // 配置日志Advisor.build(); // 构建ChatClient实例
}

会话记忆

大模型是具备记忆能力的,要想让大模型记住之前聊天的内容,唯一的办法就是把之前聊天的内容与新的提示词一起发给大模型。

from openai import OpenAI#1.初始化OpenAI客户端
from openai import OpenAI#1.初始化OpenAI客户端
client = OpenAI(api_key="<DeepSeek API Key>",base_url="https://api.deepseek.com")#2.发送http请求到大模型
response = client.chat.completions.create(model="deepseek-r1",temperature=0.7,messages=[{"role""system""content""你是一个热心的AI助手,你的名字叫小团团"}{"role""user""content""你好,你是谁? "}],stream=False
)
# 3.打印返回结果
print(response.choices[o].message.content)

在这里插入图片描述

  1. 定义会话存储方式
 public interface ChatMemory {void add(String conversationId, List<Message> messages);List<Message> get(String conversationId, int lastN);void clear(String conversationId);}

在这里插入图片描述

   @Beanpublic ChatMemory chatMemory(){return new InMemoryChatMemory();}
  1. 配置会话记忆
 @Beanpublic ChatClient chatClient(OllamaChatModel model){return ChatClient.builder(model).defaultSystem("你是可爱的助手,名字叫小团团").defaultAdvisors(new SimpleLoggerAdvisor(),new MessageChatMemoryAdvisor(chatMemory())).build();}
  1. 添加会话id
Flux<String> content = chatclient.prompt().user("你好,我叫小明”).advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)).stream().content();

添加会话id到AdvisorContext上下文中


http://www.hkcw.cn/article/eMVvGRDiFp.shtml

相关文章

Python打卡第42天

浙大疏锦行 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 回调函数 Hook本质是回调函数&#xff0c;所以我们先介绍一下回调函数 回调函数是作为参数传递给其他函数的函数&#xff0c;其目的是在某个特定事件发生时被调用执行。这种机制允许代码…

hysAnalyser --- 逐包分析MPEG-TS的功能说明

前言 hysAnalyser 是一款新颖、独具特色的 MPEG-TS 数据分析工具&#xff0c;定位于 1&#xff09;音视频开发和测试人员&#xff1a;和MEPG-TS有关开发、调试、测试辅助&#xff1b; 2&#xff09;和MPEG-TS相关业务系统的运维人员&#xff1a;如数字电视、OTT、互联网流媒体…

语音转文字工具

平时工作和学习比较忙&#xff0c;可能没时间听讲座&#xff0c;只能看回放&#xff0c;回访也很长&#xff0c;这时&#xff0c;我们可以借助语言转文字&#xff0c;通过阅读文字快速了解讲座的重点&#xff0c;今天给大家分享一个本人经常用的语言转文字工具&#xff0c;改工…

vue3(入门,setup,ref,计算属性,watch)

vue3(入门&#xff0c;setup,ref,计算属性,watch) 项目创建 Vue2&#xff08;选项式api&#xff09; 分散 vue3&#xff08;组合式api&#xff09; setUp&#xff08;&#xff09; setup返回值可以是一个渲染函数 面试题&#xff1a; setup和vue2中的配置项可以同时存在吗&a…

c++ 类型转换函数

测试代码&#xff1a; void testTypeTransfer() { // 测试类型转换函数class Distance {private:int meters;public:// 类型转换函数&#xff0c;int表示转化为int类型operator int() {std::cout << "调用了类型转换函数" << endl;return meters; }Dist…

如何使用 Docker 部署grafana和loki收集vllm日志?

环境: Ubuntu20.04 grafana loki 3.4.1 问题描述: 如何使用 Docker 部署grafana和loki收集vllm日志? 解决方案: 1.创建一个名为 loki 的目录。将 loki 设为当前工作目录: mkdir loki cd loki2.将以下命令复制并粘贴到您的命令行中,以将 loki-local-config.yaml …

汽车安全 2030 预测 (功能安全FuSa、预期功能安全SOTIF、网络安全CyberSecurity):成本、效益与行业影响

汽车安全 2030 预测 (功能安全FuSa、预期功能安全SOTIF、网络安全CyberSecurity)&#xff1a;成本、效益与行业影响 到 2030 年&#xff0c;汽车行业将迎来一场安全技术的深度变革&#xff0c;其中 “三重安全防护”&#xff08;功能安全 FuSa、预期功能安全 SOTIF、网络安全&…

AI视频“入驻”手机,多模态成智能终端的新战场

文&#xff5c;乐乐 今天&#xff0c;无线蓝牙耳机&#xff08;TWS&#xff09;已经成为人人都用得起的产品。 但退回到9年前&#xff0c;苹果AirPods是全球第一款真正意义上的无线蓝牙耳机。靠着自研并申请专利的Snoop监听技术&#xff0c;苹果解决了蓝牙耳机左右延时和能耗…

嵌入式学习笔记 - FreeRTOS v9.0.0 与v10.0.1不同版本占用资源对比

以下为用示例对比freeRTOS v9.0.0版本以及v10.0.1版本占用资源的境况&#xff0c;两者均在运行完全相同的任务包括任务内容与数量的情况进行对比&#xff0c;任务的创建均使用静态内存方式创建&#xff0c;每个任务的任务堆栈均设置相同大小&#xff0c;并且freeRTOSconfig.h文…

Git仓库大文件清理指南

前言 当大文件被提交到 Git 仓库后又删除&#xff0c;但仓库体积仍然很大时&#xff0c;这是因为 Git 保留了这些文件的历史记录。要彻底清理这些文件并减小仓库体积&#xff0c;你需要重写 Git 历史。 注意事项 这会重写历史 - 所有协作者都需要重新克隆仓库 备份你的仓库 …

LLMs之MCP:如何使用 Gradio 构建 MCP 服务器

LLMs之MCP&#xff1a;如何使用 Gradio 构建 MCP 服务器 导读&#xff1a;本文详细介绍了如何使用Gradio构建MCP服务器&#xff0c;包括前提条件、构建方法、关键特性和相关资源。通过一个简单的字母计数示例&#xff0c;演示了如何将Gradio应用转换为LLM可以使用的工具。Gradi…

Redis最佳实践——性能优化技巧之集群与分片

Redis集群与分片在电商应用中的性能优化技巧 一、Redis集群架构模式解析 1. 主流集群方案对比 方案核心原理适用场景电商应用案例主从复制读写分离数据冗余中小规模读多写少商品详情缓存Redis Sentinel自动故障转移监控高可用需求场景订单状态缓存Redis Cluster原生分布式分片…

2025年最新Android Studio汉化教程

首先把idea更新到IntelliJ IDEA 2024.3.5 (Community Edition)&#xff0c;然后关闭AndroidStudio 没有idea可以下载最新的 IntelliJ IDEA – the IDE for Pro Java and Kotlin Development 找到idea的安装路径&#xff0c;找到“\plugins\localization-zh 然后把“localizat…

uniapp实现下载文件到手机(安卓),通过系统分享到其他app

要在UniApp中实现下载文件到安卓手机&#xff0c;我这里使用的是plus.io直接获取文件系统&#xff0c;大家可以找一下dcloud插件或者其他api。以下是一个简单的步骤&#xff1a; 首先&#xff0c;你需要创建一个按钮或者其他触发下载的UI元素&#xff0c;用户点击后触发文件下载…

flutter-渐变色边框和渐变色文字和渐变色背景

文章目录 1. 介绍2. 代码实现2-1. 渐变色背景2-2. 渐变色边框2-3. 宽高由内容撑起的渐变色边框2-4. 渐变色文本 3. 完整例子 1. 介绍 在 flutter 中&#xff0c;渐变有三种&#xff0c;线性渐变 LinearGradient、放射状渐变 RadialGradient、扇形渐变 SweepGradient。一般都是…

记录一次macbook 安装macOS+win11双系统的历程。包括MacBook电脑恢复、绕过win11限制等

一、MacBook恢复macOS系统&#xff0c;或有问题可以重新用此操作 关机状态&#xff0c;同时摁住 optioncommandR 三个键&#xff0c;然后再摁开机键&#xff0c;等出现 一个地球的图标即可松开。 然后正常链接wifi&#xff0c;让它自动下载一些组件即可。 这里对硬盘进行重新…

移动电视盒MGV2000刷安卓及Armbian笔记

我的是mgv2000 JL代工的&#xff0c;配置是四核1G内存8GEMMC&#xff0c;我的目的是把他刷成linux&#xff0c;网上查询资料后&#xff0c;了解到大概分以下两个步骤&#xff1a; #一、先把原来移动自带的系统刷新为适合的安卓系统 #二、在新的安卓系统下&#xff0c;再刷成A…

蚂蚁百宝箱3分钟上手MCP:6步轻松构建智能体应用并发布小程序

蚂蚁百宝箱3分钟上手MCP&#xff1a;6步轻松构建智能体应用并发布小程序 AI 能聊天、能画画&#xff0c;但它能帮你赚钱吗&#xff1f;智能体空有一身本领却难以变现&#xff0c;是不是让你也感到无奈&#xff1f; 别担心&#xff0c;蚂蚁百宝箱「MCP专区」来啦&#xff01;现…

Android Studio 使用WIFI连接手机进行无线调试 adb命令

1.将电脑和手机连接到同一WIFI 2.手机连接usb&#xff0c;连接到AndroidStudio&#xff0c;和平时连线调试一样。 3.打开AndroidStudio下方Terminal便可以开始输入adb命令。 4.输入 adb devices 命令查看设备 adb devices效果如下 5.设置设备端口号命令 adb tcpip 5555 端…

MySQL—使用binlog日志恢复数据

一、binlog日志恢复数据简介 在 MySQL 中&#xff0c;使用二进制日志&#xff08;binlog&#xff09;恢复数据是一种常见的用于故障恢复或数据找回的方法。以下是详细的使用步骤&#xff1a; 确认 binlog 已启用&#xff1a;首先需要确认 MySQL 服务器已经启用了二进制日志功…