先说下背景。
我有一个工具站 xlutools,前后攒了几十个小工具,打算自己做一个 code-to-image 的小功能。
这篇就聊聊我怎么用 Seed-2.1-pro 把这个小功能做出来,又用它把整个项目体检了一遍。
先介绍一下这次用的模型。
Seed 是字节跳动火山方舟这边的大模型。我这次用的是 Seed-2.1-pro。
有两个重点:
一个是多模态视觉理解,简单说就是它能"看图",你把页面截图丢给它,它能读图、定位问题;
另一个是 Agent 长程执行,能跟着一个长任务跑很多轮,不会跑两步就忘了前面要干啥。
我是通过 TRAE(字节那个 AI IDE)用的它。
01 先做小功能:code-to-image
我跟它说的需求很具体:做一个代码转图片的工具,纯前端、在浏览器里跑,不把代码传到服务器。要支持语法高亮、几套编辑器主题、渐变背景、行号,字号和内边距能调,最好能直接下载 PNG 或者复制到剪贴板,手机上也能用。
它给的方案很克制。没有硬塞框架,就是前端渲染加本地 canvas 生成 PNG。我盯着确认了几个点:
- 渲染全在浏览器本地完成,代码不上传——这条我坚持要,隐私的事不能含糊
- 主题给了午夜、纸面、抹茶、糖果几套,够我用
- 字号、内边距、要不要窗口栏和行号都能调
做出来的效果我挺满意。左边贴代码,右侧实时出图,直接下载 PNG 或者复制到剪贴板。手机上也能用,按钮触控区放大了。
这里说一个体验:它没给我搞一堆"高级抽象",就是最小可用。这点我很受用,做工具站最怕越改越重。
02 让它体检:36 项问题清单
小功能做完了,我顺口提了一句:你帮我看看现在这个项目还有啥问题吧。
这一看就看出事来了。它先扫了一遍仓库,给我列了一份全站体检报告,36 项问题:8 个高危(P0)、11 个中等(P1)、10 个轻(P2)、7 个建议(P3)。
我按类别捋一下印象深的:
假功能类。 有一套"看起来能用"的登录、注册、联系页,其实背后没有真实后端。用户点进去填了表单,提交到一个不存在的接口,纯属死路。联系页那个表单尤其坑,长得跟真的一样。
安全类。 Markdown 渲染没过滤 HTML,有 XSS 风险;密码生成用的是弱随机,不够安全;二维码工具每次渲染都去调一个外部接口——隐私和可用性都悬,外部那个服务一挂你就出不了码。
路由和部署类(最阴的)。 public 目录下的 robots.txt、sitemap.xml 会盖掉 app 路由。我之前改了代码线上死活不生效,根因就在这。还有 44 个工具页被强制动态渲染,本来可以静态化却没做,白白多吃一份服务器开销。
SEO 和脏数据类。 sitemap 里混了一堆过期的 URL;有些 404 页面明明该返回 404,却返回了 200(软 404),骗爬虫也骗自己;hreflang 没配对,中文页和英文页输出的是错的。
体验类。 复制按钮在手机上点了没反应;有些主题对比度不够,代码看不清。
03 我是怎么跟它协作的
说一下我俩是怎么配合的,这部分我觉得比结果本身更值得记。
第一,先把目标和非目标对齐。我明确跟它说:只做这两个事(小功能 + 体检修复),不要擅自做无关重构,不引入新依赖。模型一上来容易"顺杆爬",你不框住,它就给你大改一通。
第二,让它先出一张"风险地图"。做法是先把仓库按安全 / SEO / 体验 / 工程卫生四个象限扫一遍,给我一份清单(就是上面那 36 项)。先有全局视图,再决定先打哪。
第三,批次化推进,P0 先打、P1 次之、P2 最后。每一批只做一组相互依赖的改动,改完立刻 build、跑断言,验收过了再进下一批。绝不"一把梭改完再测"——那样回头不知道哪一步埋了雷。
第四,给它三条硬约束:不扩大范围、不输出也不提交任何 secret、每一批都要有可观察的验收证据。这三条是我踩过坑才定下来的,后面真救了我。
04 几个真实的坑
体检里几个印象深的"坑 → 证据 → 修复 → 再验证",我记一下,都是实打实发生过的。
坑一:静态文件遮蔽路由。
现象是我之前改了 robots / sitemap 的代码,线上死活不生效。根因在 public/robots.txt、public/sitemap.xml 会优先于 app 路由,我改的是 app 里的,被 public 下的影子文件盖掉了。修复就是删掉 public 那俩影子文件,启用 app 级的。验证很简单:直接 curl /robots.txt、curl /sitemap.xml 看内容对不对。
坑二:未知 slug 返回软 404。
有些不存在的工具地址,本该 404,却返回 200 还带矛盾的 meta——等于骗爬虫也骗自己。修复后,未知 slug 一律真 404,且只出现一条 noindex。验证:curl -I 看状态码 + grep 页面 meta。
坑三:首屏水合跳样。
首屏先出骨架,随后瞬间换成 Header / Footer,肉眼能看到"闪一下换布局"。根因是我把一个本可 SSR 的组件包进了"仅客户端渲染"的壳,导致 SSR / CSR 不一致。
去掉那层不必要的客户端兜底,同一套结构首屏就直接渲染,闪动没了。验证就是打开页面盯着看有没有再抖。
这几个坑,它都不是只盯着代码猜的——有几处它让我把页面截图丢进去,靠多模态读图去确认那个 404 到底返回了什么、lang 对不对。光读代码真不够。
05 五批修完,还带验收
我没让它一把梭,而是按批次来:先清假功能,再止血安全,再收 SEO,最后打磨体验。
第一批,清假功能。它把登录、注册、联系三套页面连同它们的路由和孤儿组件一起删了,前后大约 30 个死文件。该返回 410 的返回 410,该重定向的重定向,不留半截。
第二批,止血安全。Markdown 渲染加了 HTML 转义,密码生成换成 crypto 的强随机,二维码从调外部接口改成用本地库生成。
第三批,路由和 SEO。修了 public 文件遮蔽路由那个坑,44 个工具页改成静态生成(22 个 slug × 2 种语言),sitemap 瘦身,hreflang 重新配对。
第四批,打磨体验。主题对比度调了,手机触控区放大,复制按钮修好。
有一处它还让我把某个页面的截图丢进去,靠多模态读图去确认那个 404 到底返回了什么——不是只盯着代码猜。
最终那次提交:90 个文件变更,1256 行新增、9192 行删除。删的比加的多得多,因为它帮我砍掉了假功能、死文件、孤儿配置。
06 几个我拍板的工程取舍
修的过程中有几个"取舍"是我定的,不是模型替我定的:
- 重定向逻辑集中到配置,不分散在各处。少一个维护点,少一处以后会忘。
- 能静态化的页面尽量静态化。工具页 slug 是可枚举的,直接 SSG,省掉一份服务器开销。
- "看起来能用但其实是半拉子"的入口,直接移除。产品可信度优先,留着假按钮只会让人觉得你不靠谱。
- 含真实项目地址的文档,删。安全和合规优先,这种东西留在仓库历史里迟早出事。
07 Seed 优点
说说体验里好的部分。
第一,批次化,每批有验收。它不会"改完就算数",前面那几个 curl 断言就是例子。对做工具站的人来说,能验收比"它说改好了"重要十倍。
第二,能定位根因,不是打补丁。public 文件遮蔽路由那个坑,肉眼很难第一时间想到,它直接点出来了,而不是在表面修修补补。
第三,主动提醒安全和数据边界。有一份文档里含真实的 Supabase 项目地址,它识别出来建议删掉,避免把敏感信息留在仓库历史里。这点我挺意外,一般模型只顾把功能做出来,不会管你仓库里有没有敏感信息。
第四,多模态真的用上了。它让我丢截图,它读图去定位页面问题。对"看页面长啥样、报什么错"这类活,光读代码是不够的,能看图就顺多了。
第五,代码理解讲究"改动最小化"。它先找现有实现和约定,再局部修,不会为了一个 fix 擅自给你引入一套平行架构;跨文件的一致性(i18n、SEO metadata)也记得住,不会"修一处坏三处"。
08 一点体感,和接下来想用它的地方
这次最大的感受:模型在这活儿里写代码快只是附带的,真正值钱的是它能把"定位问题、最小改动、安全提醒、验收证据"串成一条线。
但主动权得在自己手上。它帮我做减法很爽,可哪些能砍、砍完业务还成立不成立,这个判断还是我的。
工具站这种东西,看起来能用和真的能用,中间差的就是这些脏活。这次算是把它从"看起来能用"拉到了"真的能用"。
往后我会更敢把"体检、评审"这类活交给它。
除了修代码,我觉得它还有几个场景我能接着用:
- 我导出一份 GSC 数据丢给它,让它筛"高曝光低 CTR"的页面排优先级——比我自己一行行看快;
- 把需求说明、验收清单、开发日志整理成可分享的文档结构;
- 重复、规则清晰的验证活儿(比如批量开页面检查 title / lang / 结构化数据、批量截图做修复前后对比),交给它的 Computer Use 能力去跑,我定义好检查项就行。
上线前最后一脚——真实冒烟、点那个发布按钮——还是我自己来。