我们在博客里上线了一个高考志愿栏目,名字叫「拘灵遣将」。

入口在这里:https://damonh.com/gaokao/

这个栏目先免费开放一段时间。它不是官方填报系统,也不是某位老师本人或团队授权产品。它的定位更具体:把一个高考志愿问题问完整,先查本地录取库,再让 AI 帮你盘专业、城市、家庭资源和风险边界。

高考志愿这件事,不能只靠一句“AI 帮我推荐学校”。

如果用户只输入“我 560 分能去哪”,系统很容易被迫猜:哪个省?物理还是历史?位次多少?想就业还是考公?能不能接受中外合作?家里有没有行业资源?不想去哪些城市?

这些信息没摆上桌,回答再流畅也不稳。

所以这个栏目的第一条原则是:先把底牌亮出来,再让 AI 盘取舍。

为什么要做这个栏目

高考志愿本质上不是一个纯聊天问题。

它至少有三层:

  • 第一层是硬数据:省份、分数、位次、选科、录取线、专业组、年份。
  • 第二层是现实约束:家庭资源、城市成本、就业目标、能不能接受调剂。
  • 第三层是解释能力:为什么这个学校能冲,为什么这个专业要谨慎,为什么某个城市看着好但不一定适合你。

普通聊天机器人容易卡在第三层,讲很多“综合来看”。传统数据库工具又容易停在第一层,只给表,不给取舍。

我们想做的是中间这一层:先用数据把范围缩小,再用 AI 把取舍说人话。

这也是为什么它不是一个“输入分数,自动给答案”的工具。它更像一个在线咨询前的工作台:先把该问的问完整,把可查的数据拉出来,再把风险和下一步核对清楚。

核心能力从哪里来

这次不是从零写一个空壳聊天页。

我们接入了一个本地高考志愿项目包的主体能力。更准确地说,不是整包原封不动搬过去,而是把核心咨询能力迁移到博客服务端,再补上线上产品必须有的安全和速度层。

迁移进去的主要有几块:

  • 高考志愿顾问的系统提示词。
  • 一份方法论知识库,包括位次法、冲稳保、专业选择、家庭资源判断等。
  • 录取数据底库。
  • 省份、分数、位次、专业偏好等信息提取逻辑。
  • 本地库候选 + AI 解读的组合回答方式。

线上版本没有照搬原包的本地工具壳、娱乐模式和离线维护脚本。原因很简单:公开产品必须有边界。

高考志愿是高风险决策场景。可以有口吻,可以有判断,但不能冒充任何老师本人,也不能把“致敬风格”写成“官方授权”。

数据口径必须写清楚

这个栏目当前本地库是 248,766 条,覆盖 2024-2025 年,真实覆盖 14 个省市:

上海、内蒙古、北京、安徽、山东、广东、江苏、河北、浙江、海南、湖北、湖南、重庆、黑龙江。

这个数字是我们直接复核原始项目包数据库后得到的。它不是 README 里写多少就说多少。原包说明里出现过更大的覆盖口径,但真实压缩数据库查出来就是 14 省。

这一步很关键。

做教育类工具,最危险的不是功能少,而是装作自己有数据。

如果某个省没覆盖,系统不能编学校、编分数、编位次。它应该明确告诉用户:本地库暂未覆盖该省。然后继续给专业方向、城市取舍、家庭资源、就业路径和核对方法。

比如四川、河南、福建、天津、辽宁、陕西、江西、云南、山西、广西,这些是我们现在放在页面上的待补高频省份。用户点这些省份,会自动填入提问模板。后续“不准,省份没覆盖”的反馈,也会进入补库优先级。

数据库本体没覆盖的地方,不靠 AI 硬填。后面要补,就必须重新找官方投档线、招生计划、Excel、PDF 或网页源文件,逐省解析、清洗、抽样校验,再入库。

回答流程怎么设计

工具的回答不是直接把问题丢给模型。

现在大致是这样:

  1. 前端先引导用户输入完整信息:省份、选科、分数、位次、专业方向、城市偏好、家庭资源和目标。
  2. 后端从问题里提取省份、分数、位次、选科等关键信息。
  3. 如果省份在本地库覆盖范围内,先给本地 DB 候选。
  4. 如果省份没覆盖,不列假候选,只给策略建议和核对路径。
  5. AI 再结合知识库补解释:专业、城市、冲稳保、家庭资源和风险。
  6. 前端用流式输出,让用户先看到查库结果,再看到取舍分析。

这样做的好处是,AI 不需要一上来就承担所有责任。

能查库的先查库,不能查库的先承认边界。AI 负责解释和取舍,不负责凭空制造录取数据。

为什么要做流式和“继续”

上线后我们很快遇到一个体验问题:回答长了会截断。

高考志愿的问题天然长。一个完整回答里,可能要讲候选学校、专业风险、城市成本、家庭资源、核对路径。早期版本里,AI 深度解读容易撞到服务端时间上限。更糟的是,用户发“继续”时,系统会当成新问题重新分析。

这个体验很差。

所以后面加了专门的续写模式:

  • 用户说“继续 / 接着说 / 往下说 / 没说完”,系统识别为续写。
  • 续写不重新查库,不重新列本地 DB 候选。
  • 它会带上上一条回答的末尾,让 AI 从断点继续。
  • 如果再次到时限,状态栏提示用户发“继续”,正文不再插入难看的截断提示。

这不是一个华丽功能,但很重要。

咨询类工具的信任感,往往不是来自页面多漂亮,而是来自用户知道“它没有忘记我刚才问了什么”。

反馈不是装饰

页面上有“有用”和“不准”。

这类按钮如果只做成摆设,意义不大。我们这次把“不准”继续拆成原因:

  • 数据不准
  • 口吻不对
  • 没给学校
  • 没说清风险
  • 省份没覆盖

原因拆开以后,后续优化才有抓手。

如果很多人点“口吻不对”,说明提示词要调。如果很多人点“没给学校”,说明回答骨架不够直接。如果很多人点“省份没覆盖”,说明补库优先级要改。

这也是我更看重的地方:工具不是一次上线完事,而是要能接住用户反馈,再反过来改数据、改提示词、改产品。

我们刻意不做什么

这个栏目有几条硬边界。

第一,不做官方填报系统。正式志愿填报一定回到各省教育考试院和学校招生网。

第二,不让用户提交身份证号、准考证号、手机号这些敏感信息。邮箱只用于免费额度识别和后续服务通知。

第三,不编没有来源的分数线、位次和录取概率。

第四,不假装全国覆盖。现在覆盖 14 省,就写 14 省。缺省份就标出来。

第五,不把 AI 的口吻当成权威。口吻可以直,但结论必须能回到数据和公开来源核对。

这几条如果守不住,栏目越热风险越大。

这件事真正的价值

从技术上看,这只是一个 Astro 页面、几个 API、一个压缩数据包、一个提示词和一套流式接口。

但从产品上看,它解决的是另一件事:怎么把一个高风险、强现实约束的问题,拆成数据、方法、AI 和反馈四层。

数据负责边界,方法负责结构,AI 负责解释,反馈负责下一轮迭代。

这比单纯做一个“高考志愿 ChatGPT”稳得多。

对用户来说,最有用的也不是“AI 给了一个神奇答案”。最有用的是,他终于知道自己还缺什么信息、哪些方向不能上头、哪些数据必须回官方核对。

高考志愿不是玄学,也不是一句提示词能解决的事。

先把底牌亮出来。

再让 AI 帮你盘。

最后,回到官方数据上签字。