如果模型不可用,用户就不能完成任务,那么 AI 不是增强能力,而是新的单点故障。

这个判断来自一个很小的产品

“今天吃啥”解决的是一个具体问题:饭点没有耐心浏览,希望尽快决定这一顿吃什么。它不是找店、地图或外卖平台,也不需要登录、定位和实时商家数据。

最初很容易想到一个“更 AI”的方案:把预算、口味和天气都交给模型,再让模型返回菜品。问题是,模型未配置、网络超时、输出越界或服务限流时,最基本的决定也会消失。

先定义不依赖 AI 的最小可用结果

第一版把 96 道内置菜作为离线兜底,并提供五种场景。预算、忌口、场景与近期排除先做确定性过滤,餐段、喜欢和近期重复再做本机排序。页面先显示一个候选,后台 AI 才有机会做辅助排序或生成解释。

后续真实反馈把系统推到了更大的 V5 菜库和更具体的行动层:441 道是当前发布物规模,但仍待云端激活与真机复验;其中 60 道已经补齐做法步骤或外卖搜索词。规模变大没有改变主路径,离线兜底必须先工作。

INPUT场景、预算、忌口
LOCAL / REQUIRED过滤与排序断网也能完成
AI / OPTIONAL增强排序与理由任何失败都允许跳过
OUTPUT一个可执行决定

AI 可以知道什么,也要先写清楚

ALLOW候选与有限偏好

只在需要增强时提供已经过滤后的候选和最低必要上下文。

DENY身份与私人历史

身份、城市、精确天气、自定义菜和完整使用历史不发送给模型。

隐私边界不是“以后加一个设置”。它直接影响架构:越少数据进入 AI 路径,本机主路径越容易独立验证,失败时也越容易回退。

降级不是一句 try-catch

失败页面行为不可接受的结果
AI 未配置直接使用本机推荐要求用户先配置模型才能吃饭
请求超时保留当前结果,不阻塞交互长时间 loading 或清空候选
返回非法菜品忽略增强结果展示不在候选集或违反忌口的内容
天气不可用移除天气权重把旧天气当成当前事实
本地存储失败本次仍可决定,提示状态未保存把写入失败伪装成成功

这套方法不等于“不要 AI”

AI 仍然有价值。它可以在候选范围内提供更自然的理由,发现本机规则难以表达的软偏好,也可以帮助验证规则是否过于僵硬。但它必须在一个已经可用的产品上增加价值,而不是用不确定性替换基础能力。

STEP 01确定性基线

先让用户在无网络和无模型时完成核心任务。

STEP 02有限增强

限定输入、输出集合、超时和回退行为。

STEP 03真实验证

用用户行为判断增强是否值得保留,而不是默认越多越好。

当前证据到哪里为止

小范围真实试用已经产生“重复”“没胃口”“推荐后不知道下一步”等定性反馈,并推动轮换、口味调整、行动菜、盲盒和“我的食光”迭代。145 项自动化测试已经通过;45 秒仍是目标,不是测得的平均值,10 人连续 7 天正式验证、V5 云端激活、公开上线和效果数据仍未完成。

可复用检查

先写出无 AI 时的最小结果,再列出模型未配置、超时、越界、限流和数据失败时的页面行为。任何一项只能用“请稍后重试”回答,说明产品主路径还没有独立。

RELATED PROJECT今天吃啥

查看四个真实小程序界面、反馈到迭代的证据链、96 / 441 / 60 分层菜库、Kun / Agent 分工与待验证边界。

查看完整案例