← 全部开发日记
2026-09-09 · AI商业模式

给青团团装个「脑组件」:我为什么把 prompt 做成商品

我卖 ¥6 的东西,本质上是一段提示词。这话听起来像割韭菜,我想解释一下它为什么值——顺便把手机端 agent 的 context 工程摊开讲。

我卖 ¥6 的东西,本质上是一段提示词。

这话听起来像割韭菜,但我想解释一下为什么它值。

先说结论:如果你觉得「一段 prompt 凭什么收钱」,你说得没错——单独一段 prompt 确实不值钱。值钱的是它接在什么数据上。这篇文章就是讲这件事。

配图技能货架半屏截图,能看到 2 个免费技能和 8 个 ¥6 技能

先把话说难听一点

「卖 prompt」在 2026 年已经是个有点脏的词。

前两年满地都是「9.9 元 10000 条万能提示词」,买回来一看,是从网上抄的模板拼贴。这种东西确实是割韭菜,我不替它辩护。

所以我给自己划了条线:我卖的东西如果脱离这个 App 还能用,那它就不值钱。

反过来说,如果它必须接在你的冰箱、你的账本、你这周吃了什么上面才成立,那它就不是一段可以复制粘贴的文本,而是一套配方。

至于我卖的是不是后者,看完下面这些你可以自己判断。

手机上没有后端,「聪明」是另一回事

吃好饭没有服务器。AI 是 BYOK——用户自己填 API Key,请求从手机直连服务商,不经过我。

这个设定带来一个后果:我没法靠「用更大的模型」让青团团变聪明。用哪个模型是用户决定的,花的也是用户的钱。

那还剩什么能做?只剩三件事,也正是这几年 agent harness 在做的事:

说人话:模型是一个记性很差、但很聪明的临时工。你能做的不是给它换脑子,是每次上工前给它递一张写得刚刚好的纸条。

这张纸条怎么写,就是我能卖的东西。

分层 context:七层,和谁先被丢掉

系统提示不是一整块字符串,是七层拼出来的,按优先级在 token 预算内组装:

  1. 人设——青团团的口吻,最小固定
  2. 安全红线——过敏 / 忌口,永不截断
  3. 此刻状态——冰箱现有、临期、今天吃没吃
  4. 用户画像快照——从结构化数据派生:在减脂还是控糖、几口人、爱不爱吃辣、常做饭还是常点外卖、最近常吃哪几道
  5. 已装技能的专家片段——付费技能注入的领域提示 + 它专属的 context 配方
  6. 聊天记忆——长期偏好笔记
  7. 滚动摘要 + 最近几轮对话——最先被截断的那层

超预算的时候,从第 7 层往上丢,整层丢,不做半截截断。第 2 层钉死,任何情况下都不动。

说人话:宁可让团团忘了你上周聊过什么,也不能让它忘了你对花生过敏。

代码里长这样(lib/services/ai_engine/context_engine.dart):

ContextBuilder(harness 核心)
  ├─ 收集各 ContextProvider 的紧凑文本 + 优先级 + token 估算
  ├─ 叠加「已装技能」声明要注入的片段与所需 provider
  └─ 按优先级在 token 预算内组装最终 system prompt

ContextProvider(数据源统一接口)
  · 冰箱库存/临期  · 本周营养  · 本周花销/浪费
  · 成员健康(慢病/目标/身份)  · 口味&做饭习惯  · 吃过啥  · 聊天记忆
  每个: toContext() -> (text, priority, tokenEstimate)

assemble() 默认 token 预算 2200。token 估算我用的是最土的办法:中文按 1 个字 ≈ 1 token 算。这是个保守上界,宁可少塞也不超窗。

说人话:算不准就往贵了算,反正超窗是硬故障,浪费一点只是可惜。

配图分层 context 示意图,七层堆叠,第 2 层标「钉死」,第 7 层标「最先丢」

记忆:团团记住的关于你的事,封顶 30 条

端上有一份 chatMemory,一条条写着「团团记住的关于你的事」:

「不吃香菜」「在减脂」「晚上不吃主食」「孩子挑食」。

每条带类型(忌口 / 慢病 / 目标 / 偏好 / 事实)、时间、来源。忌口和慢病算安全类,注入时进红线层,淘汰时最后才丢。

说人话:它记的东西你随时能翻出来打脸,这是记忆功能唯一诚实的做法。

封顶 30 条这个数字,是我拍脑袋定的。 没有实验支撑,纯粹是「感觉够用又不会把 context 撑爆」。这是我这套设计里最没底气的一个常量。

配图「团团记住的你」管理页截图,能看到条目类型标签和删除按钮

消化时机:我抠的是用户的钱

抽记忆要调一次模型,摘要也要调一次。这两次调用花的都是用户的 API 额度。

所以我把它们合并了:离开聊天页时,一次性做一次「消化」——滚动摘要 + 记忆抽取,合并成一次 LLM 调用,temperature 0.2,至少有两轮新对话才触发,失败就静默跳过、下次再来。

说人话:用户不会因为「后台又偷偷调了一次」骂我,因为一次聊天最多多花一次调用,而且他人已经退出去了,感知不到延迟。

这是我在整个 AI 设计里花时间最多的一个决定。不是技术难,是每多调一次接口,我都在花别人的钱,这种约束反而逼出了更克制的方案。

记忆回流:只问一次

聊天里团团记住了「不吃香菜」,接下来会弹一张很轻的确认卡:

「写进档案,让配餐也避开?」

采纳了,这条忌口就写进就餐成员档案,真的参与配餐的硬过滤——不是嘴上说说,是引擎层面直接把含香菜的菜筛掉。

关键在于:采纳或拒绝,都只问一次。每条记忆有个 synced 标记,处理过就不再打扰。

说人话:AI 帮你改设置这件事,越权一次就再也不会被信任。所以宁可少问,不能追问。

那么,¥6 买的到底是什么

技能在代码里是一个纯数据对象,没有后端:

AiSkill {
  id, 名称, 图标, 领域,
  systemPromptFragment,   // 专家人设与方法论
  contextRecipe,          // 依赖哪些 provider、怎么强调
  presets,                // 输入框上方的快捷问题
  outputSchema,           // 结构化产出
  localTools?,            // 可选本地小工具
  productId, version
}

注意 contextRecipe 这一项。这才是技能之间真正的区别。

「减脂教练」和「控糖管理」的人设片段可能都只有一两百字,但它们要的 context 完全不同:减脂要盯热量缺口和蛋白质,会重点拉本周营养和成员目标;控糖要看碳水配比和 GI,冰箱库存的排序逻辑都不一样。

首批上了 8 个付费专家,统一 ¥6 一次性买断,非消耗型,没有订阅:

技能一句话
减脂教练算清热量缺口,按你的冰箱出低卡餐
控糖管理低 GI 优先,稳住餐后血糖
孕期/月子营养分阶段孕产营养,禁忌食材硬过滤
增肌食谱高蛋白配餐,训练日休息日分开算
宝宝辅食按月龄进阶,过敏原引入有节奏
三高慢病食养控压控脂控尿酸,红线食材有替代
中医食养辨体质、顺时令,药食同源
一周备餐大师一次采购分装复用,工作日不慌

商品 ID 统一是 top.chihaofan.app.skill.<id>,比如 top.chihaofan.app.skill.slim_coach

另外有 2 个免费技能:节气食养官、剩菜改造师。放免费不是做慈善,是让人先尝到「装了脑组件确实不一样」的体感——尝不到,后面 8 个我一个也卖不出去。

这里必须说清楚:以上全部是饮食建议,不是医疗建议。 减脂、控糖、孕期、慢病这些场景,技能会给配餐思路,但它替代不了医生。这句话我写在了 App 里,也写在这里。

它和 ChatGPT 套壳的区别

这是我被问最多的一句:「这不就是套壳吗?」

区别只有一句话:套壳不知道你冰箱里有什么。

你可以把「减脂教练」那段 prompt 原样复制到任何一个通用聊天框里。然后你会得到一份很标准、很正确、也很没用的建议——因为它不知道你冰箱里躺着半棵白菜、两个鸡蛋和一块明天就到期的豆腐。

它也不知道你这周已经吃了三顿面,不知道你家有个不吃香菜的人,不知道你这个月买菜预算还剩多少。

我知道。因为这些数据本来就在这台手机上,是用户自己记进去的。

所以我卖的不是 prompt,是 prompt × 本地数据。前者可以抄,后者抄不走——这不是因为我技术多好,纯粹是因为数据在用户手机里,而我做了个能读到它的壳

顺带一提,正因为记忆是本地的,它有个别人做不到的属性:你能一键清空。别家的「记住你」是数据在他们服务器上,你清不掉。记忆和摘要也不进导出同步码——同步码是给家人同步冰箱账本用的,记忆太私人,只随本人 iCloud 备份走。

三件我没想清楚的事

一、一次只能装一个技能。

equippedSkillId 是单数。装了减脂教练就装不了备餐大师。

我当时的理由是「专家片段叠加会互相打架,也会挤爆 context」。这理由站得住,但对一个既在减脂又要给孩子做辅食的人来说,就是难用。多技能怎么共存,我到现在没想明白。

二、技能上新 = 发版。

技能内容随 App 版本内置,加一个技能要发一次版。好处是不触发任何热更新合规问题,坏处是节奏完全卡在我一个人身上。

远期可以做后端下发,但那会引出一堆合规问题,暂时不做。

三、我还不知道它到底值不值 ¥6。

技能质量是这门生意的命门。如果一个 ¥6 的技能给出的东西没有明显强过免费版,那它就是骗钱,退款和差评是应得的。

目前的购买数据和退款数据:【待填:技能购买 / 退款数据】。 等有了我再写一篇,难看也照发。

我给自己划的三条线


回到开头那个问题。

卖 prompt 是不是割韭菜?如果那段 prompt 脱离产品还能用,那多半是。如果它必须接在用户自己的数据上才成立,那它就是一个功能,只不过实现方式恰好是文本。

至于我做的属于哪种,欢迎你装完之后回来骂我。

吃好饭 iOS 已上架,App Store 搜「吃好饭 AI冰箱」。这个系列会一直写下去,欢迎在留言区骂我。