
节后返工的第一天清晨工作台上往往堆满了各种积压的邮件、未读消息与待办杂务。很多同学打开手账或待办清单时面对十几条密密麻麻的任务往往容易陷入一种“不知从何下手”的认知过载Cognitive Overload最后反而把精力消耗在无关痛痒的琐碎事项上。传统的时间管理工具虽然支持为待办事项标记“高、中、低”优先级但都需要用户自己逐条评估、手动打标。在疲惫的晨间这种机械的评估本身就是一种心理负担。而将整份敏感的待办日程上传到远端公有云 AI 模型又存在极大的隐私泄露隐患。在“秋日手账杂货铺”中听汐尝试落地了一个纯前端运行的“智能手账待办优先级推荐器”。它依托浏览器端侧轻量小模型或本地规则语义分词器利用轻量且结构化的系统提示词Prompt结合经典的艾森豪威尔四象限法则重要-紧急矩阵在绝对保护隐私的前提下一键将杂乱无章的清单智能重排为条理清晰的早中晚执行梯队。一、艾森豪威尔矩阵在端侧语义排序中的落地要让端侧小模型如 1B ~ 2B 参数量级稳定完成排序任务关键在于不能让其进行过于发散的开放式回答而是将经典的“四象限时间管理理论”转化为清晰的打分量规Rubric第一象限重要且紧急具有明确截止时间今天上午/下班前、涉及关键交付阻断的任务赋予最高执行权Priority: P0。第二象限重要不紧急涉及长期技能沉淀、架构重构、健康锻炼与复盘思考的任务规划在精力最充沛的午后整块时间Priority: P1。第三象限紧急不重要回复通知、琐碎签字、非核心答疑集中在零碎时间快速批处理Priority: P2。第四象限不重要不紧急随手随笔、长远愿望清单延后或暂时折叠Priority: P3。端侧模型的任务极其纯粹读取用户输入的自然语言任务列表理解其中的时间状语与动词意图输出结构化的打分元数据最后由前端视图层做平滑的列表位移动画。二、结构化 Prompt 设计与 JSON 约束提取端侧小模型的推理能力有限复杂的嵌套指令容易导致格式崩坏。因此我们需要设计精炼且具有严格 JSON 格式约定的 Promptexport const TASK_PRIORITY_PROMPT 你是一个专注时间管理的晨间手账助手。 请阅读用户的待办事项列表根据任务的紧急程度、截止时间以及行动价值将其划分为四个象限级别 - P0: 极紧急且关键必须最先处理 - P1: 核心价值但非突发建议黄金时段攻坚 - P2: 琐碎日常/沟通建议碎片时间批量搞定 - P3: 可延期愿望/低价值事项 你必须且只能返回纯 JSON 数组严禁包含任何 Markdown 格式或额外解释说明 [ { originalText: 任务原文本, priority: P0 | P1 | P2 | P3, suggestedTimeSlot: 上午第一项 | 午后黄金期 | 碎片时间 | 随心, reason: 推荐理由简短一句话不超过12字 } ];三、纯前端调度核心实现代码下面是基于纯前端环境实现的待办解析与重排控制器集成了本地轻量引擎调用与解析容错机制// types.ts export interface RawTodoItem { id: string; text: string; completed: boolean; } export type PriorityLevel P0 | P1 | P2 | P3; export interface PrioritizedTodo extends RawTodoItem { priority: PriorityLevel; suggestedTimeSlot: string; recommendReason: string; score: number; } // PriorityRanker.ts import { TASK_PRIORITY_PROMPT } from ./prompts; export class LocalTodoRanker { /** * 将无序的待办列表进行智能分析并重排 */ public async rankTodos( todos: RawTodoItem[], inferFn: (prompt: string, userContent: string) Promisestring ): PromisePrioritizedTodo[] { // 过滤掉已完成的事项仅对未完成项做排序 const activeTodos todos.filter(t !t.completed); if (activeTodos.length 1) { return todos.map(t this.wrapDefault(t)); } const taskListString activeTodos .map((t, idx) ${idx 1}. ${t.text}) .join(\n); try { const rawResponse await inferFn(TASK_PRIORITY_PROMPT, taskListString); // 清洗掉可能残留的包裹字符 const cleanJson rawResponse.replace(/json/g, ).replace(//g, ).trim(); const parsedResults: Array{ originalText: string; priority: PriorityLevel; suggestedTimeSlot: string; reason: string; } JSON.parse(cleanJson); const priorityWeights: RecordPriorityLevel, number { P0: 400, P1: 300, P2: 200, P3: 100 }; // 将模型返回的优先级映射回原本的待办数据中 const mappedList: PrioritizedTodo[] activeTodos.map((todo) { // 使用模糊匹配或精确前缀查找匹配项 const match parsedResults.find(r todo.text.includes(r.originalText) || r.originalText.includes(todo.text) ); const priority match ? match.priority : P2; const weight priorityWeights[priority] || 200; return { ...todo, priority, suggestedTimeSlot: match ? match.suggestedTimeSlot : 日间随心, recommendReason: match ? match.reason : 按部就班推进, score: weight }; }); // 按照分数降序排列P0 - P1 - P2 - P3 mappedList.sort((a, b) b.score - a.score); // 拼接回已完成的事项已完成项沉底 const completedList: PrioritizedTodo[] todos .filter(t t.completed) .map(t this.wrapDefault(t)); return [...mappedList, ...completedList]; } catch (err) { console.warn(端侧 AI 重排解析异常触发降级启发式排序:, err); return this.heuristicFallback(todos); } } private wrapDefault(todo: RawTodoItem): PrioritizedTodo { return { ...todo, priority: P2, suggestedTimeSlot: 常规日常, recommendReason: 按原顺序记录, score: 0 }; } /** * 离线降级方案基于关键词规则的轻量权重分配 */ private heuristicFallback(todos: RawTodoItem[]): PrioritizedTodo[] { const urgentKeywords [马上, 紧急, 立刻, 今日截止, 10点前, bug, 故障]; const focusKeywords [重构, 复盘, 规划, 学习, 核心, 设计]; return todos.map(todo { let priority: PriorityLevel P2; let reason 常规事项; if (urgentKeywords.some(k todo.text.includes(k))) { priority P0; reason 包含紧急时效词; } else if (focusKeywords.some(k todo.text.includes(k))) { priority P1; reason 核心专注任务; } return { ...todo, priority, suggestedTimeSlot: priority P0 ? 立即处理 : 稍后处理, recommendReason: reason, score: priority P0 ? 400 : priority P1 ? 300 : 200 }; }).sort((a, b) (b.completed ? 0 : 1) - (a.completed ? 0 : 1) || b.score - a.score); } }四、手账界面的丝滑重排过渡FLIP 动画当用户点击“智能晨整”按钮后任务列表如果瞬间闪烁跳变会让人感到困惑不适。我们配合现代前端的FLIPFirst, Last, Invert, Play动画法则让每张待办卡片在屏幕上优雅地滑移到新的优先级分组中export function animateListReorder(container: HTMLElement, updateDomCallback: () void) { // 1. First: 记录所有卡片的初始坐标 const items Array.from(container.querySelectorAllHTMLElement(.todo-card)); const firstPositions new Mapstring, DOMRect(); items.forEach(el { firstPositions.set(el.dataset.id || , el.getBoundingClientRect()); }); // 2. 更新 DOM 结构 updateDomCallback(); // 3. Last Invert Play requestAnimationFrame(() { const newItems Array.from(container.querySelectorAllHTMLElement(.todo-card)); newItems.forEach(el { const id el.dataset.id || ; const firstRect firstPositions.get(id); if (!firstRect) return; const lastRect el.getBoundingClientRect(); const deltaY firstRect.top - lastRect.top; if (deltaY ! 0) { // 反向形变 el.style.transform translateY(${deltaY}px); el.style.transition none; // 播放平滑滑移动画 requestAnimationFrame(() { el.style.transition transform 0.4s cubic-bezier(0.2, 0.9, 0.3, 1); el.style.transform translateY(0); }); } }); }); }五、隐私守护与开工心境调适在晨间使用这类工具时有两点深刻的人文与工程体会日程绝对不上云的安全感待办事项往往包含了极为隐秘的个人信息如“去医院体检”、“与老板沟通调薪”、“朋友生日聚会”。在纯前端端侧模型支撑下这些私密词汇只在本地显存中转瞬即逝永远不会被存储到第三方大模型厂商的训练数据集中。拒绝过度任务化Anti-over-scheduling工具应该提醒用户每天能够攻克 1 到 2 个 P0 级任务就已经是非常高效且充实的一天了。排在 P2、P3 的琐事哪怕今天完不成也不代表失败。给日程留出弹性的呼吸空间才是长期可持续工作的秘诀。六、结语AI 的真正价值不在于用繁杂的图表让生活变得更加紧绷而在于帮我们从杂乱的信息泥潭中理出一条清爽的线索。晨风微凉打开重新排列整齐的待办清单看着排在最前的那一项具体小事深呼吸一口气有条不紊地开始新一天的充实生活。