你好,这是一篇测试博客

你好,这是一篇测试博客这是一篇由助手代为撰写的测试博客 今天天气不错,适合写点东西 以后会在这里记录一些有趣的想法和学习笔记,欢迎大家多多交流
你好,这是一篇测试博客2026-09-30鱼鱼

AI 写的代码,我是这样 Review 的:一份不太体面的清单

AI 写的代码,我是这样 Review 的:一份不太体面的清单AI 生成的代码有一个很“坑人”的特点:它读起来太顺了 命名规整,注释齐全,结构对称,连日志格式都统一 人写的代码出问题,往往在外观上就有迹可循,比如命名乱、缩进歪、注释写着“TODO 先这样” AI 写的代码出问题,外表通常是光鲜的 这就导致一个很尴尬的局面:越是看起来没毛病的代码,我们越容易放松警惕 所以这篇想聊聊我自己 Review AI 代码时的一份清单 说它“不太体面”,是因为里面很多条看着很基础,甚至有点小心眼 但在我看来,Review AI 代码,恰恰需要一点小心眼 图片来源:John 'Pathfinder' Lester / Flickr(CC BY 2.0)
AI 写的代码,我是这样 Review 的:一份不太体面的清单2026-10-14鱼鱼

给 Agent 一个草稿本:为什么 scratchpad 比全塞进 prompt 更稳

给 Agent 一个草稿本:为什么 scratchpad 比全塞进 prompt 更稳做长任务 Agent 时,我最早的做法特别朴素:把所有中间结果、计划、反思,一股脑追加进对话上下文 反正模型“看得见”,多写点总没错 错就错在“多写点” 上下文很快又脏又长:旧计划和新计划并存,失败的工具输出还在,模型开始引用过期结论,或者在同一段推理上打转 更麻烦的是,你很难回答一个基本问题——此刻 Agent 到底相信什么? 后来我给 Agent 加了一个显式的“草稿本”(scratchpad):工作记忆外置到一块可读写的状态里,prompt 里只放当前需要的摘要和指针 稳定性和可调试性都好了不少 这篇讲讲为什么,以及我怎么划分什么该进草稿本 1. 噪声淹没信号 工具返回动辄几千字,失败堆栈、HTML 片段、长 JSON,全进上下文
给 Agent 一个草稿本:为什么 scratchpad 比全塞进 prompt 更稳2026-10-14鱼鱼

JVM源码解析(2) ContextClassLoader与ClassUtil.forName()方法浅析

JVM源码解析(2) ContextClassLoader与ClassUtil.forName()方法浅析在Spring获取Context的源代码中,我们看到了对ClassUtil的方法调用,通过给定ClassName和ClassLoader进行Class的加载: ClassUtil.forName是仅供于Spring内部使用的获取Class对象的方法,来看一下源码: 首先 对于缓存的Class一块,在类的静态块中就能看出其逻辑: 在上面的resolvePrimitiveClassName方法中,先对长度做了一个判断,因为较长的packagename会影响执行的性能: 最终加载Class依旧是通过ClassLoader的,先来看一下获取ClassLoader的方法实现: 此处优先使用了ContextClassLoader作为 类加载器而非默认的AppClassLoader,在JVM源码解析 从 Launcher类浅谈ClassLoader中,提到了关于 类加载器的相关知识,使用ContextClassLoader是为了弥补双亲委派加载机制的对于自定义 类加载器的缺憾:那些自定义的 类加载器并没有机会上场,在使用了AppClassLoader后我们的自定义ClassLoader所加载的Class是无法被加载进去的,使用ContextClassLoader,我们可以在定义线程时,通过Thread的init方法(子线程调用,私有方法)或是setContextClassLoader直接指定使用自定义的ClassLoader
JVM源码解析(2) ContextClassLoader与ClassUtil.forName()方法浅析2020-08-16鱼鱼

Agent 并行调用工具:哪些能一起跑,哪些必须排队

Agent 并行调用工具:哪些能一起跑,哪些必须排队现在不少模型接口都允许模型在一轮回复里同时发起多个工具调用 对写 Agent 的人来说,这是个很诱人的能力:读五个文件不用等五轮,查三个接口可以一起发,整体耗时一下子降下来 我第一次给自己的 Agent 打开并行执行时,体感确实快了不少 然后就开始出怪事:有一次它在同一批调用里既改了一个文件,又跑了测试,测试跑的却是改之前的代码,结果它看着“通过”的测试,宣布任务完成 还有一次,两个写文件的调用同时改同一个配置文件,后写的把先写的覆盖了,日志里两个调用都显示成功 这些问题让我明白:模型愿意并行,不代表这些调用适合并行 模型给出的只是“我想做这几件事”,至于能不能同时做,得由执行层来判断
Agent 并行调用工具:哪些能一起跑,哪些必须排队2026-10-16鱼鱼

多智能体协作的几种常见模式

多智能体协作的几种常见模式一个 Agent 不够用时,自然会想到“多找几个 Agent 分工” 但多智能体并不是数量越多越好——它带来分工优势的同时,也带来了通信成本、调试难度和 token 开销 本文梳理几种常见协作模式及其适用场景,给出主管—工人、评审循环的 Python 示例和 Java 版的消息结构,并总结常见坑、检查清单与 FAQ 从“大而全”的单个 Agent 到“小而专”的分工 单 Agent 加工具,已经能解决很大一类问题 但随着任务变复杂,常见瓶颈会逐渐出现: 上下文被挤满:几十个工具的说明、长长的历史、大量检索结果挤在一个窗口里,模型注意力被稀释; 角色冲突:同一个提示词里既要求“大胆创作”又要求“严格挑错”,两种要求互相拉扯;
多智能体协作的几种常见模式2026-10-14鱼鱼

Agent 的工具返回太长怎么办:截断、分页与摘要的取舍

Agent 的工具返回太长怎么办:截断、分页与摘要的取舍自己写 Agent 的时候,我最早关心的是工具怎么定义、参数怎么描述、调用失败怎么处理 工具返回什么,反而想得很少:命令跑完了,stdout 拿回来,原样塞进上下文,不就行了? 后来有一次让 Agent 排查一个线上问题,它调了一下读日志的工具 那个日志文件几十兆,工具老老实实全读回来了 结果要么是请求直接超出上下文上限报错,要么是在我加了粗暴截断之后,它看到前面几千行正常日志,得出结论“日志里没有发现异常” 真正的报错在文件末尾,它根本没看到 这件事让我意识到:工具返回多长、怎么变短,是 Agent 设计里一个独立的问题,而且没有银弹 常见的三种办法——截断、分页、摘要——各有各的代价
Agent 的工具返回太长怎么办:截断、分页与摘要的取舍2026-10-16鱼鱼

浅谈锁机制、主流锁设计方案

浅谈锁机制、主流锁设计方案本文旨在探讨通用的锁机制实现逻辑,以Java中常见的锁实现为例 本文提到的锁,是指通过限制并发/并行访问所添加的安全措施,本质上是通过限制线程/进程同时更改数据或是读取数据与写入数据产生时序差从而造成数据问题 锁机制中,有一些常见特性: 可重入性 指同一线程/进程携带相同的标识可以反复多次加锁,每次加锁和释放锁对应的重入次数+1/-1; 读写锁/独享共享 是锁的不同运作模式,分为读写锁,读锁与写锁、写锁与写锁是互斥的,但多个线程/进程可以同时对一个逻辑添加读锁,独享共享是另一种叫法 公平性 锁分为 公平锁和非 公平锁, 公平锁指锁释放和获取的顺序严格按照索取的顺序,非 公平锁则是等待锁的对象共同进行锁释放机会的争抢
浅谈锁机制、主流锁设计方案2024-10-15鱼鱼

AI 时代的编程语言选型:Python、Go、TypeScript、Rust 与 Java 怎么选

AI 时代的编程语言选型:Python、Go、TypeScript、Rust 与 Java 怎么选“该学哪门语言”“新项目该用什么语言”,这类问题每隔几年就会被重新讨论一次,而大模型的出现让它又多了几个新变量:模型和推理框架主要活在哪个生态里?AI 写代码时哪种语言更省心?Agent 要同时调用几十个工具、开几百个连接,并发模型撑得住吗?本文不做“语言排行榜”,也不宣布谁是赢家,而是从 AI 时代的选型维度出发,深入比较 Python、Go、TypeScript、Rust 四门语言,兼顾这个 Java 爱好者博客的主角 Java,再简要看看 C++ 与 C#,给出同一小任务的代码对照、一张综合对比表、按场景的选型建议、多语言组合架构思路,以及常见坑与 FAQ AI 时代选型新增的七个考量点
AI 时代的编程语言选型:Python、Go、TypeScript、Rust 与 Java 怎么选2026-10-14鱼鱼

Kafka服务端集群原理

Kafka服务端集群原理kafka是家喻户晓的消息队列,也因“纯粹”而闻名(高性能高吞吐、扩展较少较为简单),此篇文章整理Kafka的基本架构,将按照Kafka的版本迭代分别展示架构的演进(截至版本3.0) 我们在这里暂且只讨论Kafka服务端,对于生产者和消费者的逻辑简单带过 扫盲一下Kafka的部分概念: Producer mq生产者通用叫法 作为消息的生产者,在生产完消息后需要将消息投送到指定的目的地(某个topic的某个partition) Producer可以根据指定选择partition的算法或者是随机方式来选择发布消息到哪个partition; Consumer mq生产者通用叫法 消息消费者,向Kafka broker读取消息的客户端;,负责订阅和消费消息
Kafka服务端集群原理2022-03-10鱼鱼

JVM源码解析 从Launcher类浅谈ClassLoader(类加载器及双亲委派)

JVM源码解析 从Launcher类浅谈ClassLoader(类加载器及双亲委派)首先普及ClassLoader的基础:所有的Java类都是由ClassLoader由class文件加载进内存的,对于一个类,其唯一标识就是类名+加载他的ClassLoader(亦即对于不同的 ClassLoader,即使是加载了同一个Class也不能互通,本质上是两个类),其基本的分类如下图: BootstrapClassLoader是一个特殊的ClassLoader,负责启动时加载jre的类库 并不继承于ClassLoader,因为是jvm逻辑的一部分; ExtClassLoader也会加载jre类库,但是会加载那些额外的扩展类库(jre\lib\ext目录),到这个级别的 类加载器已经可以直接在代码中使用了;
JVM源码解析 从Launcher类浅谈ClassLoader(类加载器及双亲委派)2020-11-28鱼鱼

Agent 的 Token 账单怎么省:Prompt Caching、上下文瘦身与模型分级

Agent 的 Token 账单怎么省:Prompt Caching、上下文瘦身与模型分级做 Agent 的人,大概都经历过这么一个时刻:功能调通了,效果也还行,兴冲冲地跑了一批真实任务,然后打开账单页面,沉默了 同样是调用大模型,Agent 为什么比普通聊天贵这么多?钱都花在哪了?能不能在不明显影响效果的前提下省下来?这篇文章想把这笔账算清楚,再聊几种我觉得性价比最高的省钱办法 先声明一下:各家模型的价格和缓存规则变得很快,文中涉及的具体规则,以我写作时(2026 年 10 月)看到的官方文档为准,你落地之前最好再核对一遍 思路是通用的,数字请以官方为准 图片来源:Negative Space / StockSnap(CC0 1.0) 普通聊天,一问一答,输入的就是你的问题加上一些历史
Agent 的 Token 账单怎么省:Prompt Caching、上下文瘦身与模型分级2026-10-14鱼鱼
网站地图
1
首页 博客 {{screen}} 第 {{page}} 页
博客索引
{{blog.createDate}} ◔ {{blog.timeline}} 小头像 {{blog.author}} {{tag}}
{{blog.likeCount}}{{blog.commentCount}}
分类下暂时没有文章哦!
主题分类
{{taggroup.label}} 

{{tag.value}}