AI 生活账单分类:模糊消费记录的结构化不是靠猜测
AI 生活账单分类:模糊消费记录的结构化不是靠猜测
一、消费分类的准确率瓶颈在输入质量而非模型能力
AI 记账应用的卖点之一是自动分类消费。用户输入"星巴克35",模型识别为"餐饮-咖啡";输入"淘宝200",分类为"购物"。这种分类在典型消费场景下准确率不错,但遇到模糊输入就明显下降。"超市买了点东西大概一百多"不知道是日用品还是食品,"给朋友转账500"不知道是社交还是借贷。
模糊输入不应该靠模型猜测分类。猜测的分类会导致统计偏差——用户以为自己食品消费占30%,实际模型把一半日用品都猜成了食品。正确做法是给模糊输入设置"待确认"状态,让用户在方便时补充分类信息。模型提供候选分类,用户最终决定。
二、消费分类链路的"确认层"设计
分类链路应该在模型输出后增加一个确认层。明确输入直接分类存储,模糊输入进入待确认队列。
flowchart TD A[消费输入] --> B[金额解析] B --> C[描述清晰度评估] C --> D{描述是否足够清晰} D -->|清晰| E[模型自动分类] D -->|模糊| F[模型提供候选分类] E --> G[直接存储] F --> H[待确认队列] H --> I[用户补充分类] I --> G G --> J[分类统计]清晰度评估不需要复杂模型。关键词匹配就够了——包含具体商品名、品牌名、店铺名的输入视为清晰,只包含"买了一些东西""花了点钱"的视为模糊。区分清晰和模糊比追求100%自动分类更务实。
三、消费分类与确认机制的实现
type ExpenseInput = { description: string; amount: number; date: string; }; type ExpenseRecord = { description: string; amount: number; category: string; status: "confirmed" | "pending"; suggestedCategories: string[]; }; // 描述清晰度评估:简单关键词匹配 function assessClarity(description: string): "clear" | "fuzzy" { const clearKeywords = ["星巴克", "地铁", "电费", "房租", "加油", "医院"]; const fuzzyKeywords = ["买了一些", "大概", "忘了", "不太确定"]; if (clearKeywords.some((k) => description.includes(k))) return "clear"; if (fuzzyKeywords.some((k) => description.includes(k))) return "fuzzy"; // 包含具体金额和商品描述的视为清晰 if (description.length >= 5) return "clear"; return "fuzzy"; } export function classifyExpense(input: ExpenseInput): ExpenseRecord { const clarity = assessClarity(input.description); if (clarity === "clear") { const category = autoClassify(input.description); return { ...input, category, status: "confirmed", suggestedCategories: [category], }; } // 模糊输入:提供候选分类让用户选择 const candidates = suggestCategories(input.description); return { ...input, category: "待确认", status: "pending", suggestedCategories: candidates, }; } function suggestCategories(description: string): string[] { // 根据描述中的零碎线索提供最多3个候选分类 if (description.includes("超市") || description.includes("买")) { return ["日用品", "食品", "服饰"]; } if (description.includes("朋友") || description.includes("红包")) { return ["社交", "人情", "转账"]; } // 完全无法推断时提供常见分类供用户选择 return ["餐饮", "购物", "交通", "娱乐"]; }候选分类最多3个,不提供10个让用户逐一排除。3个候选加上"其他"选项,用户只需做简单选择。待确认的记录在统计中用单独颜色标记,不混入已确认的分类统计中,避免数据污染。
四、分类准确率的验证不能只看自动分类的比例
很多人用"自动分类占比"来衡量产品效果——90%的消费记录被自动分类,看起来很好。但如果其中30%的分类是错误的,统计结果就不可信了。更合理的指标是"分类正确率",即自动分类中有多少是用户没有纠正的。
用户纠正率是最直接的反馈。如果80%的自动分类没有被纠正,说明模型判断可靠;如果纠正率超过40%,说明自动分类的参考价值不大,应该更多转为待确认队列。
还有时间成本考量。待确认队列里的记录越多,用户需要花更多时间补充分类。如果每笔消费都要确认,自动分类的意义就消失了。产品需要在"分类准确率"和"用户操作负担"之间找平衡点,而不是追求单方面的极致。
五、总结
AI 消费分类应把模糊输入交给确认层而非模型猜测。描述清晰度用简单关键词评估,清晰输入直接分类,模糊输入进入待确认队列并提供最多3个候选分类。待确认记录不混入已确认的统计。衡量效果看分类正确率和用户纠正率,而非自动分类占比。产品要在准确率和操作负担间找平衡。