跳至内容

0007 AI 能力:先做整句识别,AI 只负责听懂 ​

背景 ​

  • 用户想要「说一句话就出菜」:冰箱里有什么、不吃什么、想怎么做,现在要分别点食材、忌口、口味、厨具。
  • 菜谱是人工整理的 600 多道菜,每道都对应一个 B 站视频,这是和通用 AI 助手不同的地方。
  • 原则是尽量降低运营成本:免费用户零服务器成本,会员费覆盖云端开销(见 0003)。
  • 在中国大陆向公众提供调用大模型的功能,一般要到当地网信办做生成式人工智能服务登记,周期几周到几个月。
  • iOS 的 Foundation Models 端侧模型免费,但只支持 iPhone 15 Pro 及更新机型,国行 Apple Intelligence 尚未正式上线。

方案对比 ​

方案取舍
AI 生成菜谱、菜品图或做聊天助手可能编出做不成的菜,成本随用户增长,和通用助手同质化
云端大模型理解整句体验最好,每次约 0.15 分钱(DeepSeek flash),但要登记,免费用户也会产生成本
iOS 端侧模型理解整句免费、离线,但覆盖机型和地区有限,Web 用不了
词表 + 最长匹配理解整句零成本、两端一致、可测;说法超出词表时认不出

决定 ​

  • AI 只把用户的话翻译成现有筛选条件(食材、忌口、不辣、厨具、做法、难度),结果仍由推荐逻辑从现有菜谱里挑。不做 AI 编菜谱、菜品图和聊天。
  • 第一步不用模型:parseCookQuery(packages/cook/src/utils/query.ts)按 packages/data/query.json 的词表做最长匹配,支持「不要 / 不吃 / 过敏」前后置否定、「没有」和「不辣」。用例在 packages/data/fixtures/query.json,Web 和 iOS CookCore 都要通过。
  • Web 做菜页的输入框接受整句,识别结果写在输入框下方;只列食材时和原来一样。识别成功和失败分别上报 parse_query、parse_query_empty(只有事件名,不含输入内容)。
  • 词表识别是两端共有的底线。真正用模型的 AI 功能只做在 iOS 客户端、只用端侧模型;Web 不做:浏览器没有 Foundation Models,要做只能走云端,会带来调用费用和登记。
  • 之后按顺序推进,每步看数据再决定:
    1. iOS 移植 parseCookQuery,接 App Intents(M3)。
    2. iOS 在支持的设备上用 Foundation Models 把认不出的句子转成同样的结构,作为增强,没有时回落到词表。
    3. iOS 27 起端侧模型能看图,在支持的设备上做「拍照识别食材」,可以作为会员功能(M4)。
    4. 我们不提供云端模型。之后可以让用户在设置里填自己的 DeepSeek API Key(自带 Key):请求从客户端直接发给 DeepSeek,费用由用户自己承担,我们没有服务器,也没有调用费。Key 只存在本机(iOS 放 Keychain),不上传,也不跟着收藏一起同步。iOS 先做;Web 要看 DeepSeek 接口是否允许浏览器跨域调用。这种方式是否需要登记,上线前要确认。
  • AI 不能挤占原生体验:
    • 不新增 Tab、独立 AI 页面或悬浮按钮。入口复用现有的搜索框;拍照识别做成搜索框里的一个小图标。
    • 点选食材的主流程不变。只有用户主动输入整句或拍照时才调用模型。
    • 模型不可用(机型、地区、没填 Key)时直接隐藏入口,不弹提示,也不引导开通。
    • 不阻塞操作:先给出词表识别的结果,模型结果回来后再补充;超时就放弃。
    • 识别出的条件全部用现有的标签和筛选项展示,用户可以逐个移除。设置里有一个总开关,可以关掉 AI。
    • 不为 AI 引入影响启动速度或包体积的大依赖。

影响 ​

  • 新的说法靠补 query.json 词表覆盖;parse_query_empty 多了说明词表不够,再考虑上模型。
  • 改词表或解析规则时要同时改 fixtures/query.json 和 CookCore 的实现。
  • 忌口和「不辣」与手动勾选一样会一直保留,用户在识别提示里能看到生效的条件。