买二手车最怕什么?不是价格谈不下来,是白跑一趟。保加利亚的二手车买家有个共同体验:在 mobile.bg 和 cars.bg 上同时开着十几个标签页,一半写着"全新进口""真实里程""无瑕疵",同一辆车在两个网站上都挂着。然后你花掉一个周六,开车去普罗夫迪夫,到了才发现发动机型号不对、座椅被狗啃过、价格比谁报得都高。

开发者做了个工具叫 RevCheck,思路很直接:把两条车源链接粘进去,大约 30 秒后拿到一份并排对比报告,以及一句结论——哪台值得去看。

打开网易新闻 查看精彩图片

它到底检查了什么

照片这一关交给 Gemma 4 视觉模型。颜色、凹陷、划痕、钣金件是否对得上、能看见的配置(比如 M Sport 包围、全景天窗)逐张过一遍。卖家在文字里列了、但照片对不上的加装项,也会被标出来。

价格这一关分两步。先找可比车源:同车型、同车身形式、同燃料类型和发动机功率、年份上下浮动一年,两个网站上的在售车都算进来,同一辆车在两个站都挂的只计一次。然后给出市场位置——比如"比 44 台同类车源中的 91% 都贵"。再由 TabPFN 在请求过程中基于这批可比车源训练,给出合理价格区间,例如"€4,718 – €8,665,这台比预期价高出 €2,276"。

发动机的坑,提前告诉你

DeepSeek V4 会根据年份、功率和排量推断出可能的发动机代号,比如 N47D20C、N52 或 N53,然后列出看车时该查什么:冷启动时的正时链条异响、涡流阀、ZF 变速箱、高压油泵。

还有一批不靠 AI 的硬规则:VIN 缺失、每年公里数异常偏低或偏高、照片数量太少、美版或加版进口(这种要自己去查 VIN)。

最后是结论:先去看哪台、为什么、每台各查什么、上车前问卖家什么。报告支持英语和保加利亚语,页面顶部有国旗切换,选哪种语言就用哪种语言写。

谁会为这个付钱

作者给出的答案很具体:任何准备花半天时间和一箱油去看车的人。人们本来就愿意付钱给技师和验车师到现场看车,RevCheck 是那一步之前的一步——它先告诉你两台里哪台值得跑一趟。

商业模式上,他的设想是每天留几次免费对比,向车商和小型经销商收一笔不高的月费,因为这些人一周要对比几十台车。

技术上刻意做窄

整个项目没有框架、没有数据库、没有 npm 依赖。一个 GitHub Pages 静态页、一个 DigitalOcean Function、一个很小的 Cloudflare Worker。

有意思的是它怎么读到车源。mobile.bg 和 cars.bg 会拒绝来自 DigitalOcean 的请求——要么是 Cloudflare 验证页,要么直接 403。但从 Cloudflare 自己的网络发出去的请求,它们会正常响应。所以读取页面这件事交给了一个叫 revcheck-reader 的 Cloudflare Worker。

这个 Worker 的做法挺克制:User-Agent 老老实实写明自己是 RevCheck/0.1 并附上 GitHub 链接,加上 Cloudflare 给每个 Worker 请求自动带的 CF-Worker 头。两个网站任何一方加一条规则就能封掉它,封了就停。它也不是公开代理,需要只有那个 DigitalOcean Function 才持有的共享密钥,而且只抓取 mobile.bg 的车源页面。

安全边界上,作者把"吓人的判断"全部放在代码里,而不是交给模型。里程表异常、VIN 检查、每年公里数、美版进口,这些都是规则。模型只能建议"去看车时查一下什么"。

浏览器传来的数据被当作不可信输入。结论这一步会从页面拿回每台车的结果,所有字段在进入模型之前,都要按一份已知清单重建并限制长度。照片 URL 必须指向这两个网站自己的图片服务器,因为 Gemma 要去下载它们。

每个慢步骤都有超时。如果"已知问题"查询卡住了,你拿到的是缺这一项的车,而不是什么都没有。

项目带了 26 个测试,全部用 node:test 写成,包括真实世界里那些难看的边界情况。