先说结论:我们把高考志愿 AI 工具「拘灵遣将」暂停了。

这不是一个轻松的决定。过去两天,我们在这个项目上跑了大量 token,也投入了很多精力。它一开始是公益性质,想免费开放一段时间,帮考生和家长少一点信息差,少一点来回翻表的痛苦。

但最后我们还是停了。

很遗憾,也很抱歉。

不是因为这个工具完全不能跑。恰恰相反,它已经跑起来了:页面有了,后端有了,本地库有了,流式回答有了,留言和反馈也接上了。我们甚至做了很多后来回看都不算敷衍的加固。

真正让我们停下来的,是另一个问题:

高考志愿这件事太重了。

如果一个 AI 工具推荐错了一部电影,最多浪费两个小时。推荐错一个软件,最多卸载。可志愿填报不是这样。一个专业组、一个位次、一个备注条件、一个体检限制、一个调剂规则出错,都可能让一个学生滑档、退档,或者走向一个根本不适合自己的选择。

这时候,不能只问“技术上能不能做”。

要问:我们有没有资格让一个家庭把它当成重要参考?

一开始,我们是真想把它做好

这个项目最早的想法很简单:博客里开一个高考志愿栏目,免费给大家试用。

我们不是从一个空白聊天框开始的。底座来自一个已有的高考志愿项目包,里面有志愿咨询的提示词、方法论知识库、本地录取数据和候选学校筛选逻辑。我们做的第一件事,是把它迁移到博客的服务端,让它不只是本地玩具,而是能在网页上被普通用户打开。

第一版的思路是:用户输入省份、选科、分数、位次、专业偏好、城市偏好、家庭资源和目标,后端先查本地录取库,再让 AI 基于候选学校和方法论解释冲、稳、保。

严格说,它不是常见的向量库 RAG。它更像结构化检索增强生成:先查结构化数据库,再把学校、专业、年份、分数、位次这些硬信息交给模型解释。

对高考志愿这种场景,这个方向本身是对的。

因为分数、位次、省份、年份这些东西不能靠语义相似度猜。它们必须先落在结构化数据里。

所以我们最开始的判断是:本地库负责把底牌亮出来,AI 负责把取舍讲成人话。

后来,我们一路在补洞

项目上线之后,问题不是一次冒出来的,是一层一层冒出来的。

先是数据覆盖。

最开始真实能用的省份很少,远没有看起来那么完整。后来我们不断补库、审计、同步页面口径,数据规模从二十多万行一路扩到五十多万行。最后一轮完成态审计里,主库做到 507,122 行,覆盖 2024-2025 年,23 个有数据省市,badRows 0sourceRefs 154

这不是简单把表格丢进去。

我们做过很多具体工作:找各省教育考试院来源,处理 XLS、XLSX、PDF、HTML,做 OCR,拆普通本科、普通专科、高职专科,标记 complete、partial、missing,区分官方原始表和旧包数据。北京旧包里混了提前批、公安司法男女分项、艺术和其他特殊规则,我们替换成北京教育考试院官方 HTML 的普通批数据。河南、山西、天津、云南这类缺口,也写清楚为什么不能硬补。

这期间还修了很多产品问题。

用户说不能接着前面聊,我们就修上下文追问。用户补一句“接受省外大学”,系统不能重头分析,我们就让它沿用上一轮条件。

用户反馈“单条问题太长”,后来发现不是用户的问题,是上一轮 AI 长回答被带回后端,触发了历史消息长度限制。我们把历史消息压缩,只限制最新输入。

模型上游 503,我们加错误日志、熔断和本地库兜底。后面又切到更低成本、更稳的 Mini 模型,避免公开流量一上来就打爆。

手机端体验不好,我们做移动端专项:压缩导航、聊天头、工具按钮和输入区,让它更像一个能连续使用的移动端聊天工具。

担心滥用,我们讨论过邮箱门槛、假邮箱、手机号。最后选择不收手机号,因为手机号太敏感;后来又把邮箱门槛恢复成“首问可用,后续留常用邮箱”,并且拦截测试邮箱和临时邮箱。

用户想反馈,我们加留言窗口,只有留过邮箱的人可以提交。留言里如果出现 11 位手机号,直接拒绝,避免用户把敏感信息发进来。

我们还不断加边界声明。

页面上写,弹窗里写,右侧说明里写,AI 回答结尾也写:它只是参考,不保证完全准确,不能代替考生和家庭做最终填报决定。后来我担心这还不够,又加了强制确认,不勾选“仅供参考、最终家庭拍板、后果自担”,不能发送问题。

再后来,我们甚至把“稳上、必录、包录、放心填、一定能走、肯定不会滑档”这类表达从系统提示里禁掉。

你看,这不是一个“随手套壳上线”的项目。

但这也是问题所在:我们越认真做,越会发现这件事不是普通 AI 工具的难度。

真正改变判断的,是专业人士的提醒

项目跑到后面,我们和做升学规划的专业人士交流了一轮。

他的提醒很直接:高考志愿这种东西,不能只看行数,也不能只看分数大部分对不对。你要看每一条专业、位次、备注、限制条件是不是能支撑真实填报。

他说,缺 10 条、20 条,在这种场景里都可能是重大事故。

这个话很刺耳,但对。

我们后来拿一份浙江 2025 普通类志愿填报数据和自己的库做交叉对比。结果不是那种“大面积全错”的崩盘,但已经足够说明:它不能当成专业填报决策级数据库。

总体数字是这样的:

他的表有 24,247 行,我们库里的浙江 2025 普通类数据有 24,986 行。

按“院校代码 + 专业代码”做主键,两边共同代码是 23,531 个。他表里有、我们库没有的唯一代码是 93 个。

另外,有 22,853 行可以做到同代码、同分数、同位次。这部分交叉验证是通过的。

问题主要集中在两类。

第一类,是边界位次口径差异。

1,394 行不能做到“同代码、同分数、同位次”。这些差异集中在两个值:

  • 490 / 184372:148 行
  • 268 / 290790:1,246 行

我们查到浙江考试院官方原始 XLS 里,这些边界分数的位次为空。我们的库按官方原表保留成 rank=0。而专业人士那边的表,把它们补成了一分一段参考位次。

从“官方原始投档线”角度,我们不算乱填。

但从“志愿填报实战”角度,用户不是来欣赏官方空值的。用户需要判断风险,位次为空会影响 AI 对冲、稳、保的判断。

第二类,是那 93 个外部独有的院校专业代码。

按普通数据工程比例看,93 个在两万多条里不算大。

但高考志愿不是普通数据工程。一个专业漏掉,就可能影响某个学生的保底项、可选项和滑档风险判断。尤其这些项集中在低分边界、未招满或专科段附近,这恰恰是更容易出事的地方。

这时候再说“整体准确率还可以”,意义就不大了。

因为出事的人不会是“整体”。

出事的是某一个学生。

我们之前的数据结构太薄

这次复核还有一个更大的问题:我们原来的主库结构偏薄。

它能存学校、专业、分数、位次、年份、省份这些基础字段,但真正志愿填报不只看这些。

一个专业能不能报,还要看:

  • 选科要求
  • 专业组
  • 招生计划
  • 专业备注
  • 学费
  • 校区
  • 中外合作
  • 体检限制
  • 单科要求
  • 调剂规则
  • 招生章程
  • 是否未招满
  • 是否二段剩余计划
  • 批次和段次是否能直接比较

这些字段如果不完整,AI 就很容易把一个“基础投档线库”讲成“填报建议库”。

这就是最危险的地方。

基础库可以支撑初步分析,但不能直接承接最终决策。

如果只是我自己内部研究,或者做一个“看看历史分数”的演示,它还能继续跑。但一旦免费开放给考生和家长,用户就可能把它当成一个可以依赖的志愿填报工具。

免责声明拦不住这种误用。

尤其当 AI 说话很像那么回事的时候,风险会更大。它越流畅,用户越容易信。

为什么最后选择暂停

一开始,我们还试图把它降成“保守参考模式”。

比如加确认框、禁绝对表达、提示回官方核对、遇到未覆盖省份不编数据、把没有本地库的省份只做方法盘点。

这些都应该做。

但问题是:它们只能降低风险,不能改变工具在用户心里的位置。

只要页面还允许用户提问,只要 AI 还会给具体学校、专业和冲稳保建议,就会有人把它当成“我可以照着填”的答案。

而高考志愿不是可以赌用户理解力的地方。

所以最后我们做了软下线:

  • /gaokao/ 页面改成暂停和复核说明
  • 输入框禁用,不再生成具体志愿建议
  • 后端接口默认返回暂停说明
  • 首页入口同步改成复核维护中
  • 保留留言入口,方便继续收集反馈

后面又把公开说明改得更直接:我们和专业人士交流、复核后,确认当前数据库不够完善、不够严谨。为了避免误导大家,也为了避免耽误大家人生里很重要的一次选择,先暂停使用。

这不是一句“维护升级中”能糊弄过去的事。

它应该被说清楚。

公益动机不能抵消责任

我最难受的地方也在这里。

这个项目一开始确实是想帮人。

不是收费课,不是卖咨询,不是引流到什么私域服务。就是觉得 AI 和数据结合起来,也许能让普通家庭少一点信息差,少一点来回翻表的痛苦。

但公益动机不能抵消责任。

你免费,不代表用户的损失也免费。

你没收钱,不代表建议错了就没有代价。

这也是这次最大的教训:AI 工具不是“我没有恶意”就够了。

尤其是高风险场景,判断标准不能是“我已经尽力了”,而应该是“用户如果按这个结果做,会不会被伤到”。

如果答案是会,那就不能继续用“参考”两个字撑着。

这次留下了什么

项目暂停,不代表这两天全白干。

它至少留下了几个判断。

第一,AI 做高考志愿,不能从聊天框开始。

必须先从数据来源、字段结构、批次边界、官方核对链路开始。没有这些,提示词越强,越可能把薄数据包装成强结论。

第二,本地库有价值,但它不是最终裁判。

本地库能让 AI 不乱编,能帮助用户快速看到历史范围。但只要它不是专业填报决策级数据库,就必须明确说:它只能做初步参考。

第三,公开工具的边界不能只写在角落。

边界要写进页面、接口、AI 口径、按钮状态、反馈系统和默认流程里。用户不应该专门去找免责声明,才能知道这个工具不能承担什么。

第四,专业人士的实战标准必须提前进入复核。

工程师很容易看 badRows、行数、重复率、构建是否通过。可填报师看的是另一套东西:缺一条会不会影响一个学生,位次口径会不会改变风险判断,专业备注会不会导致退档。

这两套标准都重要。

但在高考志愿这件事上,后者更接近真实代价。

第五,停掉也是一种交付。

这句话不好听,但是真的。

一个系统能上线,不代表它应该继续开放。发现风险以后,把入口关掉、把原因讲清楚、提醒已经用过的人回到官方来源核对,也是对用户负责的一部分。

给已经用过的同学和家长

如果你之前用过这个工具,或者用过任何类似的 AI 志愿工具,请不要把 AI 的建议当成最终答案。

正式填报前,请回到这几个地方:

  • 本省教育考试院
  • 当年招生计划
  • 一分一段表
  • 高校招生章程
  • 学校招生网
  • 专业组和专业代码
  • 选科要求、学费、校区、体检限制、调剂规则

如果条件允许,也建议咨询真正做升学规划的人。

AI 可以帮你把问题问完整,帮你整理取舍,帮你发现自己没想到的风险。

但最终选择,不能交给 AI。

这次我们本来想帮大家。

最后弄成这样,我很遗憾,也很抱歉。

但比起让一个不够严谨的工具继续跑,我宁可现在把它停下来。

高考志愿不是一次内容实验。

它是很多家庭的一次人生选择。

这条线,不能拿来赌。