SpringAI

机器学习:

  • 定义:人工智能的子领域,通过数据驱动的方法让计算机学习规律,进行预测或决策。
  • 核心方法:

    • 监督学习(如线性回归、SVM)。

    • 无监督学习(如聚类、降维)。

    • 强化学习(如Q-learning)。

  • 特点:依赖特征工程,模型复杂度较低,适用于中小型数据。

深度学习:

  • 定义:基于深层神经网络的机器学习方法,可自动提取特征。
  • 关键技术:

    • 神经网络架构:CNN(图像)、RNN/LSTM(序列数据)、Transformer。

    • 优化算法:反向传播、梯度下降(如Adam优化器)。

  • 优势:处理高维数据(如图像、文本),减少人工特征工程。

自然语言处理:

  • 目标:使计算机理解、生成人类语言。

  • 技术演进:

    • 传统方法:词袋模型、TF-IDF、隐马尔可夫模型。

    • 深度学习方法:词嵌入(Word2Vec)、预训练模型(BERT、GPT)。

  • 任务:机器翻译、情感分析、文本生成等。

大语言模型:

  • 定义:参数量巨大(数亿至万亿)的深度学习模型,专注于语言任务。

  • 代表模型:GPT系列、BERT、T5。

  • 核心技术:

    • Transformer架构:自注意力机制(捕捉长距离依赖)。

    • 预训练与微调:在大规模语料上预训练(如掩码语言建模),再针对下游任务微调。

大模型底层原理:

T:基于Transformer的神经网络

P:通过大量数据预训练,掌握自然语言规律

G:基于上文计算概率,生成下一个token

模型部署:

云部署:

优点:前期成本低、部署维护简单、弹性扩展、全球访问

缺点:数据隐私、网络依赖、长期成本高

本地部署:

优点:数据安全、不依赖外部网络、长期成本低、高度定制

缺点:初始成本高、维护复杂、部署周期长

开放API:

优点:前期成本极低、无需部署、无需维护、全球访问

缺点:数据隐私、网络依赖、长期成本高、定制限制

调用大模型:

传统应用和大模型应用:

大模型应用是基于大模型的推理、分析、生成能力,结合传统编程能力,开发出的各种应用

AI应用开发技术架构:

Fine-tuning(模型微调)

针对特有业务场景对基础大模型做数据训练与微调,以满足特定场景的需求。

SpringAI:

是一个大模型应用框架。其目标是将Spring生态系统的设计原则(如可移植性的模块化设计)应用于人工智能邻域。可以无缝接入Spring生态体系,快速改造传统项目。

对话机器人-入门

引入依赖:

配置模型:

配置客户端:

创建项目:

引入依赖自动完成

配置:

创建包config,包下创建相应类

创建controller包,包下创建相应的类:

手动加入

阻塞式,响应时间较长

流式默认采用event事件流,默认情况没有编码

需要在@RequestMapping注解后自己设置响应的类型

system设定:

这里是controller和前端的对话

对话机器人-会话日志

对chatclinet做修改加入环绕增强

修改配置文件,新增日志相关:

在application.yaml加入

日志功能通过环绕通知来去实现的

对话机器人-前端对接

解决跨域问题

对话机器人-会话记忆

步骤:

定义会话存储方式:

存储在内部的会话记忆

配置会话记忆:

添加会话id:

第三排:匿名环绕增强器

配置类中

添加

对话机器人-会话历史

新增接口:

public interface ChatHistoryRepository {

/**

* 保存会话记录

* @param type

* @param charId

*/

void save(String type,String charId);

/**

* 获取会话记录

* @param type

* @return

*/

List<String> getChatIds(String type);

}

接口实现:

/**

* @author TonySong

* @date 2025/4/12 0012

* @time 10:35

*/

@Component

public class InMemoryChatRepository implements ChatHistoryRepository{

private final Map<String,List<String>> chatHistory= new HashMap<>();

@Override

public void save(String type, String charId) {

// if(!chatHistory.containsKey(type)){

// chatHistory.put(charId,new ArrayList<>());

// }

// List<String> charIds = chatHistory.get(type);

List<String> charIds = chatHistory.computeIfAbsent(type, k -> new ArrayList<>());

if(charIds.contains(charId)){

return;

}

charIds.add(charId);

}

@Override

public List<String> getChatIds(String type) {

// List<String> list = chatHistory.get(type);

// return list==null? List.of():list;

return chatHistory.getOrDefault(type,List.of());

}

}

修改会话实现:

/**

* @author TonySong

* @date 2025/4/11 0011

* @time 17:39

*/

@RestController

@RequestMapping("/ai")

@RequiredArgsConstructor//启用带参构造完成创建

public class ChatController {

private final ChatClient chatClient;

private final ChatHistoryRepository chatHistoryRepository;

@RequestMapping(value = "/chat",produces = "text/html;charset=utf-8")

public Flux<String> chat(@RequestParam(value = "message",defaultValue = "你是谁") String message) {

//1、保存会话

chatHistoryRepository.save("chat",message);

//2、获取会话

return chatClient

.prompt()

.user(message)

.stream()

.content();

}

}

相关推荐
驭渊的小故事26 分钟前
Spring AI Alibaba 实战:从maven依赖治理到声明式工具调用
java·人工智能·spring
Elastic 中国社区官方博客1 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn1881 小时前
记录本地安装nacos服务的方法及异常
java·开发语言
步行cgn2 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
y1su2 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
我命由我123453 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法
苜蓿muxu3 小时前
Java 字符串拼接:+、StringBuilder、StringBuffer的区别
java
摇滚侠4 小时前
《Java并发编程之美》第 4 章 Java 并发包中原子操作类原理剖析 阅读笔记 7
java·笔记·python
旋律4144 小时前
同义方法区别(增加类与删除类)
java·后端