多轮对话里的「目标漂移」:Agent 跑着跑着忘了你要什么
多轮对话里的「目标漂移」:Agent 跑着跑着忘了你要什么和 Agent 多轮协作久了,会遇到一种安静的失败:它一直很忙,工具也在调,中间步骤看起来都“合理”,可收工时你发现——干的已经不是你起初要的那件事 我把这叫目标漂移(goal drift) 不是偶发幻觉那么简单,更像是上下文变长后,约束被一步步冲淡 这篇文章记我怎么发现漂移、怎么在过程中拉回,以及设计 Agent 时能做哪些防漂 常见几种面孔: 每一步单独看都有道理:重构有益、修复积极、干净也好 合起来却违背委托 危险在于局部合理、全局偏航 图:目标漂移四种脸:膨胀、替换、偷换、遗忘(原创示意图) 我的个人理解(含推测): 所以漂移不完全是“模型不听话”,也是交互方式与系统设计的结果

2026-10-14鱼鱼
算法:Trie(前缀树、字典树)
算法:Trie(前缀树、字典树)前缀树(Trie,又称字典树)是一种功能倾向性很强的数据结构,通过对词汇的前缀做数结构,很容易实现查询、前缀词推荐系统,例如,我们将如下多个单词放入树结构中: [apple,bat,bee,cat,cap,car],最终生成的前缀树结构为 通过深度递归,我们很容易用较小的时间复杂度判断出符合前缀的单词在不在 假设Trie的字符集范围是固定的,并且范围不大,例如是上面的纯英文字符,假设忽略大小写总共为26个,可以选择使用桶结构进行存储,即每一个Node都是一个长度为26的bucket数组 这样看来,Trie的结构并不复杂,只通过循环不断提高深度进行遍历即可 假定字符集的范围是未知的,或者范围很大(比如中文汉字),就要放弃使用bucket结构,而是通过一个Map维护,这里使用树结构TreeMap,key为相应节点的字符

2021-01-19鱼鱼
让 AI 起变量名和函数名,我留下的几条品味规矩
让 AI 起变量名和函数名,我留下的几条品味规矩命名一直是我写代码时最磨蹭的环节之一 名字起糊了,后面读代码的人(包括一个月后的我)会一直付税 AI 很擅长甩出一串候选名,也很容易甩出看起来专业、读起来空洞的名字 这篇文章记我让它起名时留下的几条规矩——不是语法规范全文,是品味上的取舍 我愿意让 AI 起名,前提是: 我已经能用一句话说明“这个东西在业务里干什么” 我要的是 3–5 个候选,不是一个“最佳答案” 最终选定权在我,尤其是会进公共 API、表字段、事件名的那些 一上来就说“给个好名字”,它常会给你 handleUserData、processInfo、manageService 这类语法正确但语义稀释的词 候选机模式能逼它发散,也逼我比较

2026-10-14鱼鱼
使用RPC与Restful接口调用服务
使用RPC与Restful接口调用服务在SOA和微服务架构中,远程通信是无法避免的,最常用的远程通信有两种方式: restful的接口,使用Http通信 使用dubbo或是Spring Cloud组件进行 RPC协议远程调用,可选地使用socket通信 不同的人对 RPC调用会有不同的看法,甚至对rpc本身的理解都不甚相同,但我认为 RPC有两种倾向: 一为语义化的 RPC 没有统一的请求规范,数据格式在开发人员中很难达成一致,在使用传统Http调用时,交互的双方需要约定一份“API文档”以保证数据格式的唯一性,这样API格式本身就成为了一道大墙,耽误研发双方的时间 但如果服务间采用语义化 RPC进行交互,双方可能并不需要一份文档,只要一份约定好的代码,并以此作为双方的依赖,在请求时也仅仅是直接调用方法本身,如此强的语义性怎能让人不爱

2021-01-13鱼鱼
AI 补全和整段生成,我什么时候用哪种
AI 补全和整段生成,我什么时候用哪种用 AI 写代码久了,我会下意识把它分成两种节奏:一种是编辑器里那个“跟着你敲”的补全;另一种是对话框里“给我写一整段 / 一整文件”的生成 表面上都是 AI 在写,体感完全不一样 补全像有人在旁边帮你把下一句顺出来;整段生成像你把需求扔出去,过一会儿收回来一份成品 我早期几乎只用后者,觉得效率高;后来越写越觉得:很多时候,补全才是更省心的那一个 这篇就聊聊我现在怎么选 补全的好处很直观——上下文就在光标周围,你刚写的函数名、变量名、注释,它都能“看见” 你按 tab 接受一行,再敲两下,它继续跟 这种节奏很接近自己写,只是手变快了一点 我特别喜欢在这些场景用补全: 写样板代码:DTO 字段、简单的 getter/mapper、重复的校验

2026-10-14鱼鱼
Agent 跑批任务时我盯的几个「仪表盘」指标
Agent 跑批任务时我盯的几个「仪表盘」指标把 Agent 丢进一批任务里跑,最容易犯的错是:只盯最终答案 答案对了就庆祝,错了再翻日志 跑多了你会发现——很多失败在中途就已经写在仪表盘上了,只是你没看 这篇文章记我跑批(批量任务、夜间任务、评测集重跑)时会盯的几类指标 不是定行业标准,是我个人反复被坑后留下的观察清单 如果你也在用 Agent 刷题集、批量修测试、批量整理仓库,希望能少踩一点「早上起来只看见成功率」的坑 最终答案是结果,不是过程健康度 两类任务都可能「答对」: 走了一条干净路径,三步完成 绕了四十步,失败重试一堆,最后撞对 只看答案,你会把第二种也当成可上线策略 成本、稳定性、可复现性全被藏起来了

2026-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 时代选型新增的七个考量点

2026-10-14鱼鱼
PyCharm与python快速开发
PyCharm与python快速开发Python语言作为“胶水语言”,简单易学,开发周期快,功能和扩展性强大,类库丰富 只依赖一门Java并不适用于所有情况,譬如快速开发一次性脚本(修复数据),通过使用Python效率更高,本篇文章旨在介绍本人快速入门Python的一些tips 注意,一些Python的基本语法在此不予介绍,推荐前往廖雪峰的博客查看,博客基于Python3.8版本 关于编译器等配置内容参考PyCharm帮助文档 从Python官网下载Python并安装,配置环境变量,安装PyCharm(这里 我们使用它作为IDE),这里略过 pip是python的包管理与安装工具,当你安装python后,pip也会随之被安装

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

2026-10-14鱼鱼
Agent 的人类确认点:哪些操作必须等人点头
Agent 的人类确认点:哪些操作必须等人点头把权限和预算都收紧之后,还剩一个问题:有些动作即使技术上 Agent 做得了,也不该让它独自按下 删除、推远程、改权限、对外部发消息——这类事一旦做错,回滚成本不对称 我把这类关卡叫做人类确认点(human gate):Agent 可以准备好方案和命令,但执行前必须等人点头 原则很土:能撤销的可自跑,难撤销的先问人 我不太用“重不重要”来划分,而用“做错了能否廉价撤销” 易撤销: 改工作区文件、跑只读测试、本地格式化、生成草稿文档 中等: 本地 commit、加依赖但未推送、改本地配置 难撤销: force push、删数据、改生产配置、对客户发信、扩大公网权限、不可逆迁移 易撤销的,默认自动;难撤销的,默认闸门

2026-10-14鱼鱼
让 AI 写正则表达式:我现在一定先要它给反例
让 AI 写正则表达式:我现在一定先要它给反例正则大概是我最早放心交给 AI 的活 原因很简单:我自己写正则也是边查边试,每次写完都不太敢相信它 AI 张口就来,还附带逐段解释,看上去比我靠谱多了 用了一阵之后我发现,AI 写的正则有个很稳定的特点:它几乎总能匹配上你给的例子 问题是,正则真正出事的地方从来不在“该匹配的没匹配上”,而在“不该匹配的也匹配上了” 而后者,你不主动问,它不会告诉你 所以我现在有个死规矩:让 AI 写正则,先别要正则,先要反例 那次是要从一堆构建日志里提取版本号,格式是“主版本.次版本.修订号” 我给了 AI 三个例子,它很快给出 \d+\.\d+\.\d+,解释也清清楚楚 我跑了一下,三个例子全中,就提交了

2026-10-16鱼鱼
动态路由数据源(多租户)解决方案
动态路由数据源(多租户)解决方案当下有很多服务都使用了多数据源,或是出于跨库查询或是分库分表、读写分离等,多数据源解决方案早已不是稀罕事 常见的解决方案包括使用多数据源框架(例如Shareding-Jdbc)、在数据库端做代理(例如MYCAT)、对于固定的几个数据源连接,也可以直接手动配置多个数据源,这种相关处理有很多源码,我在github上也有简单的实现:fishstormX/dynamicDataSource: 动态数据源的实现,基于maven自定义多模块骨架 Spring Boot2.0.x,本文实现的是动态数据源,主要为了解决 多租户问题(不同的用户群组有不同的数据源和配置,强调数据的隔离性) 本文技术能实现的是动态数据源,基于Spring框架,即能够将注入的Datasource根据租户不同使用不同的来源,同时根据租户增减动态的增删和缓存数据源(增是因为会有新增租户可能使用到项目启动后的数据源,减是因为租户数不可预料,不可直接缓存所有的数据源)

2021-01-07鱼鱼