10小时黑客松,我们做了个 2am 也在线的电竞搭子

—— 毒奶观察室:AI 搭子陪你看比赛,一起吐槽,一起破防,一起把赛后朋友圈也写了。

凌晨一点半,一个人窝在沙发上看决赛。

主队前期裂开,弹幕在刷,论坛在吵,你本来还能装作很冷静。结果决胜局最后一波,对面五个人去抢大龙,我方一个人绕后偷家,水晶爆掉的一瞬间,你从沙发上弹起来:

“卧槽!这也能偷?!”

喊完才发现,屋里就你一个人。

你想给朋友发消息,朋友睡了。想给对象解释,对方问你:“偷塔是什么意思?” 想发朋友圈,憋了半天只憋出一句 YYDS,配图还像从营销号偷的。

这就是我们在黑客松里抓住的那个场景:电竞观赛不缺信息,缺的是一个懂你阵营、懂你黑话、也能接住你情绪的人。

于是有了这个项目:毒奶观察室

先放一版 demo 演示,后面再拆它是怎么做出来的:

src="https://player.bilibili.com/player.html?isOutside=true&bvid=BV1btVZ6jEow&p=1" title="毒奶观察室 demo 演示视频" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true">

如果上面的播放器加载不出来,也可以直接去 B 站看:毒奶观察室 demo 演示视频

先说明一下视角:这篇不是“我一个人包圆整个项目”的战报,而是我作为研发负责人 / 技术负责人,对这个团队黑客松项目做的一次复盘。所以产品判断和用户链路,我会更多用“我们”;具体到架构、prompt、AI 调用链和工程取舍,我会回到“我”的视角。

01. 缘起:看比赛这件事,正在变得越来越孤独

我们一开始没想做一个“AI 聊天机器人”。

聊天机器人太泛了,什么都能聊,也就意味着什么都不够锋利。黑客松时间很短,如果一上来就说“我要做一个通用陪伴 Agent”,那大概率最后做出来的是一个套壳 ChatGPT,再加几张炫酷卡片。

我们真正想解决的是一个更窄的问题:

当一个电竞粉丝独自看比赛时,他的情绪没有地方落。

这件事挺微妙。虎扑、B站、直播间弹幕都很热闹,但那种热闹是广场,不是朋友。你发一句“这波怎么敢开的”,立刻被几百条弹幕冲走。它有群体氛围,但没有个体回应。

而电竞比赛最强的地方,偏偏就是情绪密度:

  • 赛前,想找个人一起押一手、毒奶一下;
  • 赛中,高光、失误、争议、翻盘,每十秒钟都可能让人上头;
  • 赛后,想把今晚的情绪发出去,但又懒得自己写复盘、做海报。

所以我们把产品价值收敛成一句话:

它不是赛事数据库,也不是冷冰冰的智能助手,而是那个 2am 也在线、永远站在你这边的电竞搭子。

这个定位一旦定下来,后面所有设计就很顺了。

02. 产品拆解:赛前期待,赛中共振,赛后表达

我们没有把它做成一个单页聊天框,而是拆成完整观赛链路。

第一段是赛前

用户先做一个轻量 onboarding:你看什么赛事,主队是谁,喜欢哪个选手,自己是毒奶型、理性复盘型,还是纯情绪上头型。这个步骤不是为了“填表”,而是给后面的搭子人格喂上下文。

同样是一条提醒:

TES vs JDG 即将开始。

和:

30 分钟后开团,速效救心丸已备好。

信息量差不多,但关系感完全不同。前者是工具,后者才像朋友。

第二段是赛中

这是整个 demo 的核心。用户可以打字,也可以像微信一样按住说话。我们做了一个脚本化赛事时间线,让比赛过程稳定推进:比分变化、关键团战、高光事件、情绪峰值,都能按节奏出现。

用户发一句“气死我了,这波凭什么接啊”,搭子不会回你“请保持理性”。它会根据当前比分、比赛时间、刚发生的事件和用户情绪,生成同频回复。

这里我很喜欢代码里一个小设计:情绪不是只交给 LLM 猜,而是先在本地做一层粗粒度识别。

比如:

  • “气死”“拉跨”“服了” → anger
  • “封神”“起飞了”“YYDS” → ecstasy
  • “寄了”“破防”“心态崩了” → devastated
  • “紧张”“怕输”“心跳” → tension

识别完以后再把情绪标签和强度塞进 system prompt,让搭子别错位。

用户在骂的时候,不要突然端水;用户在嗨的时候,不要像客服一样冷静;用户破防的时候,也别假装世界和平。

这其实是陪伴型产品里非常关键的一点:不是回答正确,而是情绪位置正确。

第三段是赛后

比赛结束后,系统把赛中留下的情绪日志、flag、金句、关键事件汇总起来,生成两类东西:

  • 情绪曲线和赛后回顾;
  • 可分享的文案和纪念海报。

我们给海报做了三个风格:荣耀叙事、吐槽梗图、复盘理性。用户可以选择选手、游戏角色,再补一句自己想说的话,然后通过图像生成模型出图。

这个设计的重点不是“AI 替你写”,而是“AI 放大你”。

如果生成内容里没有用户自己赛中说过的话,没有那场比赛真实发生过的情绪峰谷,那它就只是 AI 作文。看起来很完整,但用户没有发出去的欲望。

所以赛后内容必须长得像“这是我的夜晚”,而不是“这是模型的作业”。

03. 工程取舍:10小时窗口里,先让体验跑起来

这次黑客松最有意思的不是技术有多复杂,而是取舍非常清楚。

我们没有上真实数据库,没有接真实赛事 API,也没有做 WebSocket 实时通信。整个技术方案可以总结成一句话:

客户端承担 90% 的体验逻辑,服务端只做必须的 AI 代理。

技术栈是:

  • Vite + TanStack Start + React 19
  • TanStack Router 做文件系统路由
  • Zustand + persist 把用户画像、对话记录、flag、情绪日志落到 localStorage
  • Framer Motion 做页面过渡和交互动画
  • Tailwind CSS v4 + Radix UI 搭 UI
  • TokenDance 网关调用大模型和图片生成
  • StepFun stepaudio-2.5-asr 做语音识别

为什么这么做?

因为黑客松只有 10 小时。

评委看不到数据库建得多优雅,也不会因为你接了一个极其真实但不稳定的赛事 API 就多给两分。他们能看到的是:流程顺不顺,反应快不快,情绪有没有被调起来,最后一页能不能把故事闭环。

所以我们用 mock timeline 保证比赛稳定演出,用 localStorage 代替数据库,用服务端函数隔离 API Key,用脚本化事件喂给 LLM 上下文。

这不是偷懒,是 demo 阶段合理的剪枝。

很多项目死在“我想把它做完整”。但黑客松更像舞台剧,你必须先保证观众看见主线:

他孤独地打开比赛,有搭子陪他一起上头,最后带着一张属于自己的图文离开。

这条线跑通了,项目就站住了。

04. Prompt 不是玄学,是产品策略的落地

这个项目还有一个我觉得挺值得写的点:提示词不是散落在代码里的魔法咒语,而是被集中管理成了产品资产。

我们把 prompt 分成几类:

  • 搭子人设:它是谁,怎么说话,和用户是什么关系;
  • 粉丝镜像:不同用户类型应该怎样被回应;
  • 海报 prompt:荣耀、吐槽、复盘三种视觉风格;
  • 赛后文案 prompt:朋友圈和官方社媒两种输出场景。

甚至还做了一个隐藏的 /admin 提示词管理页。

你可以在浏览器里直接改 prompt,填示例变量,试运行真实模型输出。改动会落在 localStorage,不会污染代码仓库。这个功能在黑客松里很实用,因为现场调 prompt 是高频动作,不能每改一次都重新发版。

对我来说,这其实是 AI 产品工程化的一个小缩影:

Prompt 不应该只是写死在代码里的字符串,它应该像配置、像策略、像可迭代的产品文案。

尤其是这种强风格产品,模型能力只是一半,另一半是你有没有把角色、场景、情绪边界设计清楚。

05. 最满意的设计:反应先于语言

陪伴类产品有一个很容易被忽略的问题:如果所有反应都等 LLM 返回,体验会慢半拍。

比赛高光发生的时候,人不是先组织语言的,人是先“啊!”一下。

所以我们把视觉和音频反馈做成了旁路系统。情绪事件从 Zustand 触发后,可以直接调用 EffectOverlay、音效、动画,不必等模型完整生成一句话。

也就是说,用户喊“卧槽稳了”的时候,页面可以先闪、先震、先给情绪反馈,然后搭子的文字再补上来。

这件事在工程上不大,但在体验上很关键。

因为它让 AI 从“慢吞吞回答问题的人”,更接近“坐你旁边一起看比赛的人”。

06. 遗憾和下一步:真正的陪伴不该需要你按按钮

当然,它现在还只是一个黑客松 demo。

它的很多地方都是为了 10 小时窗口服务的:

  • 赛事数据是脚本化 mock,不是真实时;
  • 记忆只存在本地 localStorage,没有账户和云端档案;
  • 语音交互还是 turn-based,需要用户按住说话;
  • 多人共看、房间级上下文、长期记忆都还没做;
  • 赛后海报和文案已经能跑,但距离真正可商用的内容生产链路还有距离。

如果继续往下做,我觉得方向有两个。

第一,把单人陪伴做沉浸。

理想状态不是用户点按钮问 AI,而是 WebSocket + VAD 挂在后台。用户说话,搭子听见;比赛进入高压时刻,搭子主动开口;用户沉默时,它也懂得闭嘴。

第二,把情绪日志做成用户资产。

每场比赛都沉淀结构化记录:

{
  "emotion""ecstasy",
  "intensity"5,
  "timestamp""18:42",
  "event""最后一波偷家成功",
  "userQuote""这波偷家真封神",
  "isPeak"true
}

长期看,这不只是复盘素材,而是一个人的电竞情绪档案。

你会记得哪天凌晨主队翻盘,哪场比赛你嘴硬立了 flag,哪一刻你真的破防了。产品留住的不是数据,是你曾经上头过的证据。

07. 写在最后:小项目也要有完整闭环

这次黑客松最后拿到了评委的一致好评,我自己也挺开心。

不是因为它已经多完美,而是因为它在很短时间里完成了一个清晰闭环:赛前点燃期待,赛中接住情绪,赛后帮你表达。

做 AI 产品以后,我越来越觉得,很多项目不是缺模型,而是缺一个足够尖锐的场景。

“陪伴”太大,“电竞搭子”就小很多。

“生成内容”太泛,“把我今晚看比赛的破防和狂喜变成一张能发出去的图”就具体很多。

具体,才有温度。

毒奶观察室现在还只是一个 demo,但它提醒了我一件事:AI 不一定总要去替代人。很多时候,它更像一个情绪放大器,把那些原本没人接住的瞬间,轻轻接住,再递还给你。

凌晨两点,有人懂你为什么骂,也有人懂你为什么笑。

这事听起来不大,但对一个独自看比赛的人来说,可能刚刚好。

- END -

本文由 mdnice 多平台发布

Logo

AtomGit AI 社区提供模型库、数据集、Agent、Token等资源

更多推荐