「放通 3306 不安全。以后别自己放开。」

用户丢下这句,助手这次很听话,把规则撤了。过了两天同样的场景又来一遍,它又痛痛快快把 3306 放了出去——像上回那句话白说了。

这是那阵子给七亿批量远程管理工具做 AI 助手时,最让人上火的一类毛病。它不算 bug,你挑不出哪一行代码报错,可它就是不记话。

背景是助手挂了个「长期记忆」:聊得越多,它越懂你这台机器、你的习惯。思路没错,问题出在什么时候写进去、写进去会不会被丢掉。

我一开始以为它压根没记。翻后台才看明白,写入时机卡得很死:原来只在「跑过命令的任务」结束之后才更新一次档案。也就是说,AI 真下去跑了几条命令、活干完了,它才回头整理这一趟学到的东西。而「放通 3306 不安全」这种话,是在纯聊天里说的——没触发任何命令任务,任务结束那个回调根本不走,这句话从来没走到写记忆那一步。它当时回你一句「好的」,纯属应声,没落到任何地方。

我第一反应是往提示词里加规矩:「用户说过的,要记住。」加了没用——提示词管它怎么理解,管不了「写记忆」这个动作有没有被触发。一句话没被写进去,提示词再强调,也是无源之水。

第二个原因更隐蔽:偏好这块不是每次都注入的。为了让上下文别太臃肿,我们给记忆加了「按相关性筛选」——每轮只挑跟当前问题相关的塞进去。本意是省,副作用是:用户立的硬规矩(比如「别放通数据库端口」),只要这一轮没被判定为「相关」,就直接从上下文里消失了。那它当然照犯。

修法两条。第一,把触发条件放宽:聊天里只要带上「以后 / 别… / 不要… / 记住 / 不安全」这类信号,就后台把这次对话整理进【偏好 / 经验】,不必等什么命令任务结束。第二,【偏好】块改成永远注入,用户立的规矩每轮都在场,不参与相关性筛选。

说个后来的心得:记忆这玩意,「存得多」不值钱,「该记的记下来、关键时刻还在场」才值钱。全量灌进去反而越灌越糊,上下文预算一超,又贵又笨。这套想法和后来另一处坑是一脉的——那次助手把「端口 / 账号 / 密码明文」直接写进了长期记忆,每一轮都往外发一遍,逼着我们加了层密钥清洗。两件事凑一块我才想通:记忆是有安全边界的。能记住不等于该记住;该记住的,也不能回头被筛掉。

其实「相关性筛选」本身没错,错的是拿它去筛用户定的规矩。批量远程工具里,工具知识是参考、你的偏好是命令,这两类混在一个池子里按相关度打分,早晚出事。后来我把它们彻底分开存,才消停。

现在再碰到「它又忘了」,我先不问模型聪不聪明,先去看那句话到底有没有进【偏好】的门。多半是压根没进门,跟模型的智商没关系。


AI助手.png
以上这台机器上的折腾,用的是我们自己那个免费小工具:七亿批量远程管理工具 v1.6.1,RDP 九宫格 / SSH 终端 / SFTP / FTP 都在里面,Windows 端直接跑。