<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[D_ENG_F的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/D_ENG_F</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; D_ENG_F]]></copyright><item><title><![CDATA[裸调LLM_API-Java的HTTP客户端就够]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/169945840</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/169945840</guid><author>D_ENG_F</author><pubDate>Wed, 04 Nov 2026 13:45:00 +0800</pubDate><description><![CDATA[本文演示用 Java JDK 自带的 HttpClient 裸调大模型 API，通过手动构造 HTTP 请求与解析响应，直观理解 tool_use 工具调用的完整流程。一次裸调，看清报文结构，掌握工单循环四步：发请求、解析 tool_use、执行工具、追加 tool_result 重发。无框架依赖，排查问题更精准，换供应商有基准，性能瓶颈看得清。代码仅需三行即可跑通，是理解 AI 接口本质的必经之路。]]></description><category></category></item><item><title><![CDATA[给Agent写测试-工具调用的回归怎么保]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/169945546</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/169945546</guid><author>D_ENG_F</author><pubDate>Wed, 04 Nov 2026 08:30:00 +0800</pubDate><description><![CDATA[本文提出“测行为不测文字”的三层测试防线，解决 Agent 工具调用回归难题：第一层工具单测（纯函数）；第二层循环集成测，通过 mock 模型断言工具调用、参数与回填的正确性；第三层评测集，固定问答对对比行为快照。代码演示了最小可运行测试，强调断言行为而非模型输出，确保提示词改动可安全合并。]]></description><category></category></item><item><title><![CDATA[SpringAI的Advisors-用拦截器的思维管Agent]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/169838161</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/169838161</guid><author>D_ENG_F</author><pubDate>Tue, 03 Nov 2026 13:45:00 +0800</pubDate><description><![CDATA[Spring AI 的 Advisor 机制借鉴拦截器思想，将日志、记忆、敏感词拦截等横切逻辑集中于对话链中，通过 CallAroundAdvisor 实现请求前检查与响应后处理。其链式调用结构清晰，支持按 getOrder 控制执行顺序，显著减少业务代码污染。本文以护栏 Advisor 为例，演示如何拦截含敏感词的请求，并结合内置日志、记忆等 Advisor，实现代码整洁与逻辑复用。]]></description><category></category></item><item><title><![CDATA[RAG的Java落地-从切分入库到检索问答]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/169838018</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/169838018</guid><author>D_ENG_F</author><pubDate>Tue, 03 Nov 2026 08:30:00 +0800</pubDate><description><![CDATA[本文详解RAG在Java中的落地实践，构建零依赖的五步流水线：文档切分、文本表示、入库、检索与上下文拼接。通过词频打分实现简易检索，结合重叠切块与来源编号引用，有效控制幻觉。代码骨架可直接运行，先验证流程再升级向量模型，强调“先跑通形状，再换昂贵组件”的务实路径。]]></description><category></category></item><item><title><![CDATA[LangChain4j写一次工具调用-SpringAI的另一副面孔]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/169837904</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/169837904</guid><author>D_ENG_F</author><pubDate>Mon, 02 Nov 2026 13:39:51 +0800</pubDate><description><![CDATA[本文通过对比 LangChain4j 与 Spring AI 实现同一天气查询工具调用，揭示二者在工单循环内部完全一致，差异仅在于语法与装配方式：Spring AI 采用构建器式、依赖注入，而 LangChain4j 使用接口门面与手工 builder，更适配非 Spring 环境。通过实跑 demo 与日志比对，验证了两框架底层逻辑统一，选型应基于工程习惯而非功能差异。]]></description><category></category></item><item><title><![CDATA[虚拟线程-JDK21之后并发的换轨]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/169364155</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/169364155</guid><author>D_ENG_F</author><pubDate>Thu, 29 Oct 2026 13:00:00 +0800</pubDate><description><![CDATA[JDK 21 引入虚拟线程，以轻量级任务替代昂贵的平台线程，实现“一万个连接一万个线程”的低成本并发。虚拟线程栈仅千字节，可创建数十万，由少量载体线程调度，阻塞时自动让出载体，显著降低内存与上下文切换开销。使用 Thread.ofVirtual().start() 或 newVirtualThreadPerTaskExecutor() 即可启用，无需池化。但需注意：避免在 synchronized 中阻塞（已修复）、慎用 ThreadLocal（改用 ScopedValue）、CPU 密集型任务无收益。实测]]></description><category></category></item><item><title><![CDATA[反射与注解-框架的地下管网]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/169364078</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/169364078</guid><author>D_ENG_F</author><pubDate>Thu, 29 Oct 2026 09:30:00 +0800</pubDate><description><![CDATA[本文揭示了注解与反射在框架中的底层机制：注解仅为运行时可读的标记，依赖@Retention(RetentionPolicy.RUNTIME)保留；框架通过反射扫描类、读取注解，并据此实现IoC、AOP等行为。从@Component到@Transactional，本质是同一套“管网”——反射驱动的动态装配链。虽反射性能略低，但启动期开销可控，真正隐患在于封装破坏与调试困难。通过手写迷你派发器，读者可亲历注解驱动的全流程，理解“魔法”背后的工程逻辑：注解是便签，反射是读签的手，框架则是照办的人。]]></description><category></category></item><item><title><![CDATA[SpringAI写第一个Agent-把工单循环跑起来]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/169354221</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/169354221</guid><author>D_ENG_F</author><pubDate>Wed, 28 Oct 2026 13:09:34 +0800</pubDate><description><![CDATA[本文基于 Spring AI 2.0.1，演示如何用 Java 实现一个能调用天气工具的 Agent。通过 @Tool 注解将方法暴露为工具，结合 ChatClient 的 .tools() 注册，实现模型生成工单、框架自动调用、结果回填的完整循环。日志可清晰追踪报文流转，验证“工单式”交互的真实运行。从配置、编码到跑通，仅需三步，即可掌握 Agent 核心机制，为后续多轮对话、流式输出等进阶应用打下坚实基础。]]></description><category></category></item><item><title><![CDATA[MCP-给模型接工具的插座]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/169259417</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/169259417</guid><author>D_ENG_F</author><pubDate>Wed, 28 Oct 2026 09:00:00 +0800</pubDate><description><![CDATA[MCP（Model Context Protocol）是基于JSON-RPC 2.0的标准化工具连接协议，通过“插座”模式实现模型应用与外部工具的即插即用。它将工具清单（tools/list）和调用（tools/call）标准化，使工具方只需实现一次接口，即可被所有支持MCP的宿主调用。从后端视角看，MCP本质是一种轻量级RPC，传输层支持stdio或Streamable HTTP，核心逻辑与传统服务开发一致。文中提供最小Python Server示例，验证了其易用性与通用性。适用场景取决于工具需被多少宿主]]></description><category></category></item><item><title><![CDATA[Agent的记忆落库-上下文存进MySQL之后]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/169167600</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/169167600</guid><author>D_ENG_F</author><pubDate>Mon, 26 Oct 2026 19:04:31 +0800</pubDate><description><![CDATA[本文详解Agent记忆落库方案：将对话历史存入MySQL，通过chat_message表结构实现重启不丢、多实例共享。设计关键包括按conversation_id+id建索引、保留tool_use_id确保工具调用可追溯。读取时按时间排序拼装消息，结合SQL截断策略（如取最近20条）优化上下文长度。配合Redis缓存热点会话提升性能。附Python示例演示从建表到加载的完整闭环，强调“记忆是你的表，窗口只是行李箱”。适用于对话历史持久化，检索记忆等进阶功能另需扩展。]]></description><category></category></item><item><title><![CDATA[分布式锁与幂等]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/169053764</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/169053764</guid><author>D_ENG_F</author><pubDate>Sun, 25 Oct 2026 10:48:03 +0800</pubDate><description><![CDATA[分布式锁需解决跨机器同步问题，单机锁失效。核心三坑：锁过期导致并发（需看门狗续期）、误删他人锁（需owner校验+Lua原子删除）、主从切换丢锁（建议以数据库幂等兜底）。锁仅防“同时”，幂等才防“重复”——通过唯一约束、状态机、乐观锁实现。最终原则：锁要认主人、活得比业务久，但真正可靠仍靠幂等。]]></description><category></category></item><item><title><![CDATA[Linux线上排查命令]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/168975069</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/168975069</guid><author>D_ENG_F</author><pubDate>Sat, 24 Oct 2026 17:20:20 +0800</pubDate><description><![CDATA[本文系统梳理了Linux线上CPU与内存飙高的排查路线：CPU高时，通过top→top -Hp→jstack定位耗CPU线程，识别死循环或锁竞争；内存高时，用top和jmap分析堆外与堆内占用，结合堆dump找大对象。配合Arthas实现无重启诊断。附带可运行的死循环实验，强化实战能力。核心口诀：CPU看线程，内存找对象。]]></description><category></category></item><item><title><![CDATA[慢SQL与索引失效]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/168843054</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/168843054</guid><author>D_ENG_F</author><pubDate>Fri, 23 Oct 2026 08:50:35 +0800</pubDate><description><![CDATA[索引失效的根源在于写法让优化器无法利用其有序性或计算出走索引更贵。常见原因包括：函数/运算包裹列、隐式类型转换、前导模糊查询、违反最左前缀、OR连接非索引列及数据量过小。修复关键在改写条件使列原值暴露，辅以联合索引与覆盖索引设计。通过EXPLAIN验证，结合慢查询日志对比，可精准定位并提升性能。]]></description><category></category></item><item><title><![CDATA[HTTP缓存与连接]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/168750786</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/168750786</guid><author>D_ENG_F</author><pubDate>Thu, 22 Oct 2026 12:51:44 +0800</pubDate><description><![CDATA[本文解析HTTP性能两大核心：缓存与连接。强缓存通过Cache-Control: max-age实现，资源在有效期内直接使用本地副本，不发请求；过期后进入协商缓存，利用ETag或Last-Modified进行校验，命中则返回304，节省流量。连接层面，HTTP/1.1的Keep-Alive减少握手开销，但存在队头阻塞；HTTP/2多路复用和HTTP/3 QUIC解决此问题。通过Python示例验证缓存机制，强调“强缓存无请求，协商缓存省流量，长连接省握手”的核心原则，指导优化首屏加载与接口响应。]]></description><category></category></item><item><title><![CDATA[TCP连接的一生]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/168660632</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/168660632</guid><author>D_ENG_F</author><pubDate>Thu, 22 Oct 2026 09:15:00 +0800</pubDate><description><![CDATA[TCP连接的一生贯穿三次握手建立、四次挥手释放，其间经历TIME_WAIT状态以确保可靠关闭，避免旧报文干扰。由于TCP是字节流协议，消息边界需自行定义，否则易发生粘包或拆包。通过长度前缀、分隔符或定长等方法可解决此问题。高并发下大量短连接会导致端口耗尽，需结合长连接复用、连接池及内核调优应对。理解连接生命周期，才能真正掌握网络编程的本质。]]></description><category></category></item><item><title><![CDATA[SpringIOC-容器启动那几秒发生了什么]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/168525933</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/168525933</guid><author>D_ENG_F</author><pubDate>Wed, 21 Oct 2026 13:15:00 +0800</pubDate><description><![CDATA[Spring IOC容器启动时，经历扫描、实例化、依赖注入、初始化和单例注册五步流水线。循环依赖通过二级缓存“提前曝光”半成品解决，仅字段/setter注入可行，构造器注入无解。Spring Boot 2.6+默认禁用循环依赖，强调设计修复而非配置绕过。报错定位关键在流水线节点，迷你容器演示了核心机制。]]></description><category></category></item><item><title><![CDATA[SpringAOP-动态代理的两副面孔]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/168439674</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/168439674</guid><author>D_ENG_F</author><pubDate>Wed, 21 Oct 2026 09:15:00 +0800</pubDate><description><![CDATA[Spring AOP通过动态代理在对象外层包裹一层“壳”实现切面功能，但自调用、final修饰、非容器管理对象及私有方法等场景会绕过代理，导致事务、缓存等注解失效。JDK代理依赖接口，CGLIB基于子类生成，选择策略随版本变化。核心原则：调用必须经过代理对象，否则切面不生效。]]></description><category></category></item><item><title><![CDATA[synchronized与ReentrantLock-锁的账单]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/168439465</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/168439465</guid><author>D_ENG_F</author><pubDate>Tue, 20 Oct 2026 13:15:00 +0800</pubDate><description><![CDATA[本文对比synchronized与ReentrantLock，揭示二者“锁的账单”——安全代价与功能边界。synchronized语法简洁、自动释放、可重入且支持锁升级，适合简单同步场景；ReentrantLock则提供超时、可中断、公平锁及多Condition等高级功能，但需手动解锁，复杂度更高。选型原则：优先用synchronized，需求涉及超时、中断或监控时再换ReentrantLock。通过代码演示，直观展现锁对并发安全的保障及工具箱的价值。]]></description><category></category></item><item><title><![CDATA[volatile与Java内存模型]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/168332120</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/168332120</guid><author>D_ENG_F</author><pubDate>Tue, 20 Oct 2026 09:30:00 +0800</pubDate><description><![CDATA[本文详解 volatile 在 Java 内存模型中的作用：解决可见性（写后立即对其他线程可见）与有序性（禁止指令重排）问题。它不保证原子性，故不能替代锁或原子类。通过双检锁、计数器等实例，揭示 volatile 的适用边界——仅用于一写多读的标志位，而共享计数需用 AtomicInteger 或 synchronized。理解 JMM 的内存屏障机制，才能避免滥用或误用。]]></description><category></category></item><item><title><![CDATA[BIO-NIO与多路复用]]></title><link>https://blog.youkuaiyun.com/D_ENG_F/article/details/168526736</link><guid>https://blog.youkuaiyun.com/D_ENG_F/article/details/168526736</guid><author>D_ENG_F</author><pubDate>Tue, 20 Oct 2026 09:10:02 +0800</pubDate><description><![CDATA[本文剖析BIO、NIO与多路复用的演进逻辑：从线程阻塞等待（BIO）到程序轮询（NIO），最终由内核代为通知就绪事件（epoll）。通过一个单线程Selector演示，100个连接仅需一个线程即可高效处理，对比BIO的“一线程一连接”模型，显著降低内存与调度开销。核心思想在于“谁在等”——让内核代替用户程序监控I/O状态，实现高并发下的资源优化。]]></description><category></category></item></channel></rss>