从三月底立项到四月初上线,我用两周时间做了一款AI驱动的对战式刷题小程序,上线一周靠自然裂变涨了700多个用户,没有投一分钱推广。这篇文章把这套玩法的产品定位、技术方案、裂变设计和上线后的数据复盘一次性讲清楚,适合正在做小程序、教育产品,或者想用AI能力做增长模型的开发者参考。
先说结果:上线第7天,用户总量743,次日留存38%,人均对战局数5.2局,单用户分享率21%。这个数据放在刷题类工具里不算炸裂,但考虑到是零预算冷启动,且完全靠用户主动分享带来的新增,我觉得背后的机制比数字本身更有参考价值。
1. 为什么我从“刷题工具”转向“对战式刷题”:场景洞察与产品定位
在动手写代码之前,我先花了两天调研市面上的刷题产品。传统刷题工具的功能结构几乎一样:题库列表、章节练习、模拟考试、错题本。它们的共同问题是——用户打开一次就再也不想打开第二次。原因很简单:刷题是一个高认知负荷、低即时反馈的行为,人脑天然抗拒这种枯燥的重复。用户下载时以为自己需要自律,实际上产品需要替用户完成动机维持。
对战式刷题本质上是在刷题这个行为外面套了一层游戏化壳,核心解决三个问题:
- 即时反馈:每道题作答后立刻知道对错、排名变化、对方反应,不再等一套卷子做完才看到结果。
- 竞争动机:匹配一个活人或者拟人机器人,胜负欲会驱动用户把“做题”变成“比赛”。
- 损失厌恶:对战中途退出的心理成本远高于关闭一个普通练习页面,用户的单次时长天然拉长。
我锁定的目标用户是备考人群:准备考公、考研、考资格证的,以及高中生物理化学这类需要大量刷题记忆的知识点。这类用户的共同特征是:备考周期长、每天有碎片时间、对“进度感”极度敏感。传统刷题工具只能告诉他们“你做了100题”,对战式刷题可以告诉他们“你打败了80%的同级对手”,后者显然更能让人坚持。
在产品形态上,我刻意做了几个减法:
- 不做账号密码注册,微信手机号一键登录。
- 不做复杂的主页导航,打开就是“开始对战”按钮。
- 不做长题组,一局5题,全程控制在90秒以内。
- 不做付费解锁,前期所有功能免费,靠分享换次数。
核心逻辑是:让用户从点击到进入对战的路径尽可能短。每多一步操作,都会流失一批没有耐心的新用户。后来数据也验证了这一点,第一版因为有多余的引导页,新用户对战转化率只有43%,砍掉引导页后提升到了71%。
2. 从零搭建的技术方案:AI出题、实时匹配与数据存储
整个项目的技术选型我考虑了很久。单人开发,预算有限,还要在两周内上线,所以原则是:能用云服务解决的绝不自己搭服务器,能缓存的绝不多调AI接口,能走消息队列的绝不做复杂长连接。
2.1 技术栈选型与核心架构
最终的技术栈如下:
| 模块 | 选型 | 原因 |
|---|---|---|
| 前端 | 微信小程序原生框架 | 对战类小程序对渲染性能要求不高,原生框架足够,且发布审核路径最短 |
| 后端 | Node.js + 某云开发环境 | 无需自己维护服务器,云函数按量付费,冷启动可以接受 |
| 实时通信 | WebSocket长连接服务 | 对战状态推送、双方作答进度同步 |
| AI出题 | 大模型API | 支持自定义Prompt,适合批量生成单选题和多选题 |
| 数据库 | 云数据库 | 用户表、对战记录表、AI题缓存表,初期量级完全够用 |
| 对象存储 | 云存储 | 存战报卡片图片、用户头像 |
为什么不用传统的关系型数据库?因为初期数据量小,云开发自带的文档型数据库读写简单,不需要写建表语句,前端同学也能直接看懂数据逻辑。我预估即使做到一万用户,这个数据库也扛得住。
2.2 AI出题模块:不只是调接口,关键是可控性
AI出题是整个项目的技术核心。我需要AI能做三件事:根据知识点生成题目、生成干扰项、判断用户答案对错。
一开始我直接用大模型的Completion接口生成题目,很快发现两个问题:一是题目质量不稳定,偶尔出现题干和答案不匹配的情况;二是接口成本太高,每局对战都是实时出题的话,一个月光API费用就能吃掉我全部预算。
我的解决方案是三级缓存策略:
- 第一级:热门知识点的高频题,提前用AI批量生成后存入数据库,用户请求时直接读取,不调接口。
- 第二级:用户自定义知识点,采用“热度低于阈值时实时调用AI生成,生成后缓存24小时”的策略。
- 第三级:极端冷门知识点,实时调用AI并同时触发异步校验,校验不通过就直接丢弃该题。
Prompt设计也踩了不少坑。最开始我的Prompt是“生成一道关于勾股定理的单选题”,结果AI经常输出题干里包含太多无效信息,或者选项长度差距过大,用户一眼就能猜出正确答案。
反复调了几版后,我总结了一个相对稳定的结构:
你是一名资深命题老师。请生成一道关于【知识点】的单选题。 要求: 1. 题干不超过50个字,场景化,尽量贴近实际生活。 2. 提供4个选项,每个选项长度接近,避免出现明显错误答案。 3. 正确答案随机分布在A/B/C/D中。 4. 输出格式为JSON:{"question": "...", "options": {"A": "...", "B": "...", "C": "...", "D": "..."}, "answer": "B", "explanation": "..."} 5. 必须在explanation中给出完整的解题思路。JSON结构化输出这一条非常重要,它让我可以直接解析响应并入库,不需要再做字符串清洗。你能想象没有结构化输出时,我要从一堆自然语言里抠出题目和答案有多痛苦吗?
判题逻辑反而简单。选择题的判题不需要AI介入,用户提交选项,后端直接比对答案字段就行。真正需要AI的是主观题场景,但第一版我全部做成选择题,就是为了降低技术风险和成本。
2.3 实时对战匹配:从排队机制到半拟真机器人
对战匹配是最容易出问题的环节。两个用户同时点击“开始对战”,后端如何在3秒内为他们建立房间?我的实现逻辑是先入先出队列加超时兜底。
// 伪代码:匹配队列核心逻辑 const queue = []; const MATCH_TIMEOUT = 8000; // 8秒内没匹配到真人,填充机器人 async function joinMatchQueue(userId) { // 如果队列里有人,优先匹配 if (queue.length > 0) { const opponent = queue.shift(); return createRoom(userId, opponent.userId); } // 否则入队并等待 queue.push(userId); setTimeout(() => { const index = queue.indexOf(userId); if (index !== -1) { queue.splice(index, 1); return createRoom(userId, null); // null代表机器人 } }, MATCH_TIMEOUT); }这里有个非常关键的细节:机器人不能太聪明,也不能太蠢。第一版我让机器人以80%的正确率作答,结果几乎所有真人用户都输,用户流失严重。后来改成根据真人的实时正确率动态调整机器人的正确率,保持对决胜率在50%上下,用户就会觉得“差一点就能赢”,从而不断再来一局。
为什么我会想到这个?因为我在测试时发现,当我连续赢3局后就开始无聊了。人需要的是“有赢有输的紧张感”,不是压倒性的胜利。对战游戏的核心魅力永远在于旗鼓相当。
2.4 数据库设计与答题状态同步
数据表一共四张,我花了半天时间设计:
用户表:openid、昵称、头像、当前段位、总胜场、总场次、今日挑战次数、邀请码。
对战记录表:roomId、用户A、用户B、胜利者、双方得分、用时、题目列表快照、创建时间。
题目缓存表:知识点、题目JSON、答案、出题来源(AI还是人工)、缓存过期时间。
分享记录表:谁分享的、分享给了谁、对方是否注册、是否完成了对战。这张表是裂变分析的核心,后面讲数据时你会看到它的价值。
答题状态同步用WebSocket实现。用户在客户端每做完一题,客户端向后端发送answer事件,后端更新房间内的双方进度,再向双方推送opponent_progress事件。这样用户能看到对方比自己快还是慢,这个“进度可视化”是对战中紧张感的来源之一。
// 伪代码:答题进度广播 socket.on('answer', (data) => { const room = rooms[data.roomId]; room.answers[data.userId] = data.answer; room.answeredCount += 1; if (room.answeredCount === 10) { // 双方共10题已答完,进入结算 calculateResult(room); return; } // 向房间内两人广播对方进度 io.to(room.roomId).emit('opponent_progress', { opponentAnswered: room.answeredCount, yourAnswered: room.answers[data.userId] ? room.answeredCount : room.answeredCount - 1 }); });WebSocket断线重连也是个坑。真机上用户切后台超过30秒,小程序会被系统挂起,WebSocket断开,如果没做自动重连,就会出现用户回来看到“对战已结束”的空白页。我的处理是:断线后保留房间状态5分钟,用户重连后自动恢复对局快照,超过5分钟则判定对方获胜。
3. 让用户愿意分享的裂变设计:邀请机制、战报卡片与排行榜
技术做完了,产品只能算是“能用”,离“用户愿意分享”还差得远。这700多用户是怎么来的?答案是裂变。而裂变不是玄学,它是一套可以拆解和设计的机制。
3.1 分享的本质:给用户一个分享的借口
用户分享一个东西到朋友圈,核心动机就三种:展示优越感、表达身份认同、帮助朋友获得利益。对战式刷题小程序天然具备第一个动机——我赢了,我比对方厉害。但光有动机不够,用户没有“分享入口”也没用。
我的设计思路是在对战结算页面做文章。对战结束后,用户会看到三样东西:
- 胜负结果大字展示(赢家金色“胜利”标记)。
- 本局胜率变化(例如:“你的胜率从68%提升至70%”)。
- 知识薄弱点标签(例如:“函数单调性掌握欠佳,超过62%的用户”)。
然后是一个醒目的按钮:“生成战报分享战绩”。点击后,后端生成一张带小程序码的战报卡片,用户保存图片或直接调起微信分享。
那张战报卡片我改了三版。第一版是简单的截图,分享出去点击率一般。第二版加入了段位图标和排名百分比,点击率提升了不少。第三版加入了“与好友的成绩差距”,比如“你击败了78%的玩家,好友平均正确率57%”,这个变化让分享转化率从9%提升到了17%。
为什么“好友平均正确率”比“你击败了78%的玩家”更有效?因为前者制造了“比较”,让人产生“我比他强”或者“我不服”的情绪。情绪,是分享行为的直接燃料。
3.2 邀请机制:用利益杠杆撬动关系链
相比战报卡片这种“被动分享”,我更看重“主动邀请”。玩法是:新用户每天只有3次免费对战机会,但每邀请一位好友注册并完成一局对战,双方各获得2次额外机会,上限10次。
这个设计有两个深意:
第一,把“邀请”和“对战”捆绑在一起。好友不能只是注册,必须完成一局对战,邀请者才能拿到次数。这就保证了被邀请来的用户不是“僵尸用户”,而是真实进入产品体验过一轮的人。
第二,新用户得到额外次数,老用户也得到次数,双方都有正向激励。刚开始邀请5个人时,新用户几乎每邀请一个人就能立刻多打两局,这种即时反馈会刺激他持续分享。
实践中我发现一个有意思的现象:通过小程序自带的“分享给好友”按钮,转化率并不高。真正高转化的是“一段精心设计的文案加一个小程序卡片”发到微信群。所以我提前内置了五套分享文案,用户点击分享时随机选择一套,避免每个人分享出去都是一模一样的话,降低“广告感”。
3.3 排行榜:让竞争蔓延到社交关系之外
对战是短期的,排行榜是长期的。我做了两个榜单:日榜和周榜。日榜按当日胜场数排名,周榜按累计积分排名。每日零点结算,周榜冠军会获得一个“本周题霸”的专属头像框,头像框是可以展示在下次对战界面的。
排行榜的最大价值不是奖励本身,而是让用户在非对战时间也能打开小程序。我在上线后观察到,每天晚上11点到12点是日榜冲刺高峰,很多用户差一两场就能挤进前十,宁愿多打几局也要上榜。这个“临近截止时间的紧迫感”也是我设计的:日榜只展示前20名,但会显示“当前第21名与你仅差1胜场”,刺激排名靠后的用户再打一局。
榜上有名和榜上无名之间的差距,往往就几次分享的次数限制问题。用户为了多打几局冲榜,会更积极地邀请好友,这实际上形成了一个“对战→冲榜→分享→获得次数→再对战”的闭环。
3.4 裂变链路的数据追踪
光设计机制不追踪数据,等于盲人摸象。我在每个关键节点都埋了埋点:
| 链路节点 | 埋点事件 | 转化优先级 |
|---|---|---|
| 分享者点击“生成战报” | share_card_click | P0 |
| 分享成功并发送 | share_success | P0 |
| 好友点击小程序卡片 | share_link_click | P1 |
| 好友完成注册 | share_register | P1 |
| 好友完成首局对战 | share_first_match | P1 |
| 好友邀请另一个人 | share_secondary_invite | P2 |
上线一周后的数据是:战报卡片分享率21%,分享后好友点击率34%,点击后注册率62%,注册后完成首局对战率81%。也就是说,每100个对战用户大约会产生7个新注册用户。这个转化效率在社交裂变里算相当不错了。
而让我惊讶的是,真正贡献了45%新增用户的分发渠道,不是朋友圈,而是微信群。原因是:朋友圈的曝光确实大,但刷到的人不一定有刷题需求;而同一个备考群或者同学群里的用户,需求高度匹配。这也给了我一个启发:下次做分享引导时,针对微信群场景单独设计一套引导文案,而不是只盯着朋友圈。
4. 上线一周的真实数据与三个关键教训
数据是最诚实的产品经理。上线一周的复盘,我整理了以下关键数据:
| 指标 | 数值 | 备注 |
|---|---|---|
| 总用户数 | 743 | 全部自然增长,无付费推广 |
| 次日留存率 | 38% | 第二天还打开小程序的用户占比 |
| 7日留存率 | 17% | 第七天仍然活跃的用户 |
| 人均对战局数 | 5.2局 | 每个用户一周平均对战次数 |
| 单用户分享率 | 21% | 发起过分享行为的用户占比 |
| 分享带来的新用户占比 | 68% | 通过分享链接注册的用户占比 |
| 平均单局时长 | 73秒 | 5道题的实际作答时间 |
这些数字里,最让我意外的是单局时长73秒。我原以为90秒的时长设计足够宽裕,实际上大部分用户在30秒内就完成了前3题,最后两题才是拉长时间的关键。这说明AI出的题目难度分布不够均匀,简单题太多。用户赢了没有成就感,输了会委屈。这直接影响了留存。
于是上线第三天我做了一次紧急调整:提高题目难度中位值,让5道题里至少有2道“稍有挑战”的题。调整后的数据是:单局时长提到了92秒,分享率从21%提升到26%。为什么分享率会提高?因为用户赢得更有成就感了。当用户觉得胜利是因为自己厉害,而不是题目太简单时,他才愿意炫耀。
4.1 教训一:机器人难度系数不是拍脑袋定的,要跟真人胜率挂钩
这个坑我前面提到过,但值得单独展开。第一版机器人的正确率被我设定为80%,结果真人胜率只有28%。用户玩了两局就卸载了,因为他们觉得“每次都输,这游戏不适合我”。
后来我改成动态调整逻辑:机器人不再是一个固定的正确率,而是根据真人前5题的正确率动态计算。具体算法是:
机器人目标正确率 = max(0.45, min(0.85, 真人正确率 - 0.05))也就是说,机器人永远比真人稍弱一点,但差距不大,保证真人胜率在55%左右。这个55%不是拍脑袋得出的,而是我查阅了好几种博弈类的游戏数据,发现55%的胜率最能激发玩家的“再来一局”冲动。胜率太高人会觉得无聊,太低人会挫败,55%刚好制造“差一点就输了”的刺激感。
这个调整上线后,人均对战局数从3.1局提升到了5.2局。效果立竿见影。
4.2 教训二:AI生成的内容必须前置校验,上线后翻车代价太高
上线第二天,一位用户在某备考群里截图吐槽:一道题问“下列哪个选项是正确的”,四个选项全是错的,而系统给出的“正确答案”也是错的。这条吐槽被群友传播,差点成为一次负面危机。
这是我当时设计的一个漏洞:AI出题模块的校验只做了格式校验,也就是检查返回是否是可解析的JSON,没有做语义校验。AI偶尔会产生题干与选项不匹配、选项重复、三个选项明显错误等问题。最可怕的是这类题会随机出现在对战里,一旦有人截图传播,对产品口碑的伤害极大。
我的修复方案是加了两层机制:
第一层:每道AI题目在入库前,交给第二个独立的AI实例做审查,Prompt是“判断这道题是否适合作为选择题,检查题干与选项一致性”。审查不通过直接丢弃。
第二层:用户在对战过程中如果对题目点击“题目有误”按钮,题目会被标记为“待复核”,累计3人标记后自动下架,不再出现在任何对局中。
这两层机制上线后,题目错误投诉率从1.2%降到了0.1%左右。虽然后续偶尔还是有争议题,但至少有用户在使用的题目至少是经过双重检查的。
4.3 教训三:新用户引导必须是“一键直达”,不能有多余的思考
第一版的新用户流程是这样的:点击小程序 → 登录授权 → 阅读玩法介绍 → 选择备考科目 → 选择知识点 → 点击开始对战。一共6步,每一步都会有流失。
我看了一下漏斗数据:从点击进入到真正开始第一局对战的转化率只有43%,这意味着超过一半的新用户进来后根本没有体验核心玩法就走了。48小时后,这些未体验用户里只有2%会再次打开小程序。
砍掉所有多余步骤后,流程变成:点击小程序 → 登录授权 → 自动匹配默认科目和知识点 → 直接进入对战等待页。整个流程从6步缩到2步,第一局对战转化率提升到了71%。
你可能觉得“选择知识点”这一步很重要,但在冷启动阶段,产品还没有积累足够的用户口碑,任何一步多余的操作都是在赶人走。后期用户量起来后,可以再在设置里提供精细化的知识点选择。
其实这不仅是对战类小程序的原则,所有工具型产品都一样:第一屏永远只放一个核心动作,所有选择都放到次级页面。
5. 下一步这样做:内容生态、算法优化与反作弊
一周跑下来,产品的基本盘已经验证了:对战机制能驱动用户留存,分享机制能驱动用户增长。但我也清楚地知道,700+用户只是验证阶段的成果,要让产品持续增长,还有几个关键问题需要解决。
5.1 高质量题目的沉淀:从AI生成到人工精选的内容飞轮
AI生成题目只能解决“从无到有”的问题,不能解决“从有到优”。长期看,用户的段位会越来越高,简单的选择题无法再满足他们的需求。我计划分三步走:
第一步:通过用户的“题目有误”反馈和正确率数据,给每道AI题目打质量分。正确率高于85%或低于30%的题都会被重点审查,因为前者可能太简单没区分度,后者可能存在歧义。
第二步:引入人工命题。去年一起做教育的某位朋友愿意兼职帮我出题,按照每道题一定的报酬收购优质题目,这些题目会打上“人工”标签,在高端对局里优先出现。
第三步:开放UGC。等用户量到5000以上,允许资深用户自己创建题目集并发布到题库广场。对战模式会优先匹配同一知识点下的题目集。这一步做好了,内容生态才能真正转起来。
5.2 匹配算法升级:从随机匹配到段位制
目前的匹配算法是“队列里有人就匹配”,没有考虑段位差异。这个在一周内还能靠小流量运行,但用户量上来以后,青铜段位遇上传奇段位的挫败感会毁掉新人体验。
我的计划是引入ELO评分制,每个新用户初始分1500分,赢一场加20分,输一场扣20分,对手分数越高,赢得到的分数越多。匹配时优先找分差在100以内的对手,如果30秒内匹配不到,逐级放宽范围,直到找到对手或触发机器人兜底。
段位等级则用分数段划分:1200以下为青铜,1200-1399为白银,1400-1599为黄金,1600-1799为钻石,1800以上为大师。每个段位内部再分小级,胜利时显示“即将晋级”的进度条。
段位制的最大价值不是让产品更专业,而是给用户提供一个“长线目标”。刷题很枯燥,但如果你的一局对战分数影响到段位升降,你就有理由去刷题了。
5.3 反作弊:别等出了问题再设计
上线一周里已经出现了刷分行为。具体表现为:有人注册多个小号,用机器人兜底时故意输给主号,帮助主号刷胜率。我一开始没处理,是因为觉得量级小无所谓。后来发现一个小号可以在半小时内刷10场胜场,严重破坏了排行榜的公平性。
初步的反作弊策略是:
- 同一设备注册超过3个账号,后续注册直接拦截。
- 单局答题时间低于3秒钟的,判定为作弊,该对局结果作废。
- 对局中切后台超过2次的,警告一次;超过5次的,该局判负并冻结当日对战资格。
这些策略在技术实现上都不难,难的是在误伤真实用户和拦截作弊者之间找平衡。比如切后台这个指标,真实用户会因为他来电话、回微信而切后台,一刀切容易误伤。所以我加了一个缓冲:只有“切后台且最终获得胜利”的行为才会被重点审查,因为正常对战途中的切后台通常会导致失败。
坦白说,反作弊这部分的方案还比较基础。但如果不在这个阶段打下基础,后面用户规模扩大再想处理,就要面对大量历史数据清洗的麻烦。宁可现在损失一小撮刷分用户,也要保护大多数正常用户的公平体验。
5.4 商业化路径:先从虚拟权益做起
整个项目上线至今是零收入,广告主也暂时没有接洽。我的商业化想法是稳扎稳打:
- 第一阶段:出售“无限次对战卡”,月卡定价9.9元,买断当月的挑战次数限制。这个定价符合学生群体的消费能力。
- 第二阶段:出售限定头像框、称号、战报卡片皮肤。这类虚拟权益没什么成本,但能拉动一部分高粘性用户付费。
- 第三阶段:开放精品题库订阅。这需要内容生态建立起来之后再做,按科目或考期订阅,提供高频考点专项训练。
我比较警惕的是把商业化做重,影响了当前的增长逻辑。这款产品的核心增长引擎是“分享换次数”,如果付费用户跳过分享也能无限玩,分享动力就会迅速衰减。所以比较理想的路径是:付费解锁的是皮肤、称号这类社交炫耀型权益,对战次数本身依然要靠分享换。这样既不影响裂变机制,又能赚到一些不算少的基本收入。
现在回想起来,这次上线的最大收获还不是700多用户这个数字,而是验证了一个判断:AI在教育工具里最大的价值不是替代真人老师,而是降低内容生产的边际成本。对战式刷题里面,AI承担了选题、出题、判题中95%的重复劳动,我才有精力和成本去做游戏化设计和裂变机制。如果题库完全由人工编写,以我的个人精力和预算,根本撑不起一周700用户的增长速度。
最后再分享一个小技巧:设计分享文案时,别用“快来和我一起刷题”这种平淡的话,试试“我刚刚击败了XX%的玩家,你能超过我吗”。把分享变成一个挑战,转化率会明显提升。我实测过,挑战型文案比邀请型文案的点击率高出了40%左右。下次做任何带社交传播的产品,你都可以直接用这个思路。