- 博客(24)
- 收藏
- 关注
原创 Agent 上下文压缩不是删历史:从六大工具到云端四级水位线
第一步是轻量级的 prune,不一定真的删除数据,而是让模型看到的内容变成占位提示。用户的需求、模型的思考、工具调用结果、错误日志、文件内容、临时计划,都会不断塞进上下文窗口。它不是一上来就调用 LLM 摘要,而是先做便宜的本地处理,比如调整工具输出预算、截短老工具结果、对局部输出做压缩。用户原话、最近几轮对话、关键工具结果、任务状态、错误栈、待办事项,这些信息的价值是不一样的。它可能忘记用户刚刚强调过的约束,可能被很早之前的工具输出干扰,也可能在一堆日志里找不到真正影响下一步决策的信息。
2026-06-19 13:18:07
319
原创 Coding Agent 工具层:别把 Agent 工具写成一堆函数
如果这时候就执行工具,拿到的可能只是半截 JSON,参数解析会失败,甚至会让 Agent 执行一个不完整的动作。**它会先判断这个工具有没有注册,参数是否合法,当前模式允不允许执行。这样做的好处很清楚:参数定义只写一份,模型看的是这份,本地验的也是这份,不用手写两套容易打架的描述。💡 一句话:Agent 工具层,不是把函数丢给模型,而是把模型动作包装成一条可校验、可并发、可回填的执行链路。Agent 工具层的本质,是在模型意图和本地执行之间,加了一层**“能看、能管、能校验、能回填”的协议**。
2026-06-19 13:14:06
435
原创 一个能执行 rm -rf / 的 Agent,你真的敢用吗?五层纵深权限防御设计复盘
Agent Loop、Tool Calling、Defense in Depth、危险命令黑名单、路径沙箱、权限规则、权限模式、HITL、deny 优先、结构化错误结果。我会把权限系统放在工具执行前,做成一条五层纵深防御链:先硬拦危险命令,再限制文件沙箱,然后匹配细粒度规则,再根据权限模式给出默认决策,最后用 HITL 让用户兜底确认。的工具结果返回给模型;但当它能读文件、写代码、执行 Shell、跑测试、提交 Git 的时候,它就不只是一个“回答问题的模型”了,而是一个真的能影响工程环境的执行系统。
2026-06-16 22:48:38
174
原创 面向 Skill 编程:用领域知识工程解决项目文档腐化
这样 Agent 在修改相关模块前,不是直接盲目检索代码,而是先读取对应 Skill,再结合真实代码生成方案。但在持续迭代的复杂业务项目里,问题会变得很现实:团队日常需求大部分都是中小型改动,一个两三百行的代码修改,可能要维护五六百行的 Spec。这件事不只是“给 AI 多喂一点文档”,而是要回答三个更实际的问题:什么是 Skill,Skill 应该怎么设计,以及如何防止 Skill 自己也变成过时文档。不要用 Demo 验证,直接拿最近要改的需求,让 Agent 先读 Skill,再读代码,再输出方案。
2026-06-16 22:10:02
1233
16
原创 Agent 干了半小时活,为什么越来越慢?上下文管理机制拆解
当单个工具结果超过阈值,或者同一条消息里的多个工具结果合计超预算时,系统会把大结果写入本地文件,然后在消息里放入预览文本和路径。每次发 API 前,系统都会临时遍历历史消息,把“是否替换成预览”的决策重新应用一遍,组装出真正发送给 API 的 payload。第一层什么都不做,但总 Token 数累积到 167K 附近,第二层触发,把早期历史压缩成摘要。所以还需要做“每条消息的聚合限制”:当一条消息里的工具结果总量超过 200,000 字符时,就从里面挑最大的结果存盘,直到总量降下来。
2026-06-14 22:46:44
373
14
原创 面试官问我:“Claude Code 记忆机制不就是向量库吗?”我:“不是,它更像一本会自己更新的工具书”
我不会简单保存聊天记录,而是把长期有价值的信息抽取成结构化 Memory,再通过“索引常驻 + 正文按需”的方式注入当前上下文。那这一篇,我们就把 Claude Code 的记忆机制,从“为什么要记”一直讲到“怎么写入、怎么加载、怎么防止旧记忆带偏”。A:记忆不是事实终点,而是历史快照。它们的问题是:只回答了“怎么找”,没有完整回答“该不该存、怎么存、什么时候拿出来、拿出来后能不能信”。那 Memory 系统要做的事情,就不是把整段聊天记录塞进去,而是把它变成一条以后能用的结构化记忆。
2026-06-08 14:23:52
359
8
原创 别再死背背包模板:从 0-1 背包到完全背包,一次看懂零钱兑换的循环顺序
很多人学背包 DP 时,最容易卡的不是公式,而是循环方向:为什么 0-1 背包一维优化要倒序,完全背包却要正序?本文结合灵茶山艾府《基础算法精讲 18》的学习笔记,用零钱兑换这道题把完全背包拆开讲:先从“选或不选”写出记忆化搜索,再 1:1 翻译成递推,最后讲清一维数组到底应该怎么更新。换到零钱兑换里,硬币面值就是物品体积,每枚硬币的“价值”可以看成 1,因为我们关心的是用了几枚硬币。选了一枚当前硬币之后,还可以继续选同一种硬币,所以。因为这枚硬币对应的是“一种面值”,选完一枚后,还可以继续选同一种面值。
2026-06-07 09:25:15
329
原创 【Learn Claude20】Comprehensive Agent:机制很多,循环一个
这一章不是再发明一个新机制,而是把前面学过的工具调用、权限、hooks、记忆、压缩、后台任务、cron、团队、worktree、MCP,都重新放回同一个 Agent Harness 主循环里。根据工具名找到 handler,执行工具,把输出包装成和原 tool_use 对应的 tool_result。LLM 前刷新工具池,让模型下一轮能看到外部工具,也让 Harness 能执行这些外部工具。后,模型才能基于工具结果继续判断下一步,是继续调用工具、修正计划,还是组织最终回答。
2026-06-05 22:51:00
235
5
原创 别再死背 LCS 模板:LeetCode 1143 最长公共子序列,从递归到一维 DP
因为子序列只要求相对顺序不变,所以如果最后两个字符能匹配,它们就可以放到公共子序列的最后;如果不能匹配,就说明这两个字符不能同时作为结尾,只能先丢掉其中一个继续试。把它们匹配后,只需要继续求前面两个前缀的 LCS,再加上当前这个匹配字符。从两个字符串里各自删掉一些字符,剩下来的内容要保持原来的顺序,然后问最多能对齐出多长。动态规划最关键的一步,不是先建表,而是先找到一个能把大问题拆小的观察角度。最后两个字符已经匹配上了,接下来只需要看它们前面的部分还能匹配出多长。,要求返回它们的最长公共子序列长度。
2026-06-05 10:46:17
306
3
原创 最长递增子序列 LIS:从动态规划到贪心二分
记录的是每一种长度下是否存在一个递增子序列,以及这个长度当前最优的最小结尾。每次替换虽然不增加长度,但让某个长度的结尾更小,保留了后续扩展的可能性。如果找到了就替换,让同长度的结尾更小,方便后续继续扩展。维护的是每种长度下的最小结尾,它用于计算最长长度,不负责还原真实路径。的递增子序列的最小结尾。长度越长,结尾至少要更大一些,否则就不可能形成更长的严格递增子序列。结尾的 LIS 长度,再用贪心 + 二分维护每种长度下的最小结尾,把复杂度优化到。是每种长度下的最小结尾,不一定是原数组中的真实 LIS。
2026-06-04 15:39:48
368
5
原创 【Learn Claude17】Autonomous Agents:从“手动派活”到“队友自己找活”
🌈🌟🔥声明:本文整理自的 s17 Autonomous Agents 学习内容。这一篇不追求把每一行代码都拆开,而是按“先看场景 -> 再看机制 -> 最后看源码”的顺序,把 s17 讲成一个新手也能读懂的 Agent 调度机制。.tasks/ownerblockedBy和。一、是什么:s17 到底在解决什么?
2026-06-04 09:00:45
408
8
原创 多 Agent 协作的瓶颈:Lead 手动派活太累了,怎么办?
fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;s17 自主 Agent任务看板核心函数生命周期关键机制.tasks/ 文件夹task JSON 文件can_start 依赖判断claim_task 认领任务scan_unclaimed_tasks 找活idle_poll 调度中枢WORK 干活IDLE 找活。
2026-06-03 13:36:27
206
原创 Java CompletableFuture: 异步编排常用方法速查手册
场景方法一句话转换结果thenApply结果 → 加工 → 新结果消费结果thenAccept拿到结果做点事,不返回不关心结果thenRun完成就行,结果无所谓异步链式展平嵌套的 CompletableFuture并行合并两个任务并行,合并结果等全部完成allOf所有人都到了才走任意一个完成anyOf谁先到谁先走异常兜底挂了就返回默认值统一处理handle成功失败都能处理收尾动作日志监控,不影响结果阻塞获取get / join最后手段,别乱用。
2026-05-21 12:15:51
181
2
原创 【 Learn Claude7 】Task System:让 Agent 管理持久化任务图
s03 的 TodoManager 是内存里的扁平清单,不能表达依赖,也不能在重启后恢复。Task System 就是来解决这个问题的。
2026-05-20 17:51:20
756
4
原创 【Claude Code 源码解读】Context Compact:长任务 Agent 不爆上下文的秘密武器
压缩层触发方式成本特点每轮自动零(纯字符串)日常清理,保留最近token 超阈值LLM 调用兜底防线,保存 transcript模型主动LLM 调用智能整理,阶段切换长任务 Agent 必须有压缩机制,否则跑不远三层配合最合理:micro 日常清理 + auto 防爆仓 + manual 智能整理短任务不需要压缩,直接跑就行。
2026-05-20 16:52:12
412
1
原创 【JVM 面试八股文】为什么 G1 从 JDK 9 后成为默认垃圾回收器?面试必问的 GC 演进
特性ParallelCMSG1停顿时间长短可控内存碎片无有无大堆支持差中好吞吐量高中中默认版本JDK 8JDK 8JDK 9+G1 在吞吐量、低停顿、大堆管理和碎片控制之间更均衡,适合现代服务端应用。
2026-05-19 16:20:14
346
3
原创 Learn Claude04 :Skill Loading 如何让 Agent 不被知识撑爆
Skill Loading 的本质是:system prompt 放 Skill 菜单,load_skill 的 tool_result 放完整正文。菜单常驻,全文按需。Skill Loading = 菜单常驻 + 全文按需。system prompt 只放 name + description,控制 token。load_skill 返回完整正文,按需注入。get_descriptions 生成菜单,get_content 返回正文。load_skill 本质是工具,返回的是知识不是代码。
2026-05-18 23:40:46
495
8
原创 Claude Code 源码解读04:Subagent 如何让 Agent 不背子任务过程
Subagent 的本质就是:让子 Agent 在独立的 messages 里完成脏活,父 Agent 只拿最终 summary。过程归子 Agent,结论归父 Agent。隔离。子 Agent 有自己的 sub_messages,工具结果只进 sub_messages,父 Agent 只拿 summary。这样父 Agent 的 messages 保持精简,不会被中间过程撑爆。记住这个判断标准:过程长、结论短 → 用 task;需要过程参与决策 → 自己干。
2026-05-18 11:15:37
472
8
原创 # JVM类加载机制面试八股文:双亲委派、类生命周期、JDK8 vs 9一文搞定
类怎么加载的、加载后怎么用的、用完怎么卸载的。面试最爱考的是双亲委派模型和它的破坏方式,记住"loadClass控制顺序,defineClass控制边界"这句话就够了。这是面试必考题,说不清楚基本凉一半。类的生命周期:加载→验证→准备→解析→初始化→使用→卸载类加载过程:每个阶段干什么,准备和初始化的区别双亲委派:先父后子,保护核心类破坏双亲委派:重写loadClass,Tomcat/SPI/插件系统:分别控制什么JDK8 vs 9:Extension→Platform,rt.jar→模块化。
2026-05-13 09:45:39
699
2
原创 指针未初始化和定义为NULL
如果指针没有被定义,实际上意味着它没有在程序中声明或初始化。在C/C++中,未定义的指针不能被直接使用,因为编译器不知道它的存在,这通常会导致编译错误。NULLnullptrNULLNULL总结来说,未定义的指针(实际上是未初始化)可能导致程序的不稳定和难以预测的行为,而明确将指针初始化为NULL是一种安全实践,能够帮助预防运行时错误,使程序更加健壮和易于调试。
2024-05-30 15:15:26
1399
原创 数据结构与算法
数据结构定义&理解数据对象之间的关联&组织方式逻辑结构物理上的关联算法数据对象必定与一系列加在上面的操作相关完成这些操作的方法就是算法解决问题的效率数据组织结构的不同空间的利用算法的巧妙程度抽象内部数据是抽象的只管外部操作,抓住核心时间函数头文件#include <time.h>数据类型 clock_t函数clock();
2024-05-29 09:43:25
260
空空如也
这个while后面这个一是什么意思?
2023-11-13
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅