<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[omenkk7的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/skdoj</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; skdoj]]></copyright><item><title><![CDATA[【Agent工程设计】工具太多导致上下文爆炸-从ToolSearch到PTC]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/169837663</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/169837663</guid><author>skdoj</author><pubDate>Mon, 02 Nov 2026 13:33:20 +0800</pubDate><description><![CDATA[工具定义超过 30 到 50 个，模型挑工具就开始变差。这句话后来被问得最多。原因不难理解，现在接工具太容易了：装一个 MCP server，十几二十个工具就进来了；再接上 GitHub、Slack、浏览器、数据库，几十上百个工具很快就攒齐了。1.工具定义： 每个工具的名字、描述、参数 schema 都要放进 context，不管这一轮用不用得上。当系统的工具，接入的服务，MCP等过多，对话还没开始，就已经占用掉了很多token。2.中间结果：工具每执行一次，结果就整段回到对话里。模型真正想要的可能只是个结]]></description><category></category></item><item><title><![CDATA[上下文工程：优化系统提示词，利用 KV Cache 降低 Token 成本]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/166256113</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/166256113</guid><author>skdoj</author><pubDate>Mon, 21 Sep 2026 22:20:57 +0800</pubDate><description><![CDATA[在 Agent 系统中，系统提示词往往是最稳定、也最容易重复计算的一部分。时间、请求 ID、用户临时状态等动态信息如果直接写进长系统提示词，会破坏 KV Cache 的前缀匹配。稳定规则放在系统提示词中动态时间放在独立消息中消息位置固定同一天内保持静态前缀不变这套方案没有减少模型需要知道的信息，只调整了信息的组织方式。上下文工程的一个实用判断是：让稳定内容尽可能早出现，让动态内容尽可能晚出现。Manus 的上下文工程实践：构建 Manus 的经验。]]></description><category></category></item><item><title><![CDATA[【无标题】]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/163999684</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/163999684</guid><author>skdoj</author><pubDate>Sun, 23 Aug 2026 17:15:15 +0800</pubDate><description><![CDATA[摘要： Claude Code 的工具设计围绕“精准赋能模型”展开，通过三阶段演进解决核心问题：1. 任务管理从弥补注意力缺陷（TodoWrite）升级为多智能体协作框架（Task Tool）；2. 搜索工具摒弃静态RAG，采用模型主导的渐进式探索（Agentic Search），动态追踪代码上下文；3. 工具管理通过子智能体解耦功能（如Guide专精文档查询），避免上下文污染与选择负担。核心启示：工具设计需动态适配模型能力，平衡赋能与约束，最终实现高效协作。]]></description><category></category></item><item><title><![CDATA[【MySQL专题】1.一条更新SQL语句是如何执行的]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/161172761</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/161172761</guid><author>skdoj</author><pubDate>Sun, 17 May 2026 23:21:21 +0800</pubDate><description><![CDATA[首先 先通过磁盘IO 找到对应的数据页 如果数据页在BufferPool中 就直接对内存中数据页进行操作 如果数据页不存在于BufferPool中 需要先从磁盘读取数据页 加载到BufferPool   对应上文 会先通过索引快速找到id=21的数据 将数据页加载到BufferPool(如果不存在于BufferPool的话)redolog日志是MySQL 存储引擎层的物理日志 记录事务修改的操作以及结果 他用于保证事务的持久性 能够保证数据持久化和崩溃恢复。]]></description><category></category></item><item><title><![CDATA[网络IO模型-从BIO到IO多路复用]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/161105388</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/161105388</guid><author>skdoj</author><pubDate>Fri, 15 May 2026 10:36:35 +0800</pubDate><description><![CDATA[本文系统介绍了网络IO模型的基础知识，重点分析了三种IO模型的特点和演进过程。首先解释了Socket作为应用层和传输层中间抽象层的作用，以及服务端处理网络请求的基本流程。然后详细对比了BIO（阻塞IO）、NIO（非阻塞IO）和IO多路复用三种模型：BIO每个连接需要独立线程，资源消耗大；NIO通过轮询减少阻塞但仍有性能问题；IO多路复用通过select/poll/epoll实现单线程管理多个socket。特别深入分析了epoll的优化机制，包括分离socket维护与进程阻塞、使用红黑树管理socket集合、]]></description><category></category></item><item><title><![CDATA[【面试复盘】有了equals为什么还需要hashcode]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/156988334</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/156988334</guid><author>skdoj</author><pubDate>Thu, 15 Jan 2026 16:12:10 +0800</pubDate><description><![CDATA[本文探讨了equals和hashCode方法的协同作用。equals用于判断对象逻辑相等，而hashCode通过计算哈希值快速定位对象存储位置。在HashMap等哈希结构中，两者配合使用：先用hashCode快速筛选，再用equals精确判断，既保证了对象唯一性又提高了查询效率。源码分析显示，这种机制通过哈希值预判和精确比对，实现了性能与正确性的平衡。]]></description><category></category></item><item><title><![CDATA[【MySQL】你真的了解MySQL日志吗]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/156944812</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/156944812</guid><author>skdoj</author><pubDate>Wed, 14 Jan 2026 14:39:41 +0800</pubDate><description><![CDATA[特性Redo LogUndo LogBinlog所属层InnoDB（存储引擎层）InnoDB（存储引擎层）Server 层适用引擎仅 InnoDB仅 InnoDB所有引擎日志类型物理日志逻辑日志逻辑日志主要作用崩溃恢复，保证持久性事务回滚 + MVCC主从复制、备份恢复写入时机事务提交时修改数据时生成事务提交时是否循环写是（固定大小环形文件）否否Redo Log是 数据存储的持久性保障，确保宕机不丢数据；Undo Log是提供回滚能力和版本链，支持回滚与并发快照；]]></description><category></category></item><item><title><![CDATA[SpringAI从0到1搭建智能出题助手Agent]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/156908042</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/156908042</guid><author>skdoj</author><pubDate>Tue, 13 Jan 2026 16:17:58 +0800</pubDate><description><![CDATA[摘要：本文介绍了基于SpringAI构建题目生成Agent的实现方案。该Agent采用ReAct范式（思考-行动-观察循环），通过责任链模式实现题目生成、验证和自动优化的闭环流程。核心架构包含生成节点（初次生成/反馈优化）、验证节点（质量评估）和总结节点，具备自我反思能力，能自动修正低质量题目直至满足要求。与传统API调用相比，该方案显著提升了题目生成的鲁棒性和智能性，未来可通过RAG增强和多Agent协作进一步优化。典型应用场景是教育科技领域的自动化出题系统。]]></description><category></category></item><item><title><![CDATA[【Java】一篇文章教你搞懂String的不可变性]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/156899624</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/156899624</guid><author>skdoj</author><pubDate>Tue, 13 Jan 2026 13:15:02 +0800</pubDate><description><![CDATA[在运行期的时候，对于HotSpot虚拟机，并不会立即加入到运行期常量池，而是懒加载，只有第一次用到该字符串常量的时候，采用将其加载到字符串常量池中，在字符串常量池创建出一个String对象，创建一个char[]/byte[]，同时其引用指向这个数组。也就是我们创建一个String对象的时候，**新创建的** `String`**对象会直接复用传入对象（即** `"hello"` **）的** `char[]`**数组引用，而不会重新分配新的内存去存储字符数组**//s1指向的是内存中非字符串常量池的地址。]]></description><category></category></item><item><title><![CDATA[你真的理解Spring三级缓存吗]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/156899382</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/156899382</guid><author>skdoj</author><pubDate>Tue, 13 Jan 2026 13:06:39 +0800</pubDate><description><![CDATA[Spring创建Bean B，完成实例化后，将B的创建工厂存入。初始化A时，发现需要注入Bean B，触发B的创建流程；从三级缓存获取A的工厂，生成A的早期引用，存入。一级缓存无A（未初始化完成），二级缓存无A；初始化B时，发现需要注入Bean A，调用。将A的早期引用返回给B，B完成初始化，存入。存储实例化完成的早期Bean引用。存储完全初始化的成熟Bean。存储Bean的创建工厂。]]></description><category></category></item><item><title><![CDATA[【无标题】]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/155347905</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/155347905</guid><author>skdoj</author><pubDate>Fri, 28 Nov 2025 11:20:31 +0800</pubDate><description><![CDATA[dd]]></description><category></category></item><item><title><![CDATA[力扣316去除重复字母-单调栈]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/147051545</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/147051545</guid><author>skdoj</author><pubDate>Mon, 07 Apr 2025 20:08:02 +0800</pubDate><description><![CDATA[d入栈,c要入栈，c已经在栈中了(关键点2,需为在栈中的字符设置标记),所以跳过这个c,b入栈，发现b比栈顶小，但是后面已经没有d了，所以栈顶元素d不能出栈，然后c同样，栈已经存在，跳过。如果栈顶元素比他大呢，我们是否要将他去掉吗，不，如果待搜索的字母中(还未入栈)不包括栈顶元素，那么他是不应该被删掉的，在这种情况，我们就得知道栈顶元素的字母后续是否会出现，，所以去掉a,然后b入栈,a入栈的时候发现a比b小,且b后面还有出现，所以b出栈，然后c入栈，得到最终答案acdb。]]></description><category></category></item><item><title><![CDATA[redis实现分布式锁]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/146483629</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/146483629</guid><author>skdoj</author><pubDate>Mon, 24 Mar 2025 19:10:31 +0800</pubDate><description><![CDATA[不过使用lua脚本实现分布式锁是更好的选择，因为下文这把锁在判断锁是不是自己的和删除锁的操作不是原子的。UUID作为静态变量，在类加载时生成，也就是服务器启动时，这样不同的JVM下就是不同的UUID。用UUID+线程id作为value，保证每个线程的value唯一，用于后续删除锁前的判断。通过SET key value NX EX seconds操作实现分布式锁。删除锁的时候，判断锁是否是自己的，即通过UUID加线程ID判断。用业务ID作为key:保证一个业务操作一把锁。]]></description><category></category></item><item><title><![CDATA[一个简单的拦截器实现登录拦截]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/146454199</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/146454199</guid><author>skdoj</author><pubDate>Sun, 23 Mar 2025 12:17:34 +0800</pubDate><description><![CDATA[当携带了cookie，我们可以发送请求成功，并且成功按照拦截器的逻辑打印出了cookie。拦截登录验证比较可靠的刻意使用jwt令牌，redis+token等方式实现。首先我们需要设置一个拦截器，记得注册为bean,并且设置拦截器配置类。我们这里的拦截逻辑比较简单，就是在请求头中加入cookie,然后我们通过postman模拟发送请求。如果可以帮到你，快去动手试试吧ovo。这种方法不安全，只是为了方便演示。当我们不携带cookie。我们可以看到成功拦截。]]></description><category></category></item><item><title><![CDATA[力扣322]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/146405906</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/146405906</guid><author>skdoj</author><pubDate>Thu, 20 Mar 2025 20:50:45 +0800</pubDate><description><![CDATA[选择了加入,在加入n个这个硬币的决策下可以产生很多选择，最好的选择是dp[i-val]+1，其中dp[i-val]是最多加入n-1这个硬币(可能一个都没加)的最好选择，当我们对某个硬币(数值val)的加入进行决策时，可以产生很多方案，这些方案无非分为两种，加入了，没加入，如果不选择加入，那么此刻dp[i]=dp[i]最后拿dp[i-val]+1和dp[i] 做比较，就是对这个硬币的加入做出决策后的最好选择。如果没有任何一种硬币组合能组成总金额，返回。，表示不同面额的硬币；你可以认为每种硬币的数量是无限的。]]></description><category></category></item><item><title><![CDATA[力扣416动态规划题目]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/146405556</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/146405556</guid><author>skdoj</author><pubDate>Thu, 20 Mar 2025 20:29:26 +0800</pubDate><description><![CDATA[这也就是滚动数组优化的理由，然后你还可以发现我在枚举3的时候形成了dp[4]，我不会拿新形成的dp[4]再加上3取形成dp[7](由1 ，3，3)形成，为什么我不会这么做，因为3只能取一次，但你如果使用了滚动数组(自我滚动，在这道题中体现为dp是一维的)不这么做，程序不一定会， 如果你把我的代码的for(int j=target;枚举3的时候，发现dp[1]存在，那么dp[4]存在，dp[2]存，在， 那么dp[5]存在，dp[3]存在，那么dp[6]存在。dp[0]存在，那么把2加入dp[2]存在。]]></description><category></category></item><item><title><![CDATA[01背包个人理解(解析)]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/146392660</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/146392660</guid><author>skdoj</author><pubDate>Thu, 20 Mar 2025 14:39:37 +0800</pubDate><description><![CDATA[有 N件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi，价值是 wi。求解将哪些物品装入背包，可使这些物品的总体积不超过背包容量，且总价值最大。输出最大价值。输入格式第一行两个整数，N，V，用空格隔开，分别表示物品数量和背包容积。接下来有 N 行，每行两个整数vi,wi，用空格隔开，分别表示第 i 件物品的体积和价值。输出格式输出一个整数，表示最大价值。数据范围输入样例8。]]></description><category></category></item><item><title><![CDATA[并查集基础题:]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/146347118</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/146347118</guid><author>skdoj</author><pubDate>Tue, 18 Mar 2025 17:21:26 +0800</pubDate><description><![CDATA[什么时候连接两个点的边会使得集合成环，那就是两个点已经有通路了，如果两个点没有通路，那么这个边时第一个使得他俩相连的边，那么不可能成环，题目翻译后，就是一道基础的并查集题目了。翻译一下题目:找出第一条使集合成环的边，]]></description><category></category></item><item><title><![CDATA[洛谷4017题-最大食物链计数]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/146342970</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/146342970</guid><author>skdoj</author><pubDate>Tue, 18 Mar 2025 15:49:44 +0800</pubDate><description><![CDATA[那么为什么可以使用拓扑排序，是因为我们在处理某个点的path的时候，已经把他的前驱都计算好了，在计算2时，1处理好了，他的结果是正确的，在计算3时，2处理好了，在计算4时，3处理好了，在计算5时，2，3，4处理好了，队列对于每个点的处理，都是建立在食物链的流动方向上的。（这里的“最大食物链”，指的是**生物学意义上的食物链**，即**最左端是不会捕食其他生物的生产者，最右端是不会被其他生物捕食的消费者**。第一行，两个正整数 $n、m$，表示生物种类 $n$ 和吃与被吃的关系数 $m$。]]></description><category></category></item><item><title><![CDATA[一道dfs好题，详细解析(代码随想录104)]]></title><link>https://blog.youkuaiyun.com/skdoj/article/details/146298389</link><guid>https://blog.youkuaiyun.com/skdoj/article/details/146298389</guid><author>skdoj</author><pubDate>Sun, 16 Mar 2025 18:01:01 +0800</pubDate><description><![CDATA[题目选自代码随想录104. 建造最大岛屿，详解DFS基础例题]]></description><category></category></item></channel></rss>