
前一篇写小博士的时候,我说了一句话:AI 助手,就是一个人。
不是说它真的有人格,也不是要把产品包装成会卖萌的虚拟角色。我的意思是,设计 AI 助手的时候,不能只把它当成一堆功能入口。老师不是在使用"找课件模块""出卷子模块""知识问答模块",老师是在跟一个助手说话。
顺着这个想法往下走,记忆就绕不开了。一个跟老师合作了三个月的教学助理,还该不该每次都问:"你教几年级?用哪版教材?要不要带答案解析?"
如果每次都从头问,那它就不像一个人,更像一个每次开机都会清空的表单。所以小博士需要记忆。可真写方案的时候,问题就变得很具体了。如果这是一个真人教学助理,他该怎么记?

记忆不是一个叫"我的记忆"的功能
按产品方案的惯性,这件事会被写成一个功能模块。首页加一个"我的记忆",里面展示老师画像;场景里读取画像,自动填表单;再做个开关,让用户管理记忆。这样看起来就很完整了。
但这么做,很快会跑偏。老师打开小博士,不是为了欣赏 AI 对自己的画像写得准不准。老师要的是少填几次重复信息,少解释几遍背景,下一次说"帮我出套卷子"的时候,小博士能自然接上:"还是七年级人教版数学,中等难度,带答案解析,对吧?"
如果从"功能"出发,我们会问:这里要不要加一个记忆模块?如果从"人"出发,问题会变成:一个靠谱的教学助理,合作久了以后,哪些事不该再反复问?
写需求时只差一句话,落到产品里差很多。记忆系统要解决的是重复输入,不是老师画像。它不用急着总结"这个老师是一个什么样的人",先记住那些每次都差不多、但每次都要填一遍的背景。先把这个边界放住,后面的取舍才有地方落。
不是所有关于老师的数据,都叫记忆
小博士首页原型上并排放着两类信息。一类是:"课件 12 份、卷子 8 份、收藏 36 个。"另一类是:"常用人教版教材、偏好中等难度、当前在教七年级。"
乍一看,它们都是关于这个老师的数据。但拆开看,完全不是一回事。
前者是统计。老师做过几份课件、下载过几次资源,这是业务数据库里数出来的事实。它没有推断,也没有对错。老师不能说:"我不承认我做过 12 份课件,帮我关掉。"最多只能说数据统计错了。
后者才是记忆。AI 观察老师最近的选择,得出一个结论:这个老师大概率常用人教版,出卷子时偏好中等难度。这是推断。既然是推断,就可能错;既然可能错,就必须能解释、能关闭、能被纠正。
这条界限划不清楚,后面全乱。如果把统计也塞进记忆模型,老师关掉"常用人教版"的时候,可能会发现旁边"课件 12 份"也跟着消失了。可老师想表达的不是"删掉我的历史数据",而是"你这个判断不对,我不是一直用人教版"。
所以统计继续从业务数据库聚合,记忆单独一套模型。它们可以在首页展示层自然合并,让老师看到的是一个完整的"小博士眼中的你",但数据上必须是两套东西:一个是发生过什么,一个是小博士据此认为你可能有什么习惯。这两件事不能混。

有些东西出现很多次,也不该记
写"该记什么"的时候,旁边还得放一张反向清单,哪些东西不应该被记住。
比如资源类型。老师今天找教案,明天找课件,后天找试卷,这不代表他"偏好教案"或者"偏好课件"。很多时候只是这节课刚好需要教案,下一次备课刚好需要课件。把它记成偏好,反而会干扰下一次。
再比如考试覆盖范围。一次是校考,一次是联考,一次是期中复习,一次是单元检测。它看起来也是老师反复选择的东西,但它其实是当次任务参数,不是老师的长期特征。你这次要出"第一到第三章",不代表以后每次都要这个范围。
年份也是一样。老师说"找 2024 年的中考试卷",这是即时筛选条件,不是偏好。小博士如果记住"这个老师喜欢 2024 年",下次就很荒唐。
所以记忆不是"只要出现多次就存下来"。一个真人助理也不会这么干。你让助理今天买咖啡,明天买茶,后天买矿泉水,他不会总结出"你是一个饮品偏好多变的人"。他只会知道,这些是当次需求,不能当成长期习惯。
小博士该记的,是那些稳定背景。你教初中数学,常用人教版,当前带七年级,出卷子一般要带答案解析,难度偏中等。这些信息每次都要用,每次答案又差不多。记住它,老师就少重复一次。
所以这套系统一开始就得收着点。能记,不代表该记。

记忆得有来历,不然就是猜
记什么定下来以后,才轮到怎么记。
最直接的做法,是老师做出一次选择就记一笔。比如出卷子时选了"人教版",立刻写进记忆:该老师使用人教版。这很危险。老师可能只是临时帮同事做一份卷子,也可能只是那次换了一个版本试试。一次选择就写死,助理就变成了那种听一句话就过度解读的人。
另一个极端,是每条记忆生成前都弹窗确认。"检测到你常用人教版,是否记住?"、"检测到你偏好中等难度,是否记住?"、"检测到你经常带答案解析,是否记住?"
这个方案看起来安全,但用起来会很烦。老师正在备课、组卷、找资源,AI 反复跳出来让他确认一些小事。那种感觉不像贴心,更像打断。
方案里用的是一个渐进过程。同一类选择出现次数太少时,只记日志,不生成记忆。连续出现到一定程度,先生成低置信记忆,只在当前会话里生效。再稳定一段时间,才升级成跨会话都可用的正式记忆。
五次、十次、六成、七成,这些数字只是初始阈值,以后要看真实数据调整。我更在意的是它的节奏:先观察,再判断;先临时生效,再长期记住。
这就更像一个人了。一个助理第一次看到你选人教版,不会马上说"我知道了,你永远用人教版"。但如果他连续十次看到你都这么选,下次他自然会先帮你填好,然后问一句:"还是人教版吗?"
而且每条记忆都得有来历。不是一句冷冰冰的"系统判断你常用人教版",而是能点开看到依据:最近 10 次创作中,8 次选择人教版。或者,你在某次对话中明确说过:"我教初中数学,用的是人教版。"
五月的时候,我在自己的 Claude 工作流里踩过一个记忆坑。它明明存了十几条记忆,但换个项目对话,实际能调出来的只有两条。剩下那些记忆不是没了,只是躺在别的地方,我当时也不知道它为什么这次看得见、下次又看不见。
那种感觉很别扭,你以为它记住了,换个地方它又像没见过这些东西。所以回到小博士这里,我不想再做一个黑箱记忆。记错不可怕,可怕的是记错了你不知道,或者你知道了也没法改。

记忆不能替老师做决定
记忆真用起来以后,还得再收一道边界:哪些可以提前帮老师填好,哪些必须等老师点头。
比如知识问答。小博士记得老师上次看到"有理数"那一章。最省事的做法,是老师一进来,系统直接跳到上次位置。但方案没有这么做,我们做的是"继续上次"卡片。老师点了,才进入上次章节;不点,就正常进入教材。
这个差别很小,但背后的产品判断完全不同。自动跳转,是 AI 替老师做了决定。继续上次,是 AI 提醒老师,我记得你上次在这里,要不要继续?
出卷子、做课件也是一样。记忆可以预填版本、年级、学科、难度,但每一格都能改。老师改了这次的参数,不等于要永久修改记忆。一次临时变化,不能立刻覆盖长期习惯。
学期切换也是这个逻辑。按固定日期判断最省事。到了九月,自动把七年级下册切到八年级上册。听起来很聪明,但各地开学时间不一样,老师的教学安排也不一样。有的人提前备课,有的人跨年级带课,有的人只是帮同事临时出几套题。
所以方案里没有让系统按日期直接改。小博士只做行为变化检测,如果连续几次发现老师都在选择跟原记忆不同的年级或册别,它才问一句:"我注意到你最近在准备八年级的内容,要更新教学信息吗?"
老师点了更新,系统再改;老师说暂时不用,这条记忆就先不动。
这也是我理解的"助手"和"工具"之间很重要的边界。工具可以自动执行,助手应该把选择权留在老师手里。

记忆还要分清给谁看
这里还有个容易混的点。
小博士需要一段"小博士眼中的你"。给老师看的时候,它应该自然一点,有温度一点,像一个熟悉你的助手在总结。你最近主要在准备七年级数学内容,常用人教版教材,出卷时多选择中等难度,并且习惯带答案解析。
这样的描述,对用户是有价值的。它让老师感到,小博士不是凭空说"我懂你",而是真的把近期行为整理成了一个可以看见的反馈。
这时很容易偷懒,把它做成一份内容两边共用。用户看这个总结,模型也读这个总结。省事。
但这事不能图省事。给老师看的这段话,需要像正常话一样读得下去;真塞给模型用,又最好别绕。
模型不需要那种"你最近主要在准备……"的完整句子,它更适合读一组干净的字段,比如:初中、数学、七年级、人教版、中等难度、带答案。
两边拆开就清楚了。总结只给用户看,LLM 读结构化数据。人读人的语言,系统读系统的语言。
这个边界很小,但不拆开,后面一定会混。

划掉一个选项,比加一个功能难
方案写完以后,单独数了一下被删掉的设计,居然比留下的还多。每条记忆前都弹窗确认,自动打开上次教材,按固定日期切换学期,记住老师偏好的资源类型,把总结同时塞给用户和模型用。
这些选项单看都不像坏主意,甚至都挺合理。它们看起来更智能、更主动、更完整。但拿真人教学助理一比,问题就出来了。
一个好助理不会什么都记。他知道哪些是你的长期习惯,哪些只是这次任务。一个好助理不会每件小事都打断你确认。他会先观察,等有把握了再自然地帮你省一步。一个好助理也不会因为自己记得,就替你做决定。他会提醒你、预填好、把依据摆出来,但最后那一下仍然交给你。
记忆这件事不能做得太满。小博士越像一个长期合作的教学助理,越要把哪些该记、哪些不该记分清楚。它得记住你,不然每次都像第一次见面;它也得给你留出改口的余地,不然记忆就会变成新的打扰。
长期合作的前提,是老师能看见它记住了什么,为什么这么记,哪里不对还能随时改。

夜雨聆风