Vibe Coding实战:做玩具容易,做产品难

春节期间我vibe coding了一周,做了两个网站——AI资讯速览和AI论文简报。

一个从20多个英文一手信息源筛选AI行业新闻,一个从arXiv每天近300篇论文里选出最值得关注的几篇。

关注本公众号的朋友应该已经在看了,新来的朋友可以直接访问网站(ai-digest.liziran.com / ai-brief.liziran.com),也可以订阅newsletter或RSS。公众号因为要扫码才能推送,更新会比其他方式略晚。

这两个站发布之后,很多人问我是怎么做的。今天聊聊vibe coding。

01 对vibe coding的基本判断

以前发布一个产品,其实很少有人会问产品是怎么做的。但vibe coding做的东西,大家就会问。

固然是因为vibe coding降低了技术门槛,很多人有求知欲。但也能感受到一种潜台词——vibe coding嘛,我上我也行。

坦白说,大家期待的可能是一个神奇的prompt,一个之前不知道的AI使用技巧,或者什么skills文件。

我一个skills都没用。

但我想先分享一个关于vibe coding的基本判断:

如果给难度打分——做个看起来唬人炫酷的东西,难度是1;做个自用工具,真正实用好用,难度是10;能发布给大家用,大家觉得还不错,稳定不出问题,难度是1000

我看了不少vibe coding的作品,不挫的很少,大多数称不上产品,只是玩具。

02 技术选型:大道至简

先说背景。这是我的个人项目,不是主力项目,也不是赚钱的项目,我不可能一直投入大量精力。我需要它自动化运行,足够干净,足够简单,容易维护。

它是一个纯粹的信息站,不需要复杂的商业逻辑,不需要动态广告,也不需要推荐算法。所以我选了一个很冷门甚至有些原始的技术栈——Python脚本加Jinja2模板生成静态HTML,部署到Cloudflare Workers。

整个项目的Python依赖只有6个包。现在做个网站经常就几百个包,6个包是非常少见的。我相信依赖越少,项目就越干净,能稳定长久地运行。

以前我招程序员,会考虑什么技术流行——比如React现在流行,那前端就都用React。甚至这样做多了,大家会觉得不用前端框架做网站就不专业。

但AI编程带来一个非常大的变化:AI什么都会写,所以你可以真正从业务需求出发来选技术栈,而不是从「我掌握什么语言什么框架」出发。

因为这套东西很原始,反而有点「反向炫技」。用Next.js的话,路由、构建、图片优化、SEO注入,框架都帮你写好了。现在字体、图片、页面生成、SEO都要自己搞。

这要求我要懂。但首先我懂,其次AI也很懂,它也不在乎工作量大一点。

另外我特别考虑了可维护性。很多人抱怨AI写大项目搞成屎山代码,最后根本维护不了。

所以我的架构里,绝大多数中间输出都是.md格式,每篇文章也是.md文件,最后build的时候把.md变成.html。每一步的输入输出都是人类可以直接阅读的。

可以看到,我不是像很多AI技巧教程里那样只给AI提需求。从项目选型开始,我就把自己的思路贯彻在里面,这样才能保证项目始终可控。

03 前端:AI味是怎么来的

相信大家都见过很多vibe coding的界面——紫色的渐变按钮,圆角卡片,一看就是AI设计出来的。Claude原生的设计审美其实还行,但大家都用默认设计,AI味就很足了。

我没有画设计图,也没有参考图,就是通过自然语言描述想要的风格、元素、样式,让Claude出demo,然后精细调整。这里调一个padding,那里调一个链接样式,调一个对齐,调一个字号。

举个细节:网站中英文的字体逻辑是相反的——中文是衬线体标题、无衬线体正文,英文是无衬线体标题、衬线体正文。为了字体显示效果还做了字体子集化。

现在网站的设计和整体呈现,包括内容,我给自己打70分,还有很多可以调整的。但这些工作出自我的思路,而不是AI的原生设计。

前端其实是整个项目里最简单的部分。技术选型靠的是对技术的理解,前端页面靠的是对设计的理解。这跟AI使用技巧没什么关系。

04 管线:产品和玩具的真正差距

这两个网站一个做论文,一个做新闻,管线的设计有区别,但比较共通的部分是:抓取、打分筛选、撰写、构建、部署。每个大模块下面又有很多子环节。

拿撰写来举例。撰写分为编辑、写手、审核几个不同的AI角色。编辑读取所有评分后的条目,做编辑决策——选几个故事角度,为每个故事指定核心素材,写好编辑brief。写手拿到brief后并行工作,各写一篇。最后审稿人检查全文质量。

关键是关注点分离,编辑prompt专注选题判断,写手prompt专注文字表达,各自可以独立优化。

前面说做一个demo很简单,做一个产品很难。为什么?几个例子。

去重 跨天跨源,松紧难拿捏

让AI做一个抓新闻的demo,可能几个prompt就能做出来。但到第二天、第三天就会出问题。同一条新闻,今天A网站报道了,明天B网站报道了,你的网站可能连续两天头条一样。

而且去重不能去太狠,否则越来越没东西能写。今天报道过的新闻明天可能有了新进展,那当然还要报道。跨天去重、跨源去重,里面的判断逻辑很多。

抓取时机 资讯T+0,论文T+3

不同数据源有不同的抓取方式和时机。某些带投票的网站,抓太早投票数不够,抓太晚投票过期了。新闻主要靠「共识」——几个媒体同时报道一件事,那这件事就是重要的。

但论文怎么办?论文筛选很难,AI筛不好。所以我等几天,看看大家的投票和反馈。资讯是T+0,论文是T+3。慢三天对论文来说无所谓,但这三天可以积累大量人类反馈,这比AI判断论文质量要靠谱得多。

Prompt工程 连续多天不能重复

生成一天的新闻没问题,但连续生成多天就会发现,AI的风格很容易连续几天都很接近,读者会审美疲劳。这里面调了几百行的prompt来声明写作规范。

审核 具体反馈优于抽象指令

我的一个核心思路是:具体的反馈优于抽象的指令。比如篇幅太长,审核不能给「字数太长了,重写」,而是用Python计算实际字数,明确告诉AI你上次写了多少字、这次必须控制在多少字以内,甚至每个段落要删减几句话。

而且作为一个追求全自动的产品,如果审核不过打回重写,重写还是不过怎么办?无限重写?还是质量不行也上线?所以审核的prompt经过了深度优化,确保打回重写能给出足够具体的反馈,让重写大概率能通过。

容错设计 优雅降级,不卡关键流程

超时可控、失败可重试;区分关键步骤失败和软失败——生图失败了不应该卡住发布;审核觉得质量不行应该对应模块重写而不是整篇推倒重来;要有可读日志,出了问题知道出在哪里;文件锁防并发。

还有一个细节:模型输出JSON经常会出错。我的做法是尽量不用JSON,中间步骤用大量.md而不是JSON。同时写了一个容错性超强的字符级JSON解析器。防御性解析,比反复优化prompt去追求百分之百合法JSON输出要实际得多。

社群里有人说希望我开源,换自己的数据源就能有自己的今日头条了。但哪有这么简单。不同抓取方式、不同去重方式、不同业务逻辑、不同的数据筛选评价方式、不同的写作方式,每一个都要针对具体业务来设计。

05 一个有意思的发现

如果原始资料是英文,AI根据这些资料写中文写得好,还是写英文写得好?

直觉上AI英文语料更多,应该英文更好。但实际上反而是中文容易写好。

AI写中文的时候因为涉及语言转换,必须先理解内容再重新组织,反而写得更好。而写英文就容易偷懒,直接复述原文的表达,更容易陷入套路化写作。

06 面向未来的编程

最后说一个我一直在琢磨的事。

AI进步飞快。前年我做产品的时候会用很多结构化的prompt,后来模型能力强了,这些结构化的prompt反而限制了AI的能力。如果prompt写得太死,AI更强了,你的产品也不会更强。

有没有可能做一个产品,将来AI越强,产品能自动变得越强?

这是我在追求的东西。既要留给AI发挥的空间,又要逻辑严谨。

比如我的写作prompt,有一些建议的风格,但没有强迫AI必须选择,而是说如果你觉得有更好的表达方式也可以使用,但要注意不要和之前几篇的表达方式重复。

这样给了AI发挥空间,将来模型进步了,或许就能写出更好的东西。同时审核的AI把这个逻辑兜住——审核有一套固定的标准,如果觉得文章写得不好、风格重复,它有权打回重写。

这样将来AI进步,产品也会自然跟着进步。

这只是一个小例子,我其实做了大量这样的设计。一个视频的时间并不够我讲清楚整个管线,部署的部分也没时间展开,但希望给大家提供了一些思路。

Vibe coding降低了技术门槛,但并没有缩小高手和普通人的差距,甚至是放大了。与其钻研AI的奇技淫巧,更重要的还是对业务的理解、对产品的理解、对技术的理解。

这两个站我给自己打70分,还有很多可以迭代的地方。

大家用起来,有什么建议随时跟我说。