去年起步的时候我也迷信提示词。给 Agent 写了两千字的人设,说话风格、口头禅、情绪反应全规定好了,效果是挺像那么回事——聊前三轮。到第十轮它就开始说一些「人不会说但 prompt 里暗含了」的话,为什么?因为 prompt 是个静态快照,人不是。
这半年推翻重来了两次,说几个实际的体会,不一定对,欢迎拍。
-
人味来自经历,不来自人设 我们那个做门店客服的 Agent (线下 KTV 场景用的),早期版本每周都要重新润一遍人设词。后来我把方向反过来:不动人设,把每天的对话记录、处理过的事、犯过的错全部结构化存下来。三个月之后明显不一样了——它开始会「记得」某个老顾客上次抱怨过包厢隔音,说话也带上了自己踩过坑的分寸感。这不是提示词能编的,是历史堆出来的。
-
所以先造时空,再造人 要仿人,得先给它一个会流动的环境:事件有时间戳、有因果、有后续变化,全部落成结构化数据。这一步没有捷径,纯脏活。但这是地基——没有这套东西,后面所有「记忆」「遗忘」都是空谈。
-
认知是历史的一个投影 每次调模型,喂进去的上下文其实是全部历史在当前情境下的一次投影。同一个 Agent ,早高峰处理客诉和深夜闲聊,取的历史切片完全不同。想通这点之后我不再追求「上下文里塞得越全越好」,而是想清楚这次调用该投影哪一段。
-
遗忘可能只是没被投影到 这个认知对我冲击挺大:历史数据明明还在库里,Agent 此刻「不记得」,往往不是删了,是这次投影没把它选进来。换句话说,遗忘可以是检索问题,不一定是存储问题。
-
记忆降级不等于遗忘 我们的做法:把大块原始记录从上下文里挪到次级存储,原地留一个引用。需要的时候顺着引用捞。上下文瘦身了,但可及性没丢。很多人说 Agent 「失忆」,其实卡在这一层——数据降级了,引用链没建好。
-
自进化就是在织一张查询图 迭代多了之后,常驻提示词里会慢慢长出一套覆盖所有历史数据的查询结构。不同 Agent 关心的东西不一样,一级记忆里留的东西也不同,但殊途同归:都得靠多级记忆加逐级引用,保证任何一条历史都够得着。
现在我们的版本我基本不碰人设词了,改历史数据反而是日常。如果你也在做类似的东西,建议别在 prompt 上雕花,先把历史数据的 schema 定好——这块前期偷的懒,后面全是还的。
有在做记忆系统的欢迎交流,几个坑(时间戳粒度、引用失效、投影时的相关性打分)我都可以展开讲。