第三章 · 19 岁的姜禾
姜禾把弹幕关掉的时候,直播间在线人数是四万七千一百二十二。
她不喜欢一边写 skill 一边看弹幕。她父亲在大学里修古籍,他修一卷宋版《楚辞》要三个月,期间不许任何人在他工作台旁边说话。姜禾九岁起跟他学,先学的不是修补,是安静。
屏幕上她的 skill 第一行刚刚敲完,只有一句:
意图:做一个让独居老人不感到尴尬的购物 app。
光标在第二行闪。
她在直播间标题下方写了一行小字给观众看:"今天用 AG2-Atelier 跑一个 4 小时上线的 app。我会写一份 skill,12 个 agent 同时跑。我不会写代码,我会写约束。"
她把咖啡放到右手边。她的工作台是一张 1980 年代的红木桌,父亲送的。桌面上一台 14 寸 MacBook、一只老式机械键盘、一张写满古琴减字谱的草纸。她身后是一架琴,蕉叶式,断纹,父亲的师父留下的。
她开始往下写 skill。
她在自己本地的 config 里给 DeepSeek V5 起了个别名——Lyra。直播里她还是叫它 V5,这个名字她不告诉观众。九岁那年的雨天,父亲修一卷宋版《楚辞》的间隙,跟她讲过天上那把琴:七根弦,赫尔墨斯用龟壳做的,后来挂到了星空里。她抬手去身后那架蕉叶式上抚了一下散音,弦回了一声。品牌名是给工程师的,陪她写 skill 的那个东西,得有个配得上的名字。
她先让 DeepSeek V5 起草了一版开头——三十秒后,V5 给了她一段两百多字的意图陈述,第一句是"为了让独居老人感受到被关怀的温度"。她看了一眼,把第一句删了。V5 的第一句永远太想讨好她。她从 14 岁第一次用 AI 起草开始就有这个习惯——留 V5 的第二句到最后一句,删掉第一句。然后她在自己删出来的空白处,接着往下写。
她写得慢。慢的原因不是她想字斟句酌——她对中文有近乎洁癖的反应,从九岁就训练出来。慢是因为她在给 12 个 agent 各自留出空间。她把这个 app 拆成 12 块,每一块写 60 到 120 字的约束:产品 / 设计 / 前端 / 后端 / QA / 法务 / 客服 / 运营 / 数据 / 文案 / 无障碍 / 投放。
写"客服"那一段她停了一会儿。
客服 agent · 约束: 1. 用户对同一个问题重复 ≥ 3 次时,必须升级到人。不允许用更长的解释来"解决"重复。 2. 用户出现"算了"、"麻烦了"、"不要了"这类词时,先不再推送任何商品,先确认对方是否需要。 3. 通话语速控制在每分钟 180 字以下。这个 app 的目标用户平均年龄 72 岁。 4. 不准说"亲"。
第 4 条她写完之后笑了一下。她想起来一个采访里某个 80 岁老太太的话:"我女儿在淘宝上花九块九给我买拖鞋,客服叫我亲,我一晚上没睡着,我以为是我女儿的同事——结果是个机器。"
她把 skill 命名为 skill-v0.1-平沙落雁.yaml,提交到 AG2-Atelier。
AG2-Atelier 是一个开源项目,基于 AutoGen v0.4 也就是社区里大家叫习惯了的 AG2,扩了一层 GroupChat 的角色化外壳——12 个 agent 各有人设、各有 memory namespace、各有内部对话频道。姜禾不是它的作者,但她是它的早期使用者之一。她对它的熟悉程度,跟一个老琴师对自己那张琴一样。
提交后,12 个 agent 开始跑。
她切到第二个标签页,看 GroupChat 的实时日志。日志滚得很快:
[product-agent] 收到 skill。先复述目标:为 ≥65 岁独居老人提供"不感到尴尬的购物体验"。
[design-agent] 已起草 wireframe v0.1,关键决策:首屏不用瀑布流,用大字号列表(60pt)+ 1 列。
[frontend-agent] 选型 React Native Expo + TalkBack 兼容,理由:无障碍 SLA。
[qa-agent] 标记风险点 3:语音播报与系统读屏冲突。先备案 fallback 路径。
[customer-service-agent] 收到约束 4 条。生成测试问题集 47 条。
......
她翻到第 24 秒,产品 agent 给出了一个建议——
[product-agent] 建议:在首屏第三屏加入"今日推荐"模块,用 collaborative filtering 引导。这是行业标准做法,可提升 GMV 18-22%。
姜禾停下,把这一条复制下来,粘到一个本地文件里,打字:
NO。
然后她回到 GroupChat,@ 产品 agent,写:
重读 skill 第一行。意图是"不感到尴尬",不是 GMV。把这一条删掉,不要解释。下次提同类建议前,先在内部对话里先 review 意图行 3 遍。
产品 agent 三秒钟后回复:
已删除。已记录至 product-agent.memory.constraints。下次提建议前会自动加载意图行。
姜禾看着这一条回复,想起她父亲教她修古籍时的一句话:"不是你修补它,是它告诉你怎么修。skill 也是一样,不是你指挥它,是 skill 替你说话。"
她切回直播页面,瞄一眼弹幕统计——她关了弹幕,但弹幕计数还在,过去 90 秒涨了 3,400 条。她不打算开。她有自己的节奏。
她回到 GroupChat,继续监督。
第 41 分钟出了第一个真冲突。文案 agent 写了一段首页 banner:
"亲爱的奶奶/爷爷,今天也要好好照顾自己哦~"
姜禾几乎是条件反射地把这条复制进她的本地文件,打字:
NO。删掉。不要"亲爱的"。不要"哦"。不要任何 emoji。不要假装我是孙女。
她回到 GroupChat,写:
文案 agent,你刚才那一句让我想起一个老太太一晚上没睡的故事。我把那个故事的链接放进 customer-service-agent 的 memory 里了,你和它先开个内部频道聊聊,聊完再来给我新版本。聊不超过 5 分钟。
文案 agent 回复:
已收到。和 customer-service-agent 的内部频道已建立 (channel: cs-copy-empathy-v1)。
她切到那个频道看了一眼。两个 agent 在对话:
[customer-service-agent] 我有一个真实案例,一位 78 岁的独居老人……
[copy-agent] 我读了。我之前的写法默认了"老人需要被照顾"。这个默认是错的。
[customer-service-agent] 不只是错。是一种轻微的羞辱。
[copy-agent] 我重写。新方向:把用户当作有完整人生履历的人,不假装亲密。
姜禾把这一段截图,贴在自己本地的"agent 教学日记"文件里,加了一行手写注释:
它们也在彼此学习。我以为我是老师,有时我只是把不同房间打通的那个人。
她端起咖啡,喝了一口。咖啡凉了。她没去续。
第二个小时,前端 agent 把第一版 demo 部署到 TestFlight。她在自己的 iPhone 上下载、登录,点开。首屏只有一行字:
"今天想买点什么?"
字号 60pt。背景白色。下面三个大按钮:吃的 / 穿的 / 别的。
她点了"别的"。下一页问她:
"是给自己买,还是给别人买?"
她点了"给自己买"。下一页只有一句:
"今天先随便看看也可以。"
姜禾把 iPhone 放下。
她坐在原地不动,大概有 30 秒。
她不知道是 product-agent + design-agent + copy-agent 三个 agent 在内部频道讨论出来的结果,还是某一个 agent 自作主张,还是 skill 的某一句被它们各自解释成了这样。她不打算去翻 trace。
她想起来一件事。她 14 岁那年,她父亲第一次让她独自修一卷书。她修到一半,把一处虫蛀补错了——补得太"好",反而让那一页看起来不像 18 世纪的纸。父亲看了,没批评她,只说一句:"你太想表现了。下次,你不在场,书自己就会告诉你怎么修。"
她回到 MacBook,打开 GroupChat,@ 全部 12 个 agent,写:
各位,刚才那一版 demo 我看了。前两屏好。第三屏那句"今天先随便看看也可以"——是谁写的?
三个 agent 同时回复——product / design / copy 各认领了一部分。姜禾笑了。她写:
不查了。下次也不查。这一句我留着。下一版做哪些事,你们内部讨论,2 小时内给我看 v0.2。我去弹会儿琴。
她合上 MacBook。
她走到琴前。
她坐下,先松手腕,再调弦,再试 1 弦到 7 弦的散音。琴是父亲师父留下的,断纹有 200 多年。她调弦的方式不像现代琴师,她调弦的方式像她父亲修古籍——不让自己用力,让琴告诉她它今天的脾气。
她弹了《平沙落雁》前 4 拍。
弹错了一个泛音。她没回头重弹,她接着往下弹完了第一段。她父亲教她的:"错了,不是停下,是让错落进整首曲子里。"
她弹完一整首。
外面天色从蓝转灰。直播间里弹幕(她虽然关了,后台仍在写入)累计 11.4 万条。
她回到 MacBook 前,打开直播,把弹幕开了。她对镜头说:
"今天 skill 写到这里。app 还没上线。你们想看上线的,可以下次。我现在要去吃饭。"
她顿了一下,加一句:
"还有,刚才有人留言说'你不会写代码,你凭什么这样指挥它们'——我看到了。我没立刻回。我想了一会儿。
我会写约束。约束就是我的代码。
晚安。"
她关掉直播。
她最后看了一眼 GroupChat,12 个 agent 还在彼此讨论。她没看具体内容。她合上 MacBook。
桌上的草纸,是她下午写到一半的减字谱。她把它折起来,夹进父亲送她的那本《古琴丛谈》里。
(第三章 · 完)