我停止存储聊天记录,改而构建了一个有状态的学习代理!!
I’m happy to translate the article for you, but I’ll need the full text of the post (the content you’d like translated). Could you please paste the article’s body here? Once I have the content, I’ll provide a Simplified Chinese translation while preserving the source link, formatting, markdown, and any code blocks unchanged.
这是什么
我和我的团队构建了一个单页应用,整合了学生通常单独使用的几项功能:
- 带有会话跟踪的番茄工作计时器
- 带反馈循环的抽认卡
- 记录错误的测验系统
- 简单的聊天机器人
- 像 XP、连胜和科目等的进度追踪
所有功能都在浏览器中运行。没有后端。数据本地存储。
有趣的不是功能本身,而是它们如何共同汇入一个共享记忆层。
问题:假记忆
第一个版本的聊天机器人实际上并没有记住任何东西。
你可以告诉它你在某件事上很弱,而在下一条消息中它会完全忽视这一点。
这并不是因为模型本身不好,而是因为每一次交互都是无状态的——每条消息都被当作一次全新的开始。
我最初的尝试
我们从显而易见的方法开始:把之前的消息重新传回系统。
这稍有帮助,但也产生了新问题:
- 上下文很快被无关的消息填满
- 旧的对话污染了新的回复
- 提示词越来越长,却没有提升质量
- 仍然没有真正理解用户
感觉自己像是在模拟记忆,而不是实际构建记忆。
Source:
转变:停止存储聊天
转折点很简单:
我停止存储对话。
相反,我只存储 状态——非常小、结构化的信息片段,例如:
- 弱话题
- 当前任务
- 活跃主题
- 学习活动
没有聊天记录。没有文字稿。只有信号。
这种做法类似于 Hindsight 等系统对记忆的处理——侧重结构化回忆,而不是重放对话。它们的文档以及关于代理记忆的理念进一步证明了这一方向的合理性。
数据来源
关键思路是停止直接询问用户,而是从行为中推断一切:
- 如果用户答错了测验题目,则该主题被视为薄弱环节。
- 如果他们把闪卡标记为“Again”,这也是一个信号。
- 完成一次学习会话会更新活动记录。
随着时间推移,系统在无需明确输入的情况下构建用户画像。结果发现这要可靠得多。
响应的变化
与其输入过去的对话,我开始传递一个关于用户状态的小型结构化摘要,例如:
- 他们的困难所在
- 他们当前正在进行的工作
- 他们最近在学习的内容
这些上下文虽小,却高度相关,并且产生了显著的影响。
前后对比
相同问题: “我今天应该学习什么?”
- 之前: 一个没有个性化的通用答案。
- 之后: 基于薄弱主题和当前任务的具体建议。
模型本身没有任何改变——仅仅是输入上下文改变了。
持久化
所有内容都存储在浏览器本地。页面重新加载时,状态会被恢复。
我刻意没有添加后端,因为对于这种系统:
- 数据是用户特定的
- 简单性比规模更重要
- 快速迭代比基础设施更重要
本地存储已经足够。
什么没有奏效
- 存储完整的聊天对话
- 尝试对聊天进行摘要
- 添加越来越多的上下文
这些都没有以有意义的方式改进行为;它们大多只会增加噪音。
仍然存在的问题
系统可以运行,但并不完美:
- 弱主题永远不会随时间衰减
- 所有信号被同等对待
- 没有时间或新近性的概念
- 所有数据全局存储,而不是按主题分开
其简洁性暴露了这些局限。
我接下来会改变的地方
如果我继续进行,我会关注:
- 根据频率对主题进行加权
- 降低旧数据的重要性
- 按主题分离记忆
- 可能在设备之间添加同步
但我会保持相同的核心理念。
Takeaway
当我增加更多内存时,系统并没有改善。
当我对要记住的内容进行选择性筛选时,系统才有所改善。
聊天记录感觉像是记忆。结构化状态实际上起作用了。
很好奇其他人是如何处理这个问题的。
你们是存储了更多的数据,还是仅仅是更好的数据?

