自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 裸调LLM_API-Java的HTTP客户端就够

本文演示用 Java JDK 自带的 HttpClient 裸调大模型 API,通过手动构造 HTTP 请求与解析响应,直观理解 tool_use 工具调用的完整流程。一次裸调,看清报文结构,掌握工单循环四步:发请求、解析 tool_use、执行工具、追加 tool_result 重发。无框架依赖,排查问题更精准,换供应商有基准,性能瓶颈看得清。代码仅需三行即可跑通,是理解 AI 接口本质的必经之路。

2026-11-04 13:45:00 172

原创 给Agent写测试-工具调用的回归怎么保

本文提出“测行为不测文字”的三层测试防线,解决 Agent 工具调用回归难题:第一层工具单测(纯函数);第二层循环集成测,通过 mock 模型断言工具调用、参数与回填的正确性;第三层评测集,固定问答对对比行为快照。代码演示了最小可运行测试,强调断言行为而非模型输出,确保提示词改动可安全合并。

2026-11-04 08:30:00 198

原创 SpringAI的Advisors-用拦截器的思维管Agent

Spring AI 的 Advisor 机制借鉴拦截器思想,将日志、记忆、敏感词拦截等横切逻辑集中于对话链中,通过 CallAroundAdvisor 实现请求前检查与响应后处理。其链式调用结构清晰,支持按 getOrder 控制执行顺序,显著减少业务代码污染。本文以护栏 Advisor 为例,演示如何拦截含敏感词的请求,并结合内置日志、记忆等 Advisor,实现代码整洁与逻辑复用。

2026-11-03 13:45:00 223

原创 RAG的Java落地-从切分入库到检索问答

本文详解RAG在Java中的落地实践,构建零依赖的五步流水线:文档切分、文本表示、入库、检索与上下文拼接。通过词频打分实现简易检索,结合重叠切块与来源编号引用,有效控制幻觉。代码骨架可直接运行,先验证流程再升级向量模型,强调“先跑通形状,再换昂贵组件”的务实路径。

2026-11-03 08:30:00 415

原创 LangChain4j写一次工具调用-SpringAI的另一副面孔

本文通过对比 LangChain4j 与 Spring AI 实现同一天气查询工具调用,揭示二者在工单循环内部完全一致,差异仅在于语法与装配方式:Spring AI 采用构建器式、依赖注入,而 LangChain4j 使用接口门面与手工 builder,更适配非 Spring 环境。通过实跑 demo 与日志比对,验证了两框架底层逻辑统一,选型应基于工程习惯而非功能差异。

2026-11-02 13:39:51 445

原创 虚拟线程-JDK21之后并发的换轨

JDK 21 引入虚拟线程,以轻量级任务替代昂贵的平台线程,实现“一万个连接一万个线程”的低成本并发。虚拟线程栈仅千字节,可创建数十万,由少量载体线程调度,阻塞时自动让出载体,显著降低内存与上下文切换开销。使用 Thread.ofVirtual().start() 或 newVirtualThreadPerTaskExecutor() 即可启用,无需池化。但需注意:避免在 synchronized 中阻塞(已修复)、慎用 ThreadLocal(改用 ScopedValue)、CPU 密集型任务无收益。实测

2026-10-29 13:00:00 340

原创 反射与注解-框架的地下管网

本文揭示了注解与反射在框架中的底层机制:注解仅为运行时可读的标记,依赖@Retention(RetentionPolicy.RUNTIME)保留;框架通过反射扫描类、读取注解,并据此实现IoC、AOP等行为。从@Component到@Transactional,本质是同一套“管网”——反射驱动的动态装配链。虽反射性能略低,但启动期开销可控,真正隐患在于封装破坏与调试困难。通过手写迷你派发器,读者可亲历注解驱动的全流程,理解“魔法”背后的工程逻辑:注解是便签,反射是读签的手,框架则是照办的人。

2026-10-29 09:30:00 132

原创 SpringAI写第一个Agent-把工单循环跑起来

本文基于 Spring AI 2.0.1,演示如何用 Java 实现一个能调用天气工具的 Agent。通过 @Tool 注解将方法暴露为工具,结合 ChatClient 的 .tools() 注册,实现模型生成工单、框架自动调用、结果回填的完整循环。日志可清晰追踪报文流转,验证“工单式”交互的真实运行。从配置、编码到跑通,仅需三步,即可掌握 Agent 核心机制,为后续多轮对话、流式输出等进阶应用打下坚实基础。

2026-10-28 13:09:34 642

原创 MCP-给模型接工具的插座

MCP(Model Context Protocol)是基于JSON-RPC 2.0的标准化工具连接协议,通过“插座”模式实现模型应用与外部工具的即插即用。它将工具清单(tools/list)和调用(tools/call)标准化,使工具方只需实现一次接口,即可被所有支持MCP的宿主调用。从后端视角看,MCP本质是一种轻量级RPC,传输层支持stdio或Streamable HTTP,核心逻辑与传统服务开发一致。文中提供最小Python Server示例,验证了其易用性与通用性。适用场景取决于工具需被多少宿主

2026-10-28 09:00:00 315

原创 Agent的记忆落库-上下文存进MySQL之后

本文详解Agent记忆落库方案:将对话历史存入MySQL,通过chat_message表结构实现重启不丢、多实例共享。设计关键包括按conversation_id+id建索引、保留tool_use_id确保工具调用可追溯。读取时按时间排序拼装消息,结合SQL截断策略(如取最近20条)优化上下文长度。配合Redis缓存热点会话提升性能。附Python示例演示从建表到加载的完整闭环,强调“记忆是你的表,窗口只是行李箱”。适用于对话历史持久化,检索记忆等进阶功能另需扩展。

2026-10-26 19:04:31 452

原创 分布式锁与幂等

分布式锁需解决跨机器同步问题,单机锁失效。核心三坑:锁过期导致并发(需看门狗续期)、误删他人锁(需owner校验+Lua原子删除)、主从切换丢锁(建议以数据库幂等兜底)。锁仅防“同时”,幂等才防“重复”——通过唯一约束、状态机、乐观锁实现。最终原则:锁要认主人、活得比业务久,但真正可靠仍靠幂等。

2026-10-25 10:48:03 291

原创 Linux线上排查命令

本文系统梳理了Linux线上CPU与内存飙高的排查路线:CPU高时,通过top→top -Hp→jstack定位耗CPU线程,识别死循环或锁竞争;内存高时,用top和jmap分析堆外与堆内占用,结合堆dump找大对象。配合Arthas实现无重启诊断。附带可运行的死循环实验,强化实战能力。核心口诀:CPU看线程,内存找对象。

2026-10-24 17:20:20 95

原创 慢SQL与索引失效

索引失效的根源在于写法让优化器无法利用其有序性或计算出走索引更贵。常见原因包括:函数/运算包裹列、隐式类型转换、前导模糊查询、违反最左前缀、OR连接非索引列及数据量过小。修复关键在改写条件使列原值暴露,辅以联合索引与覆盖索引设计。通过EXPLAIN验证,结合慢查询日志对比,可精准定位并提升性能。

2026-10-23 08:50:35 298

原创 HTTP缓存与连接

本文解析HTTP性能两大核心:缓存与连接。强缓存通过Cache-Control: max-age实现,资源在有效期内直接使用本地副本,不发请求;过期后进入协商缓存,利用ETag或Last-Modified进行校验,命中则返回304,节省流量。连接层面,HTTP/1.1的Keep-Alive减少握手开销,但存在队头阻塞;HTTP/2多路复用和HTTP/3 QUIC解决此问题。通过Python示例验证缓存机制,强调“强缓存无请求,协商缓存省流量,长连接省握手”的核心原则,指导优化首屏加载与接口响应。

2026-10-22 12:51:44 341

原创 TCP连接的一生

TCP连接的一生贯穿三次握手建立、四次挥手释放,其间经历TIME_WAIT状态以确保可靠关闭,避免旧报文干扰。由于TCP是字节流协议,消息边界需自行定义,否则易发生粘包或拆包。通过长度前缀、分隔符或定长等方法可解决此问题。高并发下大量短连接会导致端口耗尽,需结合长连接复用、连接池及内核调优应对。理解连接生命周期,才能真正掌握网络编程的本质。

2026-10-22 09:15:00 249

原创 SpringIOC-容器启动那几秒发生了什么

Spring IOC容器启动时,经历扫描、实例化、依赖注入、初始化和单例注册五步流水线。循环依赖通过二级缓存“提前曝光”半成品解决,仅字段/setter注入可行,构造器注入无解。Spring Boot 2.6+默认禁用循环依赖,强调设计修复而非配置绕过。报错定位关键在流水线节点,迷你容器演示了核心机制。

2026-10-21 13:15:00 169

原创 SpringAOP-动态代理的两副面孔

Spring AOP通过动态代理在对象外层包裹一层“壳”实现切面功能,但自调用、final修饰、非容器管理对象及私有方法等场景会绕过代理,导致事务、缓存等注解失效。JDK代理依赖接口,CGLIB基于子类生成,选择策略随版本变化。核心原则:调用必须经过代理对象,否则切面不生效。

2026-10-21 09:15:00 351

原创 synchronized与ReentrantLock-锁的账单

本文对比synchronized与ReentrantLock,揭示二者“锁的账单”——安全代价与功能边界。synchronized语法简洁、自动释放、可重入且支持锁升级,适合简单同步场景;ReentrantLock则提供超时、可中断、公平锁及多Condition等高级功能,但需手动解锁,复杂度更高。选型原则:优先用synchronized,需求涉及超时、中断或监控时再换ReentrantLock。通过代码演示,直观展现锁对并发安全的保障及工具箱的价值。

2026-10-20 13:15:00 628

原创 volatile与Java内存模型

本文详解 volatile 在 Java 内存模型中的作用:解决可见性(写后立即对其他线程可见)与有序性(禁止指令重排)问题。它不保证原子性,故不能替代锁或原子类。通过双检锁、计数器等实例,揭示 volatile 的适用边界——仅用于一写多读的标志位,而共享计数需用 AtomicInteger 或 synchronized。理解 JMM 的内存屏障机制,才能避免滥用或误用。

2026-10-20 09:30:00 859

原创 BIO-NIO与多路复用

本文剖析BIO、NIO与多路复用的演进逻辑:从线程阻塞等待(BIO)到程序轮询(NIO),最终由内核代为通知就绪事件(epoll)。通过一个单线程Selector演示,100个连接仅需一个线程即可高效处理,对比BIO的“一线程一连接”模型,显著降低内存与调度开销。核心思想在于“谁在等”——让内核代替用户程序监控I/O状态,实现高并发下的资源优化。

2026-10-20 09:10:02 183

原创 消息队列的重复消费与顺序

消息队列的重复消费与顺序问题源于其 at-least-once 投递机制。重复来自生产重试、消费未提交位点或 broker 重投;乱序则因多线程、批量处理或重试插队。解决之道:重复靠幂等(去重表、业务约束、本地消息表),顺序靠分区路由与串行消费。核心原则:重复由消费端兜底,顺序由分区保障。

2026-10-19 13:30:00 671

原创 Redis缓存三大问题-穿透击穿雪崩

Redis缓存三大问题——穿透、击穿、雪崩,本质区别在于请求如何打穿缓存。穿透源于查询不存在的key,可通过缓存空值或布隆过滤器防御;击穿因热点key过期引发并发重建,宜用互斥锁或逻辑过期解决;雪崩由批量失效或宕机导致,需加随机过期时间、多级缓存与限流兜底。核心原则:分清病因,对症下药,避免无效防御。

2026-10-19 09:15:00 499

原创 MySQL事务与隔离级别-快照读为什么读得快

快照读通过MVCC实现高效并发:事务启动时生成ReadView,依据版本链与三规则(事务ID比较)判断数据可见性,避免加锁。在RR隔离级别下,复用首次读取的ReadView,确保不可重复读和幻读被抑制。快照读不阻塞,读得快;当前读需加锁保证一致性。结合版本链与可见性判断,理解了“为何不加锁仍能读到一致数据”。

2026-10-17 20:39:41 183

原创 JVM内存分区与GC日志怎么读

JVM 内存分为堆、元空间、栈等区域,不同 OOM 类型对应不同病因:堆溢出(Java heap space)、元空间溢出(Metaspace)、栈溢出(StackOverflowError)及线程创建失败。GC 日志中“Pause Young”表示新生代回收,关键字段如回收前后内存变化、停顿时间可判断性能瓶颈。通过观察日志中的 Full GC、停顿时长与剩余内存趋势,可快速定位内存泄漏或调优方向。

2026-10-15 15:38:16 145

原创 线程池的七个参数每个都在防什么

线程池七个参数各防一种灾难:corePoolSize防任务无人处理,maximumPoolSize防线程爆炸,keepAliveTime防空闲线程堆积,workQueue(必须有界)防内存溢出,threadFactory提升可观测性,rejectedExecutionHandler防止任务静默丢失。路由顺序为核心→队列→最大→拒绝,无界队列会使最大线程失效。推荐手写配置,禁用Executors工厂方法,压测定参,确保防线真实有效。

2026-10-15 08:30:00 781

原创 HashMap用了这么多年它是怎么存的

本文详解JDK 8中HashMap的put操作全流程:通过哈希扰动、位运算定位桶位置,链表处理冲突,链表长度≥8且数组长度≥64时转红黑树,超过负载因子(0.75)触发扩容。结合迷你实现演示核心逻辑,揭示2的幂、扰动函数、树化与扩容的设计原理,并警示常见错误如未重写hashCode、并发修改异常等。代码级剖析让“键值对存入”不再神秘。

2026-10-14 20:29:47 287

原创 Spring AI 还是 LangChain4j:三道判断题帮你选

Spring 项目要加 agent,Spring AI 和 LangChain4j 都承诺几分钟接入,选谁取决于你的项目愿意长期养哪套习惯。文章对照两边的 @Tool 写法,给出三道选型判断题:主栈是不是Spring、要约定还是要零件、信哪条维护线。版本核验到 2026-10-10(Spring AI 2.0.1、LangChain4j 1.22.0),两个项目都在活跃期,动手前请再核一次。

2026-10-14 09:00:00 305

原创 微调-RAG-上下文工程-三个词在解决什么问题

「把文档喂给模型微调一下」,这句话里的三个词用错了两个。微调动模型权重,RAG 补资料,上下文工程管窗口预算,文章给症状对照表和一个装箱演示。三个词的定义各家文档不统一,按用途记比按名词记稳,尝试顺序是先装箱、再资料、最后权重。

2026-10-13 13:30:00 539

原创 Java异常堆栈怎么读-三步挖到根因

Java 报错的第一行常常只是包装,真答案住在最底下的 Caused by里。文章把堆栈拆成异常头、调用帧、原因链,给出三步读法和友好 NPE、ClassNotFoundException 与 NoClassDefFoundError的对照,配一个可运行的异常链演示。混淆过的堆栈要配 mapping 文件还原,异步线程会吞栈,边界文内写明。

2026-10-13 08:45:00 428

原创 B+树用大白话讲一次-MySQL索引为什么快

加个索引,十秒的查询变毫秒,省下来的是磁盘读页次数,不是比较次数。文章用扇出算术讲清千万行的 B+树为什么只有三层,讲透最左前缀、回表和覆盖索引,附一个 IO 账单计算器。EXPLAIN 的输出随 MySQL版本变化,分库分表后的全局索引不在这篇范围。

2026-10-12 13:45:00 480

原创 导出10万行Excel把服务打挂-流式写入的账单

导出按钮点下去,十万行数据要变成一个 Excel。运气好,接口转圈半分钟,用户骂一句慢。运气差,整个服务的接口跟着卡,最后 OOM 重启,别人的请求也被拖下水。炸的不是 Excel 功能,是内存账单。这笔账算明白,流式写入就不用背,看懂就会用。结论先放这儿:行数过万,导出就该走流式写入,把内存账单的计价单位从「行数」改成「窗口」。

2026-10-12 08:45:00 173

原创 工单十分钟没回来-超时轮询与并行

「生成周报」要跑七分钟,第五分钟请求超时报错,任务其实在服务器上快跑完了。文章把超时分成连接、读、总三层预算,长任务拆成提交和查询两个工具,并行工单守住限流、幂等和 tool_use_id 配对,附一段可运行的 Python演示。消息队列和分布式调度不在这篇,轮询查回来的字后面每轮请求都要再付一次。

2026-10-09 15:06:54 175

原创 工具是模型调的门是你把的

数据库密码只要贴进过一次提示词,就会顺着对话历史进日志、进导出文件。工具是模型决定调用的,门要由代码把住,密钥不进对话、权限按最小发、高危操作二次确认。这篇只管凭证和权限边界,加解密和审计是更大的工程。

2026-10-09 14:47:57 139

原创 流式输出就是一次不收尾的HTTP响应

从后端HTTP视角拆解大模型流式输出的SSE机制。对比普通响应与流式响应的核心报文差异,附可直接运行的服务端实现与客户端接收代码,详解断线续传、心跳保活、Nginx反代缓冲三大生产环境常见坑及排查路径,说明流式模式下工具调用的增量拼装逻辑,帮你看懂打字机效果的本质,避开部署常见问题。

2026-10-08 13:37:43 529

原创 模型没有记忆-对话历史是一份状态

从后端工程视角拆解 AI Agent 对话记忆的本质:大模型 API 本身是无状态的,所谓记忆完全由业务代码维护的对话历史数组实现。详解历史数据的存储位置、存储内容与读写循环,用「内存 - 硬盘」类比解释上下文窗口限制,对比滑动窗口、摘要压缩、分层三种常用截断方案,并给出模型 “失忆” 问题的排查思路。

2026-10-08 13:27:52 281

原创 工具调用挂了以后-重试幂等与限流

工具调用挂了就立刻重发,一次网络抖动就可能变成重复扣款。文章把失败分成四种形态,网络错误和 5xx用指数退避重试,重复执行靠幂等键拦住,429 按 Retry-After 等待,只有参数错误值得包成 tool_result让模型改。幂等键要对方服务端配合,各家限流口径以官方文档为准。

2026-10-07 14:21:50 382

原创 一次工具调用就是一次HTTP请求

从后端工程师熟悉的 HTTP 接口视角,拆解 AI Agent 工具调用的完整闭环。把工具定义、tool_use 工单、参数校验、结果回填,对应回接口文档、请求、入参校验、响应的经典后端模型,帮你用已有知识快速看懂 Agent 本质,降低入门门槛。

2026-10-07 13:30:34 700

原创 宝塔部署SpringBoot3.2到HTTPS的坑清单

宝塔面板部署 Spring Boot 3.2 并配置 HTTPS 的完整排坑清单。按启动层、反代层、证书层三层逐层排查,覆盖启动失败、HTTP/HTTPS 重定向跳转、文件上传 413、WebSocket 握手失败、证书失效等常见问题,每条都附报错特征、根因分析、修复代码和可直接执行的自查命令。

2026-10-06 22:18:23 531

原创 2026年Java开发破局:一个大二学生的思考

2026年不是Java的末日,但它一定是「混日子型程序员」的末日。你还没定型,你还有时间选对方向。AI把入门门槛砸掉了,但它把真正有深度的人抬得更高。我不会成为那个海投300份简历已读不回的人。因为从现在开始,我已经在选对的路上了。要么进化,要么腐烂。我选进化。🚀一个大二Java学生的真实思考。如果你也在迷茫,评论区聊聊你是怎么规划的?

2026-06-28 15:06:50 687

空空如也

空空如也

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

TA关注的人

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