自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 收藏
  • 关注

原创 链表&&哈希表&&双指针&&字符串

题意:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?满足要求的四元组集合为: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2]]给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。

2025-10-15 11:04:59 939

原创 多模态&&会话记忆完善

本文介绍了在SpringAI中实现多模态对话和持久化会话记忆的方法。在阿里云qwen-omni模型支持下,通过修改ChatClient配置和控制器接口,实现了文本和图片的多模态交互。同时,针对会话记忆持久化问题,提出了基于Redis的自定义解决方案,包括RedisChatMemory和RedisChatHistory实现类,将对话内容和会话ID存储在Redis中,解决了内存存储重启丢失的问题。需要注意当前SpringAI版本对qwen-omni模型的支持限制,以及使用Redis方案时需移除原有内存实现。

2025-08-28 11:50:51 359

原创 RAG(知识库ChatPDF)

本文介绍了RAG(检索增强生成)技术原理及其在解决大模型知识限制问题中的应用。主要内容包括:1. RAG工作原理:通过向量模型将知识库内容向量化存储,在用户提问时检索相关片段与大模型结合生成回答。2. 关键技术组件:包括向量模型(文本向量化)、向量数据库(存储和检索向量)、文档处理工具(PDF读取和分割)。3. 具体实现方案:构建了PDF文件上传、向量化存储和检索系统,支持知识库管理和大模型对话功能。4. 系统架构:采用SpringAI框架,实现文档处理、向量存储和对话流程的自动化整合。

2025-08-25 18:32:50 1076

原创 Function Calling(智能客服)

本文介绍了如何结合AI大模型与传统Java程序开发智能客服系统。系统通过Function Calling机制,由AI处理对话理解、用户意图分析等任务,Java程序负责数据库操作。文章详细讲解了数据库表设计、CRUD功能实现、工具类定义(课程查询、校区查询、预约单生成),并提供了解决SpringAI与阿里云百炼平台兼容性问题的方法。通过自定义AlibabaOpenAiChatModel类,实现了对阿里云接口的适配,最终构建了一个完整的职业教育课程咨询和预约系统。

2025-08-25 11:49:32 1302

原创 Pompt-Engineering

本文介绍了提示词工程的核心策略及安全防范措施,主要内容包括:1. 提示词工程技巧:提供明确指令、使用分隔符、分步拆解任务、示例引导和角色设定,以减少模型"幻觉";2. 常见提示词攻击防范:包括提示注入、越狱攻击、数据泄露和模型欺骗的防范方法;3. 应用实例:通过"哄哄模拟器"游戏展示了提示词的实际编写技巧;4. 技术实现:详细介绍了如何创建ChatClient,包括依赖引入、参数配置和Controller编写。文章强调优化提示词可显著提升模型输出的准确性和可控性,同时

2025-08-25 10:41:10 838

原创 Spring-AI

本文介绍了SpringAI框架在大模型应用开发中的使用方法,主要包括四个核心模块:1. SpringAI入门:通过创建SpringBoot工程、配置模型参数和声明ChatClient实现大模型调用;2. 纯Prompt开发:讲解提示词工程优化策略,以"哄哄模拟器"为例演示开发流程;3. FunctionCalling:适用于需要逻辑校验的场景,以智能客服为例展示实现过程;4. RAG架构:解决大模型知识限制问题,通过向量数据库实现知识增强,以ChatPDF为例说明实现方法。

2025-08-23 12:03:11 1685 1

原创 认识-AI

本文系统介绍了人工智能技术的发展历程,重点讲解了Transformer神经网络模型作为当前AI进步的核心技术,及其在自然语言处理中的应用原理。文章详细阐述了大模型开发部署的三种方式(开放API、云平台部署、本地部署)及其优缺点,并解析了API调用规范。同时,分析了传统程序与大模型各自的优势领域,提出将两者结合的混合开发模式。最后,介绍四种大模型应用开发技术架构(纯Prompt模式、Function Calling、RAG、Fine-tuning),并给出技术选型建议。

2025-08-22 14:43:54 921

原创 Git教程

在版本控制当中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。分支可以简单理解为副本,一个分支就是一个单独的副本。分支底层其实也是指针的引用。

2025-05-23 18:46:18 1389 1

原创 OS面试篇

操作系统设计了虚拟内存,每个进程都有自己的独立的虚拟内存,我们所写的程序不会直接与物理内存打交道。第一,虚拟内存可以使得进程对运行内存超过物理内存大小,因为程序运行符合局部性原理,CPU 访问内存会有很明显的重复访问的倾向性,对于那些没有被经常使用到的内存,我们可以把它换出到物理内存之外,比如硬盘上的 swap 区域。第二,由于每个进程都有自己的页表,所以每个进程的虚拟内存空间就是相互独立的。进程也没有办法访问其他进程的页表,所以这些页表是私有的,这就解决了多进程之间地址冲突的问题。

2025-05-23 14:31:26 1159

原创 Spring面试题

IoC:即控制反转的意思,它是一种创建和获取对象的技术思想,依赖注入(DI)是实现这种技术的一种方式。传统开发过程中,我们需要通过new关键字来创建对象。使用IoC思想开发方式的话,我们不通过new关键字创建对象,而是通过IoC容器来帮我们实例化对象。通过IoC的方式,可以大大降低对象之间的耦合度。AOP:是面向切面编程,能够将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,以减少系统的重复代码,降低模块间的耦合度。Spring AOP 就是基于动态代理的,

2025-04-05 20:59:15 1233

原创 计算机网络面试篇

计算机网络面试题

2025-03-18 16:51:17 1092

原创 Java中的I/O

Java中的I/O流

2025-03-15 21:40:12 367

原创 MySQL面试题

mysql八股

2025-03-15 20:49:38 1517

原创 Java集合面试篇

在 JDK 1.7 版本之前, HashMap 数据结构是数组和链表,HashMap通过哈希算法将元素的键(Key)映射到数组中的槽位(Bucket)。如果多个键映射到同一个槽位,它们会以链表的形式存储在同一个槽位上,因为链表的查询时间是O(n),所以冲突很严重,一个索引上的链表非常长,效率就很低了。所以在JDK 1.8版本的时候做了优化,当一个链表的长度超过8的时候就转换数据结构,不再使用链表存储,而是使用红黑树。

2025-03-06 21:38:50 1081

原创 Java虚拟机面试题

根据 JDK 8 规范,JVM 运行时内存共分为虚拟机栈堆元空间程序计数器本地方法栈五个部分。还有一部分内存叫直接内存,属于操作系统的本地内存,也是可以直接操作的。元空间:元空间的本质和永久代类似,都是对 JVM 规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。Java 虚拟机栈每个线程有一个私有的栈,随着线程的创建而创建。栈里面存着的是一种叫 “栈帧” 的东西,每个方法会创建一个栈帧,栈帧中存放了局部变量表基本数据类型和对象引用。

2025-03-04 15:45:29 1268

原创 Java并发面试篇

什么是线程池技术?其实,线程池就是一个可以复用线程的技术。要理解什么是线程复用技术,我们先得看一下不使用线程池会有什么问题,理解了这些问题之后,我们在解释线程复用同学们就好理解了。用户每次发起一个请求给后台,后台就创建一个新的线程来处理,下次新的任务过来肯定也会创建新的线程,如果用户量非常大,创建的线程也讲越来越多。然而,创建线程是开销很大的,并且请求过多时,会严重影响系统性能。而使用线程池,就可以解决上面的问题。如下图所示,

2025-03-01 19:40:56 1003

原创 Redis面试篇

Redis分片集群如何判断某个key应该在哪个实例?将16384个插槽分配到不同的实例根据key计算哈希值,对16384取余余数作为插槽,寻找插槽所在实例即可如何将同一类数据固定的保存在同一个Redis实例?Redis计算key的插槽值时会判断key中是否包含{},如果有则基于{}内的字符计算插槽数据的key中可以加入{类型},例如key都以{typeId}为前缀,这样同类型数据计算的插槽一定相同。

2025-03-01 11:41:49 1258

原创 RabbitMq高级

Mq高级

2025-02-27 19:43:38 1272

原创 数组总结【代码随想录】

直接输出移除指定元素后的数组长度是非常容易的,原地修改数组需要:如果第一个元素是指定的元素,那么我们将最后一个元素的值赋给第一个元素并且len指针往前移(逻辑上把指定元素删了,数组长度减1)。

2025-02-26 22:12:54 1054

原创 RabbitMQ基础

Work模型的使用:多个消费者绑定到一个队列,同一条消息只会被一个消费者处理通过设置prefetch来控制消费者预取的消息数量交换机的作用是什么?接收publisher发送的消息将消息按照规则路由到与之绑定的队列不能缓存消息,路由失败,消息丢失FanoutExchange的会将消息路由到每个绑定的队列描述下Direct交换机与Fanout交换机的差异?Fanout交换机将消息路由给每一个与之绑定的队列Direct交换机根据RoutingKey判断路由给哪个队列。

2025-02-26 20:51:18 1148

原创 java基础面试篇

Java 能支持跨平台,主要依赖于 JVM 关系比较大。JVM也是一个软件,不同的平台有不同的版本。我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件。Java虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后运行。也就是说,只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行我们编写的Java程序。而这个过程中,我们编写的Java程序没有做任何改变,仅仅是通过JVM这一”中间层“,就能在不同平台上运行,真正实现了”一次编译,到处运行“的目的。

2025-02-25 17:00:35 1580

原创 服务保护和分布式事务

Sentinel是阿里巴巴开源的一款服务保护框架,目前已经加入SpringCloudAlibaba中。官方网站:核心库(Jar包):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。在项目中引入依赖即可实现服务限流、隔离、熔断等功能。控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。为了方便监控微服务,我们先把Sentinel的控制台搭建出来。

2025-02-20 15:18:00 679

原创 回溯&&单调栈总结

数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

2025-01-14 11:39:42 700

原创 微服务-02

Component@Override// 编写过滤器逻辑System.out.println("未登录,无法访问");// 放行// 拦截@Override// 过滤器执行顺序,值越小,优先级越高return 0;

2024-12-19 17:37:12 1589

原创 二叉树总结

思路: 层序遍历,至最后一行,拿到第一个元素。

2024-12-19 15:19:20 1358

原创 微服务-01【续】

而且这种调用方式,与原本的本地方法调用差异太大,编程时的体验也不统一,一会儿远程调用,一会儿本地调用。因此,我们必须想办法改变远程调用的开发模式,让。上篇文章我们利用Nacos实现了服务的治理,利用RestTemplate实现了服务的远程调用。有了上述信息,OpenFeign就可以利用动态代理帮我们实现这个方法,并且向。接口,这不是重复编码吗?:记录所有请求和响应的明细,包括头信息、请求体、元数据。:在BASIC的基础上,额外记录了请求和响应的头信息。我们只需要直接调用这个方法,即可实现远程调用了。

2024-12-12 15:43:57 1203

原创 微服务-01

什么时候需要拆分微服务?如果是创业型公司,最好先用单体架构快速迭代开发,验证市场运作模型,快速试错。当业务跑通以后,随着业务规模扩大、人员规模增加,再考虑拆分微服务。如果是大型企业,有充足的资源,可以在项目开始之初就搭建微服务架构。如何拆分?首先要做到高内聚、低耦合从拆分方式来说,有横向拆分和纵向拆分两种。纵向就是按照业务功能模块,横向则是拆分通用性业务,提高复用性服务拆分之后,不可避免的会出现跨微服务的业务,此时微服务之间就需要进行远程调用。微服务之间的远程调用被称为RPC,即远程过程调用。

2024-12-12 14:50:01 1096

原创 Docker基础

命令说明文档地址拉取镜像推送镜像到DockerRegistry查看本地镜像docker rmi删除本地镜像docker rmidocker run创建并运行容器(不能重复创建)docker run停止指定容器启动指定容器重新启动容器docker rm删除指定容器docker ps查看容器docker ps查看容器运行日志进入容器保存镜像到本地压缩文件加载本地压缩文件到镜像查看容器详细信息图示:​默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。

2024-12-10 15:55:25 1120 1

原创 MyBatisPlus

为了简化单表CRUD,MybatisPlus提供了一个基础的BaseMapper接口,其中已经实现了单表的CRUD:因此自定义的Mapper只要实现了这个BaseMapper,就无需自己实现单表CRUD了。修改mp-demo中的包下的UserMapper接口,让其继承BaseMapper在UpdateWrapper的案例中,我们在代码中编写了更新的SQL语句:这种写法在某些企业也是不允许的,因为SQL语句最好都维护在持久层,而不是业务层。

2024-11-29 19:11:25 2113

原创 苍穹外卖复习总结

进入到sky-server模块,创建com.sky.annotation包。/*** 自定义注解,用于标识某个方法需要进行功能字段自动填充处理*///数据库操作类型:UPDATE INSERT其中枚举类OperationType已在sky-common模块中定义,其这枚举项就表示枚举类的对象,只是这些对象在定义枚举类时就预先写好了,以后就只能用这几个固定的对象。想要获取枚举类中的枚举项,只需要用类名调用就可以了。/*** 数据库操作类型*//*** 更新操作*/

2024-11-18 11:27:51 343

原创 Lambda表达式&&方法引用(JDK8新特性)

最后,再准备一个测试类,在测试类中创建CreateCar接口的实现类对象,先用匿名内部类创建、再用Lambda表达式创建,最后改用方法引用创建。现在,我想要把下图中Lambda表达式的方法体,用一个实例方法代替。Lambda是用来简化匿名代码的书写格式的,而方法引用是用来进一步简化Lambda表达式的,它简化的更加过分。因为方法引用是基于Lamdba表达式简化的,所以也要按照Lamdba表达式的使用前提来用,特定类型的方法引用是没有什么道理的,只是语法的一种约定,遇到这种场景,就可以这样用。

2024-11-06 15:32:24 587

原创 Maven高级

所谓分模块设计,顾名思义指的就是我们在设计一个 Java 项目的时候,将一个 Java 项目拆分成多个模块进行开发。1). 未分模块设计的问题如果项目不分模块,也就意味着所有的业务代码是不是都写在这一个 Java 项目当中。随着这个项目的业务扩张,项目当中的业务功能可能会越来越多。假如我们开发的是一个大型的电商网站,这个项目组至少几十号甚至几百号开发人员,这些开发人员全部操作这一个 Java 项目。此时大家就会发现项目管理和维护起来将会非常的困难。

2024-10-19 11:47:13 3612

原创 BigDecimal类&Date类&JDK8日期

JDK8新增的日期类分得更细致一些,比如表示年月日用LocalDate类、表示时间秒用LocalTime类、而表示年月日时分秒用LocalDateTime类等;Java语言规定,1970年1月1日0时0分0秒认为是时间的起点,此时记作0,那么1000(1秒=1000毫秒)就表示1970年1月1日0时0分1秒。为了解决计算精度损失的问题,Java给我们提供了BigDecimal类,它提供了一些方法可以对数据进行四则运算,而且不丢失精度,同时还可以保留指定的小数位。这两个类可以用来对计算两个时间点的时间间隔。

2024-10-16 21:57:49 1115

原创 SpringBoot原理(续)

这是因为在实际的项目开发当中,我们可能会用到很多第三方的技术,并不是所有的第三方的技术官方都给我们提供了与SpringBoot整合的starter起步依赖,但是这些技术又非常的通用,在很多项目组当中都在使用。将来在项目当中,我要想使用这个技术,我。web后端开发现在基本上都是基于标准的三层架构进行开发的,在三层架构当中,Controller控制器层负责接收请求响应数据,Service业务层负责具体的业务逻辑处理,而Dao数据访问层也叫持久层,就是用来处理数据访问操作的,来完成数据库当中数据的增删改查操作。

2024-10-16 15:56:56 1115

原创 SpringBoot原理

在实现类重写的selectImports()方法,读取当前项目下所有依赖jar包中META-INF/spring.factories、META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports两个文件里面定义的配置类(配置类中定义了@Bean注解标识的方法)。如果采用以上这种方式来完成自动配置,那我们进行项目开发时,当需要引入大量的第三方的依赖,就需要在启动类上配置N多要扫描的包,这种方式会很繁琐。

2024-10-14 17:15:25 2049

原创 Java中的枚举

既然枚举是一个类的话,我们能不能在枚举类中定义构造器、成员变量、成员方法呢?比如我们现在有这么一个应用,用户进入应用时,需要让用户选择是女生、还是男生,然后系统会根据用户选择的是男生,还是女生推荐不同的信息给用户观看。可以看到,枚举类A是用class定义的,说明枚举确实是一个类,而且X,Y,Z都是A类的对象;其实枚举项就表示枚举类的对象,只是这些对象在定义枚举类时就预先写好了,以后就只能用这几个固定的对象。定义一个枚举类,在枚举类中定义三个枚举项X, Y, Z。修饰,所以被可以类名调用,而且不能更改。

2024-10-12 15:14:55 249

原创 Java中的泛型

ArrayList集合的设计者在定义ArrayList集合时,就已经明确ArrayList集合时给别人装数据用的,但是别人用ArrayList集合时候,装什么类型的数据他不知道,所以就用一个。泛型指的是,在定义类、接口、方法时,同时声明了一个或者多个类型变量(如:<E>),称为泛型类、泛型接口、泛型方法、它们统称为泛型。泛型类,在实际工作中一般都是源代码中写好,我们直接用的,就是ArrayList<E>这样的,自己定义泛型类是非常少的。定义一个Data<T> 泛型接口,T表示接口中要处理数据的类型。

2024-09-26 16:30:20 446

原创 Spring中的AOP

我们要想完成统计各个业务方法执行耗时的需求,我们只需要定义一个模板方法,将记录方法执行耗时这一部分公共的逻辑代码,定义在模板方法当中,在这个方法开始运行之前,来记录这个方法运行的开始时间,在方法结束运行的时候,再来记录方法运行的结束时间,中间就来运行原始的业务方法。我们所说的模板方法,其实就是代理对象中所定义的方法,那代理对象中的方法以及根据对应的业务需要, 完成了对应的业务功能,当运行原始业务方法时,就会运行代理对象中的方法,从而实现统计业务方法执行耗时的操作。切入点指的是匹配连接点的条件。

2024-09-19 15:42:25 1296 2

原创 Java中的事务管理

以上业务功能delete()方法在运行时,会引发除0的算数运算异常(运行时异常),出现异常之后,由于我们在方法上加了@Transactional注解进行事务管理,所以发生异常会执行rollback回滚操作,从而保证事务操作前后数据是一致的。所谓事务的传播行为,指的就是在A方法运行的时候,首先会开启一个事务,在A方法当中又调用了B方法, B方法自身也具有事务,那么B方法在运行的时候,到底是加入到A方法的事务当中来,还是B方法在运行的时候新建一个事务?例如:两个事务方法,一个A方法,一个B方法。

2024-09-18 15:09:28 3039

原创 idea连接数据库大避雷!!!

学习的时候,用黑马的资料安装的数据库,命令行能正常启动,SQLyog也能正常连接,就是tmd idea连接不了。然后就晚上各种搜,有的说数据库驱动版本不匹配,有的说时区问题,都不能解决我的问题!,折腾了几次,还是卸了重装吧,重装也有方法。具体什么原理咱也不太清楚,反正错误大概意思是说:缺少客户端插件啥玩意的。按照这篇博客重装,还是老毛病,无用!当然有的同学没出现这个问题,有的出现了可以避避雷!参考这篇一路下来安装,连接,成功连接!

2024-09-15 17:04:56 620

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除