自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring Retry

Spring Retry 是 Spring 中提供的实现重试功能的组件。可以使用基于注解的方式实现,也可以使用基于RetryTemplate的编程方式实现。本例使用基于注解的方法。

2025-10-16 15:34:10 319 1

原创 RRateLimiter的使用

工具类/*** 获取客户端真实IP地址*/// 1. 检查各种代理头信息// 2. 直接获取远程地址throw new RuntimeException("无法获取远程ip地址");/*** 验证IP地址是否有效*/return ip!= null &&!!!!/*** 处理多个IP的情况(如X-Forwarded-For: client, proxy1, proxy2)*//*** 通过token获取用户id* @return*/

2025-09-27 17:49:05 382

原创 责任链模式

责任链模式是一种行为设计模式,允许你将请求沿着处理链传递,直到有一个处理者处理它为止。

2025-09-19 23:21:29 236

原创 @RequiredArgsConstructor使用

spring推荐通过构造方法进行注入,如果需要注入的成员变量较多,手动创建构造方法可能需要频繁修改,这时,可以使用@RequiredArgsConstructor。@RequiredArgsConstructor是lombok中提供的注解,可以为类中final或者@NotNull修饰的成员变量创建构造方法。查看编译后的源码,可以看到自动生成了带一个Cat参数的构造方法。

2025-09-13 23:23:07 235

原创 使用Aop和自定义注解实现SpringTask定时任务中加锁逻辑的封装

但是,项目中可能存在很多定时任务,每次使用RLock加锁比较麻烦,我们可以使用AOP+自定义注解的方式进行优化。SpringTask的定时任务,在集群环境下会多次执行,我们可以通过使用分布式锁的方式进行解决。

2025-09-13 21:48:15 298

原创 监听nacos配置中心数据的变化

如果需要监听nacos配置中心数据的变化,并执行对应的业务逻辑,则可以使用@NacosConfigListener注解。另外启动类或者配置类使用@EnableNacosConfig进行修饰。@RefreshScope实现nacos配置中心数据的动态刷新。@NacosConfigListener的使用。

2025-08-30 15:40:52 285

原创 nacos登录认证

注意:配置中nacos的用户名故意写错配置中心test.yml的配置如下:启动项目,日志中会有报错,但是项目可以正常启动,执行控制层方法,可以获取配置中心的值。

2025-08-29 19:01:50 280 1

原创 Aviator规则引擎简单使用

网上看到一个案例“非VIP用户满200减30,VIP用户满150减40,且周二全场额外95折”,针对该需求,使用if进行判断也可以实现,本例使用aviator实现。直接通过字符串设置表达式,可读性不好,我们可以定义一个.av后缀的文件,比如在resources目录下新建discount.av。严格来说,aviator属于表达式计算框架,其语法和JavaScript很像。规则引擎是一个更复杂的系统,它的核心是将业务规则与应用程序代码分离,并基于大量数据和规则进行自动化推理和决策。

2025-08-25 17:03:34 541

原创 jd-hotkey将对象进行缓存

如果是热key,则存在两种情况,1是返回value,2是返回null。如果不是热key,则返回null,并且将key上报到探测集群进行数量探测。2.Object get(String key),该方法返回该key本地缓存的value值,可用于判断是热key后,再去获取本地缓存的value值,通常用于redis热key缓存。3.void smartSet(String key, Object value),方法给热key赋值value,如果是热key,该方法才会赋值,非热key,什么也不做。

2025-08-18 13:00:00 163

原创 jd-hotkey探测热点key

选择master分支下载。

2025-08-16 16:21:21 636

原创 RDelayQueue实现订单超时关闭

开发中,可能存在这样的需求:如果订单长时间不支付,需要自动关闭订单。针对该需求可以通过如下一些方案实现:通过定时任务定时扫描订单表,将达到过期时间的订单关闭;通过mq发送延迟消息;通过延迟队列实现。本例,通过redisson的RDelayQueue(分布式延迟队列)实现。

2025-08-14 16:10:16 306

原创 斐波那契散列

经过多次测试,计算索引时,length长度必须是2^n(本博客只展示了部分测试代码,读者可以自行测试其他长度)‌分布均匀性‌:利用黄金分割比的数学特性,能够使哈希值在地址空间中分布更加均匀。‌计算效率‌:在硬件实现上通常只需要一次乘法和位移操作,效率较高。‌缓存路由‌:在数据库索引或缓存系统中,提升查询效率。‌促销活动‌:为每个用户生成唯一优惠码,避免重复领取。‌减少冲突‌:相比传统除法散列,能有效降低哈希冲突概率。‌抽奖系统‌:生成公平的抽奖号码,确保概率均等。数组长度128,相当于2^8。

2025-08-10 17:28:37 451

原创 关于rocketmq消费超时重试

从源码我们可以看到,我们自定义的消费者代码中,执行逻辑时间设置的70s,cleanExpireMsg()方法每60s执行一次,有可能第一次执行时,方法内计算的(当前时间的时间戳 - consumeStartTimeStamp)的值小于60s,于是没有执行重发消息的操作。不得已,只能查看源码,ProcessQueue中有个cleanExpireMsg()方法,字面意思看,是清理过期方法,咱设置的consumeTimeout=1,于是每分钟会触发一次。当70s后,逻辑结束,消息进行了其他处理。

2025-08-02 10:11:34 337

原创 windows中rocketmq提示“service not available now, maybe disk full”解决

执行命令 mklink /D store D:\mq\store。删除用户目录下的store目录。以命令行方式启动cmd。

2025-08-01 08:49:15 261

原创 fastjson反序列化时_id的处理

从输出看到,json字符串的_id转为了java对象属性的id,这不是想要的结果。于是,修改java对象,使用了@JSONField(alternateNames = {"id"})属性。这篇文章中也提到了这个问题,于是使用 @JSONField(name = "_id", alternateNames = {"id"})注解。写程序时,借助fastjson,将map对象转为json字符串,然后再通过json字符串转为对应的java对象。结果转换后,结果还是不对,上网查了资料,可以看到,结果正确。

2025-07-29 17:58:36 272

原创 Redisson的布隆过滤器

判断某个元素是否存在时,也是根据m个hash函数进行运算,如果m个位置的元素都为1,说明元素存在,只要某个位置存在一个0,则说明不存在。由于hash冲突,布隆过滤器可以判断元素一定不存在,但是不能保证一定存在,其存在一定的误判率。向布隆过滤器中添加元素时,根据m个hash函数对元素进行运算,得到m个位置;解决redis缓存穿透,当判断不存在该数据时,直接返回;给出一个长度是n的数组,元素的值是0或者1;布隆过滤器用来判断某个元素是否存在。将这m个位置的元素设置为1;防止内容的重复推荐;

2025-07-27 16:17:21 403

原创 Spring AI(14)——文本分块优化

根据源码的逻辑,分割文本时,可能出现如果分隔符的索引小于minChunkSizeChars,就不会对文本进行分割,于是,就会出现句子被断开的情况。根据CL100K_BASE编码,300长度的token转为本文内容后,文本内容的长度在220-250之间(根据本例的中文文档测试,实际存在误差),转换比例在70%到80%多,为了根据特定的字符进行分割,所以minChunkSize的值最好小于210。为此,对源码进行修改,增加分割符的列表,用户可以根据文档的中英文情况,自行设置分割符。

2025-07-26 11:54:39 1126

原创 Spring AI(13)——RAG之RetrievalAugmentationAdvisor

RetrievalAugmentation表示检索增强中介绍了RAG的基本使用,但是其中的QuestionAnswerAdvisor 主要作用是对向量数据库中的所有文档执行相似性搜索。RetrievalAugmentationAdvisor可以更好的体现检索增强。

2025-07-19 11:16:06 908

原创 安装docker时,yum install -y yum-utils报错的解决

centos7,安装docker时,执行yum install -y yum-utils报错。1)进入/etc/yum.repos.d目录,删除其中所有文件。3)再次执行 yum install -y yum-utils。

2025-07-16 19:41:33 378

原创 Spring AI Alibaba(2)——通过Graph实现工作流

基于 Spring AI Alibaba Graph 进行工作流的开发。工作流是以相对固化的模式来人为地拆解任务,将一个大任务拆解为包含多个分支的固化流程。工作流的优势是确定性强,模型作为流程中的一个节点起到的更多是一个分类决策、内容生成的职责,因此它更适合意图识别等类别属性强的应用场景。Spring AI Alibaba Graph 在设计理念上借鉴 LangGraph,并且增加了大量预置 Node、简化了 State 定义过程等,让开发者更容易编写对等低代码平台的工作流、多智能体等。

2025-07-10 21:18:23 980 1

原创 Spring AI Alibaba(1)——基本使用

Spring AI Alibaba(SAA) 是一款以 Spring AI 为基础,深度集成百炼平台,支持 ChatBot、工作流、多智能体应用开发模式的 AI 框架。在 1.0 版本中,Spring AI Alibaba 提供以下核心能力,让开发者可以快速构建自己的 Agent、Workflow 或 Multi-agent 应用。与 Spring AI 的联系和区别。

2025-07-06 16:33:35 1120

原创 Spring AI(12)——调用多模态模型识别和生成图像

修改yml配置注意:这里使用智谱提供的识别图像的glm-4v-flash模型测试代码输出结果。

2025-07-06 14:33:43 506

原创 LangChain4j(20)——调用百度地图MCP服务

MCP Server | 百度地图API SDK地理编码将地址解析为对应的位置坐标输入:address地址信息输出:location逆地理编码将坐标点转换为对应语义化地址输入:location经纬度坐标输出:uid地点检索多种场景的地点以及POI检索, 包括城市检索、圆形区域检索输入:query检索关键词location圆形检索的中心点radius圆形检索的半径region城市检索指定城市输出: POI列表, 包含namelocationaddress等地点详情检索。

2025-06-27 21:35:26 1138 2

原创 LangChain4j(19)——调用SearXNG搜索工具

SearXNG 是一个元搜索引擎,它聚合了其他搜索引擎的结果。

2025-06-25 19:13:13 554

原创 关于微信小程序的真机调试

勾选掉"局域网模式",但要保证电脑和手机处于同一个局域网下,也就是说它们需要连接到同一个wifi。"切换真机模式2.0",根据自己手机的系统选择对应的选项。另外,需要勾选"不校验合法域名......"

2025-06-22 09:41:30 280

原创 关于uniapp解析SSE响应数据的处理

从展示效果看,返回的数据都以“data:”开头,而且数据都发生了换行。这是由于后端返回大模型响应的数据时,需要换行的数据中间也使用了"\n\n",这就和SSE的数据格式产生了冲突。其中,"100 97 116 97 58"表示"data:","10 10"表示"\n\n",而且根据响应数据,我们发现SSE客户端是一次处理一批后端响应的数据。通过uniapp开发与大模型对话的微信小程序,并且后端需要通过SSE向小程序返回响应数据。其中通过正则表达式替换所有的"data:"和"\n\n"。

2025-06-22 09:23:18 735

原创 LangChain4j(18)——通过Xinference调用Rerank模型

也称为重排序模型,它从搜索中获取初始结果集,并重新评估它们,以确保它们更紧密地符合用户的意图。它超越了术语的表面匹配,考虑了搜索查询和文档内容之间更深层次的交互。LangChain4j支持的Rerank模型如下:其中通过onnx调用需要将模型转为onnx后调用,占用内存较多。Cohere、Jina等模型需要收费。本例采用Xinference方式调用。

2025-06-09 22:38:59 959

原创 Spring AI(11)——SSE传输的MCP服务端

支持SSE(Server-Sent Events) 基于 Spring MVC 的服务器传输和可选的STDIO运输。

2025-06-05 21:15:47 1391

原创 Spring AI(10)——STUDIO传输的MCP服务端

Spring AI MCP(模型上下文协议)服务器Starters提供了在 Spring Boot 应用程序中设置 MCP 服务器的自动配置。它支持将 MCP 服务器功能与 Spring Boot 的自动配置系统无缝集成。本文主要演示支持STDIO传输的MCP服务器。

2025-06-05 20:07:32 630

原创 Spring AI(9)——MCP客户端

模型上下文协议 (MCP) 是一种标准化协议,使 AI 模型能够以结构化方式与外部工具和资源交互。它支持多种传输机制,以便在不同环境中提供灵活性。MCP Java SDK 提供模型上下文协议的 Java 实现,通过同步和异步通信模式实现与 AI 模型和工具的标准化交互。Spring AI MCP通过 Spring Boot 集成扩展了 MCP Java SDK,同时提供了客户端和服务器Starters。通过STDIO(in-process) 和/或SSE(远程)访问MCP服务端。

2025-05-29 17:30:42 1345

原创 LangChain4j(17)——MCP客户端

本例使用的msp服务是server-everything。它是一个 MCP 客户端构建者的测试服务器。echo回显输入消息的简单工具输入:message(string):要回显的消息返回: 带有回声消息的文本内容add将两个数字相加输入:a(number):第一个数字b(number):第二个数字返回: 添加的文本结果演示长时间作的进度通知输入:duration(number,默认值:10):持续时间(以秒为单位)

2025-05-28 17:16:45 1788 1

原创 Spring AI(8)——流式响应

通过源码可以看到,调用ChatModel对象调用stream()方法即可实现流式响应。并且其返回值有两种形式:Flux<String>和Flux<ChatResponse>。流式响应允许异步获取响应数据。通过该方式,大模型每次返回一部分token,而不是等到生成完整结果后再返回。测试代码通过ChatModel对象和ChatClient对象分别实现了流式响应。ChatModel接口继承了StreamingChatModel接口。注意:一定要通过浏览器进行测试,否则无法看到流式响应的效果。

2025-05-23 15:07:43 665

原创 Spring AI(7)——RAG

检索增强生成(RAG),用于解决将相关数据纳入提示词中以获得准确 AI 模型响应的挑战。该方法采用批处理式编程模型,从指定的文档中读取非结构化数据,进行转换,然后写入向量数据库。从高层次来看,这是一个 ETL(提取、转换和加载)管道。向量数据库用于 RAG 技术的检索部分。在将非结构化数据加载到向量数据库时,最重要的转换之一是将原始文档分割成更小的片段。将原始文档分割成更小片段的过程有两个重要步骤:在保持内容语义边界的同时将文档分割成部分。

2025-05-20 13:38:44 1223

原创 Spring AI(6)——向量存储

向量数据库是一种特殊类型的数据库,在 AI 应用中发挥着至关重要的作用。在向量数据库中,查询与传统关系型数据库不同。它们执行的是相似性搜索,而非精确匹配。当给定一个向量作为查询时,向量数据库会返回与该查询向量“相似”的向量。Spring AI 通过接口提供了一个抽象的 API,用于与向量数据库交互。

2025-05-15 10:07:10 3227 1

原创 Spring AI(5)——通过嵌入模型进行数据的向量化处理

嵌入是文本、图像或视频的数值表示,用于捕获输入之间的关系。嵌入的工作原理是将文本、图像和视频转换为浮点数数组,称为向量。这些向量旨在捕获文本、图像和视频的含义。嵌入数组的长度称为向量的维度。通过计算两个文本向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象之间的相似性。接口旨在轻松集成 AI 和机器学习中的嵌入模型。其主要功能是将文本转换为数值向量,通常称为嵌入。这些嵌入对于各种任务至关重要,例如语义分析和文本分类。

2025-05-14 11:37:04 1850

原创 Spring AI(4)——工具调用

Tool(name="getTodayDate", description = "获取今天日期信息")System.out.println("获取当前日期时间");大模型调用的工具通过@Toolname:工具的名称。如果未提供,将使用方法名称。AI 模型在调用工具时使用此名称进行识别。因此,同一类中不允许存在名称相同的两个工具。对于特定聊天请求,该名称在模型可用的所有工具中必须是唯一的。:工具的描述,模型可以使用此描述来理解何时以及如何调用该工具。如果未提供,将使用方法名称作为工具描述。

2025-05-13 11:54:45 1687 2

原创 Spring AI(3)——Chat Memory

大型语言模型(LLM)是无状态的,这意味着它们不保留关于以前互动的信息。为了解决这个问题,Spring AI提供了Chat Memory(聊天记忆)功能。通过Chat Memory,用户可以实现在与LLM的多次交互中存储和检索信息。聊天记忆的底层存储由ChatMemoryRepository处理,其唯一责任是存储和检索消息。决定保留哪些消息及何时删除这些消息的权利在于ChatMemory的实现。策略可能包括保留最近的N条消息,保留一定时间段的消息,或者保留指定最大令牌数的消息。

2025-05-11 18:46:53 1989

原创 Spring AI(2)—— 发送消息的API

PromptTemplate是针对用户信息的模版,类似的还有:SystemPromptTemplate,AssistantPromptTemplate。通过源码可以到,Prompt对象中包含属性为List<Message>(聊天消息的列表)和ChatOptions(大模型属性信息的对象)。如果使用不带参数的propmt()方法,需要调用额外调用user()、system()方法设置需要发送的信息。可以通过PromptTemplate设置,也可以通过user()或者system()方法设置。

2025-05-11 08:34:39 840

原创 Spring AI(1)—— 聊天模型基本使用

Spring AI 是一个用于 AI 工程的应用程序框架。其目标是将 Spring 生态系统设计原则应用于 AI 领域。下面,我们通过具体的案例来学习下Spring AI的使用。

2025-05-07 22:49:42 996

原创 LangChain4j(16)——使用milvus进行向量存储

非结构化数据(如文本、图像和音频)格式各异,蕴含丰富的潜在语义,因此分析起来极具挑战性。为了处理这种复杂性,Embeddings 被用来将非结构化数据转换成能够捕捉其基本特征的数字向量。然后将这些向量存储在向量数据库中,从而实现快速、可扩展的搜索和分析。Milvus 提供强大的数据建模功能,使您能够将非结构化或多模式数据组织成结构化的 Collections。它支持多种数据类型,适用于不同的属性模型,包括常见的数字和字符类型、各种向量类型、数组、集合和 JSON,为您节省了维护多个数据库系统的精力。

2025-05-01 07:50:40 1796 1

空空如也

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

TA关注的人

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