13-个人学习助手实战任务书
核对日期:2026-05-18
官方资料:Long-term memory https://docs.langchain.com/oss/javascript/langchain/long-term-memory;Short-term memory https://docs.langchain.com/oss/javascript/langchain/short-term-memory;Structured output https://docs.langchain.com/oss/javascript/langchain/structured-output。
目标
把 src/projects/learning-assistant.ts 扩展成能长期陪伴学习的助手。它应能记住学习目标、当前阶段、已完成内容、薄弱点、复习节奏,并输出可执行计划。
机制
TypeScript 任务拆解
| 任务 | 修改位置 | 产物 | 验收方式 |
|---|---|---|---|
| 学习事件 schema | learning-assistant.ts | StudyEvent | 无效事件测试失败 |
| 长期记忆分类 | memory-store.ts | profile/progress/weakness/review namespaces | 查询能按 namespace 返回 |
| 计划生成 | LearningAssistant.plan | next tasks、review items、time budget | eval 检查任务数量和复习项 |
| 遗忘/更新策略 | 新增方法 | update/delete memory | 测试旧偏好能被替换 |
| 前端可消费输出 | schema | LearningPlan | JSON shape 稳定 |
推荐数据结构
interface StudyEvent {
userId: string;
type: "finish-topic" | "fail-quiz" | "add-goal" | "review";
topic: string;
note?: string;
occurredAt: string;
}
interface LearnerProfile {
goal: string;
preferredLanguage: "TypeScript" | "Python" | "both";
weeklyMinutes: number;
weakTopics: readonly string[];
}
记忆写入策略
| 信息 | 是否写长期记忆 | 原因 |
|---|---|---|
| 学习目标 | 是 | 跨会话稳定 |
| 当前章节 | 是 | 用于续学 |
| 一次性抱怨 | 视情况 | 需要确认是否是稳定偏好 |
| 密钥、账号、隐私 | 否 | 不应进入长期记忆 |
| 测验错题主题 | 是 | 用于复习计划 |
Python 差异
Python 侧可以用 Pydantic 和 LangGraph store 表达同样结构。TypeScript 侧要保证 schema 可以被前端复用。跨语言时,长期记忆的 namespace 和 key 要一致。
Eval 数据集
| 用例 | 输入 | 预期 |
|---|---|---|
| 新用户建档 | goal + current topic | 写入 profile |
| 完成章节 | finished topics | 生成复习项 |
| 时间不足 | 每天 15 分钟 | 任务变少、粒度变小 |
| 薄弱点 | fail quiz | 下次计划优先复习 |
| 隐私输入 | 包含 token | 不写长期记忆 |
工程边界
- 记忆写入需要可解释,不要把所有聊天内容自动保存。
- 长期记忆需要更新和删除,不是 append-only 日志。
- 学习计划要能被 UI 或 CLI 消费,不能只返回散文。
常见反模式
| 反模式 | 后果 |
|---|---|
| 只存聊天摘要 | 无法精确检索和更新 |
| 不区分事实和推断 | 模型误判会长期影响计划 |
| 计划没有时间预算 | 用户无法执行 |
| 不测隐私写入 | 敏感信息可能进入长期记忆 |
练习任务
- 增加
recordEvent(event: StudyEvent)方法。 - 增加“每天 15 分钟”场景,让 next tasks 更短。
- 写测试确认包含
token的 note 不会进入 store。