这次做个人记账 App有一类能力特别容易让人一开始想做大查询类自然语言。比如用户很自然会问这个月餐饮花了多少这个月预算用了多少最近7天交通和餐饮一共多少本周收入多少一看到这些问题很多人就会立刻想到两条路直接上大模型做开放式问答一次性把所有查询表达都支持掉这两条路我都没有走。这篇讲的就是这个记账 App 里的查询类自然语言是怎么一步步扩出来的为什么我没有一开始就把它做成“什么都能问”。为什么查询能力不能一开始就做太宽记账类查询有个很真实的问题用户的说法非常多但真正高频的诉求并没有那么多。比如表面上看“问账单”这件事很大但如果拆开MVP 阶段真正高频的其实是这些这个月某类花了多少这个月总共花了多少这个月收入多少这个月结余多少这个月预算还剩多少如果一开始就去做开放式问答多轮上下文同比环比任意时间范围组合那 parser 复杂度会很快上升而且误识别的代价很高。所以这次我在查询能力上的思路非常克制先做一个非常明确、非常可控的查询 MVP。第一步先只支持“这个月餐饮花了多少”这个项目里查询类自然语言最初的 MVP 只有一个能力这个月 单个分类 支出金额也就是只支持类似这个月餐饮花了多少5月交通支出多少2026-05教育消费多少这一步看起来很窄但它有几个好处时间范围明确只查按月数据指标明确只查支出金额分类明确只查单个分类API 返回结构清晰前端也好展示这就让第一版查询能力很快具备了“可用性”而不是停留在概念上。为什么我没有先做“总共花了多少”很多人会觉得这个月总共花了多少应该比这个月餐饮花了多少更基础。但从实现角度看单分类查询反而更适合作为第一步。原因很简单它能验证分类识别链路它能验证时间范围解析它能验证 parser 和 stats 的串联换句话说单分类查询能一次性验证更多链路。而如果一开始就只做“总共花了多少”虽然也能做但你很难确认分类解析到底有没有意义用户后面问更细的分类问题时链路是不是稳的所以我更愿意先从一个“稍微窄一点但信息量更足”的查询切进去。第二步从单分类扩到总支出、总收入、结余和预算当query_stats这个意图打通以后后面的扩展其实就有了固定模式。它本质上是识别出查询意图识别时间范围识别指标类型必要时识别分类调用 stats service 返回结果所以第二步扩展时我没有换思路而是继续沿着这条链路往前加这个月花了多少这个月收入多少这个月结余多少这个月预算还剩多少这个月预算用了多少这里有个很关键的判断扩查询能力时优先扩“指标”不是优先扩“表达自由度”。因为指标扩展更稳定表达自由度扩展更容易带来歧义。第三步从“这个月”扩到相对月份接下来才轮到时间范围扩展。这个阶段我优先支持的是上个月下个月而不是直接去做“最近 7 天”“近三个月”“过去半年”这种更自由的表达。原因还是一样相对月份对统计口径更稳定更容易和现有月度预算、月度统计逻辑对齐前端展示也更简单对于记账类产品来说按月是最自然的第一层时间维度。所以如果第一版月度查询都还没完全稳定就直接跳到很多动态时间窗口风险会明显增大。第四步再扩“最近 N 天”等按月查询和相对月份稳定以后才开始做最近7天花了多少最近30天收入多少最近7天餐饮花了多少最近7天交通和餐饮一共多少这一步为什么我放得比“上个月”更后因为“最近 N 天”和“自然月”的统计口径不是一回事。一旦引入滚动时间窗口就会多出这些问题起止时间怎么算今天算不算最近 7 天是不是包含今天前端要怎么展示范围这类问题一多统计和展示的复杂度就会上来。所以我的做法是先把“自然月”稳定再去做“滚动时间窗口”。第五步最后才做“本周 / 上周”本周、上周这种表达看起来简单但其实有个口径问题本周到底是从周一开始还是滚动 7 天上周是自然周还是过去 7 天的前一段如果这件事不先定义清楚用户看到结果时很容易误解。所以这个项目最后把语义明确成this_week 从周一到今天last_week 上一个自然周也就是说不是先去支持更多“说法”而是先明确每种说法背后的统计口径。这一步做完之后查询能力才开始真正像一个产品功能而不是一组零散规则。为什么查询能力扩展要优先“可解释”不是优先“像 AI”很多人做自然语言功能时会下意识追求用户想怎么问都行看起来越像聊天越好但对记账产品来说真正重要的不是“像聊天”而是“结果可信”。所以这次我在查询能力上的原则始终没变支持范围要清楚口径要稳定前端要能解释结果不支持的要明确提示这就是为什么很多查询能力其实不是“技术上做不到”而是我有意不在第一时间开放。我现在对查询类自然语言的一个判断做完这轮扩展后我越来越确定查询类自然语言不是一个“一次做完”的功能而是一个要按指标、时间维度、聚合方式逐层扩的能力。如果你一开始就把它当成开放式问答去做很容易失控。但如果你把它当成“围绕核心统计口径逐步扩展”的系统能力就会稳很多。最后这次记账 App 的查询能力没有一开始就追求“你想怎么问都行”而是从最窄、最可控的场景开始一步步扩到单分类月度查询月度总支出 / 收入 / 结余预算相关指标相对月份最近 N 天本周 / 上周这条路径让我更确定一件事自然语言功能最怕的不是做得慢而是做得太宽又解释不清。如果你最近也在做带自然语言查询的产品不妨先问自己一句我现在最该扩的是“表达自由度”还是“结果可信度”。