给青团团装个「脑组件」:我为什么把 prompt 做成商品
我卖 ¥6 的东西,本质上是一段提示词。这话听起来像割韭菜,我想解释一下它为什么值——顺便把手机端 agent 的 context 工程摊开讲。
我卖 ¥6 的东西,本质上是一段提示词。
这话听起来像割韭菜,但我想解释一下为什么它值。
先说结论:如果你觉得「一段 prompt 凭什么收钱」,你说得没错——单独一段 prompt 确实不值钱。值钱的是它接在什么数据上。这篇文章就是讲这件事。
先把话说难听一点
「卖 prompt」在 2026 年已经是个有点脏的词。
前两年满地都是「9.9 元 10000 条万能提示词」,买回来一看,是从网上抄的模板拼贴。这种东西确实是割韭菜,我不替它辩护。
所以我给自己划了条线:我卖的东西如果脱离这个 App 还能用,那它就不值钱。
反过来说,如果它必须接在你的冰箱、你的账本、你这周吃了什么上面才成立,那它就不是一段可以复制粘贴的文本,而是一套配方。
至于我卖的是不是后者,看完下面这些你可以自己判断。
手机上没有后端,「聪明」是另一回事
吃好饭没有服务器。AI 是 BYOK——用户自己填 API Key,请求从手机直连服务商,不经过我。
这个设定带来一个后果:我没法靠「用更大的模型」让青团团变聪明。用哪个模型是用户决定的,花的也是用户的钱。
那还剩什么能做?只剩三件事,也正是这几年 agent harness 在做的事:
- 攒:把用户在结构化数据(冰箱 / 账本 / 打卡)和聊天里透露的长期偏好,沉淀成端上记忆。
- 选:每次提问只把相关的那几条喂给模型。
- 压缩:对话长了,把旧内容摘要化,腾出 context 窗口。
说人话:模型是一个记性很差、但很聪明的临时工。你能做的不是给它换脑子,是每次上工前给它递一张写得刚刚好的纸条。
这张纸条怎么写,就是我能卖的东西。
分层 context:七层,和谁先被丢掉
系统提示不是一整块字符串,是七层拼出来的,按优先级在 token 预算内组装:
- 人设——青团团的口吻,最小固定
- 安全红线——过敏 / 忌口,永不截断
- 此刻状态——冰箱现有、临期、今天吃没吃
- 用户画像快照——从结构化数据派生:在减脂还是控糖、几口人、爱不爱吃辣、常做饭还是常点外卖、最近常吃哪几道
- 已装技能的专家片段——付费技能注入的领域提示 + 它专属的 context 配方
- 聊天记忆——长期偏好笔记
- 滚动摘要 + 最近几轮对话——最先被截断的那层
超预算的时候,从第 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 算。这是个保守上界,宁可少塞也不超窗。
说人话:算不准就往贵了算,反正超窗是硬故障,浪费一点只是可惜。
记忆:团团记住的关于你的事,封顶 30 条
端上有一份 chatMemory,一条条写着「团团记住的关于你的事」:
「不吃香菜」「在减脂」「晚上不吃主食」「孩子挑食」。
每条带类型(忌口 / 慢病 / 目标 / 偏好 / 事实)、时间、来源。忌口和慢病算安全类,注入时进红线层,淘汰时最后才丢。
- 怎么攒:每次聊完,用用户自己的模型跑一次轻量抽取——把对话变成「值得长期记住的饮食/健康偏好」JSON,去重并入,封顶 30 条。
- 怎么用:提问时按相关度 + 新鲜度挑几条注入第 6 层。检索用的是 bigram 关键词命中加新鲜度加权,没上向量——三十条数据上向量库,是给自己找活干。
- 谁说了算:App 里有个「团团记住的你」页面,可看、可改、可删、可清空。
说人话:它记的东西你随时能翻出来打脸,这是记忆功能唯一诚实的做法。
封顶 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 的技能给出的东西没有明显强过免费版,那它就是骗钱,退款和差评是应得的。
目前的购买数据和退款数据:【待填:技能购买 / 退款数据】。 等有了我再写一篇,难看也照发。
我给自己划的三条线
- 技能全部是饮食建议,不是医疗建议;过敏和忌口在任何 context 压缩下都不许被挤掉。
- 模型永远是用户自己的(BYOK)。我不代收 AI 费用,也不做转售。
- 养成和积分永远不碰钱。 青团团的全部进化形态靠打卡拿,一分钱都不卖。碰了它,我就把自己的留存引擎拆了。
回到开头那个问题。
卖 prompt 是不是割韭菜?如果那段 prompt 脱离产品还能用,那多半是。如果它必须接在用户自己的数据上才成立,那它就是一个功能,只不过实现方式恰好是文本。
至于我做的属于哪种,欢迎你装完之后回来骂我。
吃好饭 iOS 已上架,App Store 搜「吃好饭 AI冰箱」。这个系列会一直写下去,欢迎在留言区骂我。