FireTable's Log
← 返回
🆚 黑客松

第一次参加黑客松,拿了企业赛道第二名

音频

第一次参加黑客松,拿了企业赛道第二名

0:00/0:00
✦ ✦ ✦
截止报名最后一天,我被抓去参加 顺德 AI 黑客松
我之前也没参加过黑客松经验。倒是前司举办过几届,我都是组织方那边
想着闲着也是闲着,那就去吧,反正招聘软件都刷腻了,黑客松报名了可能也没被选上
没想到被选上了,那好吧,出发
notion image

队友扩充

大家听过顺德鱼生吗?
顺德是鱼米之乡,鱼生是当地最有江湖气的菜——把草鱼片得薄如蝉翼,配上柠檬丝、花生、芝麻、酱油、泡椒、蒜片、芋头丝,一筷子拌下去,鲜、甜、酸、辣、脆五味同时在嘴里炸开
当天晚上,我跟抓我去的小姐姐花了十来秒拟定队名:赢了就回家吃鱼生,开始招人,结果一呼百应
notion image
我们内心打算招的人,其实很简单:
  1. 愿意一起吃鱼生
  1. 保持有趣、好玩
  1. 也不需要队友有多牛,作为 10 年老社畜,我们俩应该都能 handler 住
其实起这个队名,是埋了一个钩子,希望来的人是觉得好玩,能 get 到队名,也可以让别人一眼对我们有印象
一下子群里面就爆了,大家都很震惊,我们也收到十几个人的好友申请,各种聊天飞来
最终我们筛选了 3 个队友,加上我和抓我的小姐姐,5 个人初次成团:3 个 10 年老社畜 + 2 个大二的学生

开赛日(Day 1)

开赛日,天气比较热
我接上小姐姐就出发了,到场地很快就碰见队友,结果开会开了一天
notion image
到晚上才公布赛题,分了 3 个赛道:
  1. 企业赛道
  1. AIGC 赛道
  1. 自由赛道
其实我们一开始组好队,就打算选企业赛道,然后中途一个大二的学生跳车了,私下找到了 AIGC 赛道的车队
我们成为了 4 人队伍,也没关系,人越少越好安排活

我们选了竞争最激烈的企业赛道 + 最激烈的命题

理由其实很功利:
  • 企业赛道命题最具体,能拿到一手真实业务反馈,也有非常好的脱敏数据
  • 我之前在创业公司做过,知道"能不能落地"是判断一个技术方案价值的唯一标准
  • 我们希望能够拿奖,能够让简历有点色彩
命题下来后,大家一开始打算选 小熊电器 的命题,做 RAG 话术生成机器人 命题,这个感觉最简单
但是我们感觉可能做的人很多,并且没有赛后对接,于是就转到了 12345 的 多频工单 命题
结果没想到这个赛道 + 命题是最多人选择,竞争最激烈,数据如下:
  1. 企业赛道(35 支队,9 个命题):12345 这个命题,居然有 7 个队伍,占比 1/5
  1. AIGC 赛道(8 支队伍):这个与我们无关
  1. 自由赛道(5 支队伍):没想到最不激烈是这个赛道,我都震惊了
notion image

开发日(Day 2)

第二天,我才有时间开始开发
接了 12345 命题,脱敏数据长这样:
表格里面只有工单编号、投诉内容,投诉内容里面混杂着各种地点、时间、事情,非常乱

数据预处理

首先做数据预处理,可以用 NLP 或者 LLM 来处理
我们通过 LangGraph 把每个 Case 的数据都进行处理
anonymizer.ts 先过一道:姓名 张* / 手机 138****0000 / 身份证自动打码
然后 8 个节点串起来:
  • extract-node:强约束抽取 summarizeTitle / subject / location / eventType / category / confidence
  • arbitrator-node:置信度 < 60 自动二级仲裁,命中泛词 / 地点模糊也触发
  • canonical-node:车牌严格 100% 字符对齐
  • cluster-node:双轨聚类,主体型 + 微观地点型
  • cluster-validator:拦截跨车牌 / 虚词成群 / 跨 3 个镇街
  • fake-closure:72h 内同点同因再投诉自动标
  • summary-node:出公文级处置建议,牵头 / 协办 / 时限一条龙
修不好的工单自动推 review_queue 人工复核

治幻觉

引入数据字典,确保程序对 AI 提取的内容进行纠错
顺德镇街 + 诉求分类白名单。容奇 → 容桂街道 这种俗称自动归一
数据库预置 72+ 条口语缩写别名,AI 跑的时候还能自学习沉淀新别名进 aliases 表
前端 /dict 页面可以可视化维护这套词典
跑下来:幻觉率从 38% 降到 1.2%

离线模型

我衡量了一下项目性质的成本,最终选择了本地模型路线
政务数据不能出域,OpenAI / DeepSeek 在线 API 直接 pass
刚好我带的是 Mac Studio M1 Ultra 64G 非海南免税版本,性能也够了
最终跑的是 MiniCPM / Qwen2.5 这种开源量化模型,.env.vps 里把 OPENAI_BASE_URL 指到 http://127.0.0.1:11434/v1
数据 100% 不出政务内网,等保合规没问题

脱敏数据测试

原本的脱敏数据总共有 12.8w
我抽了 1.3w 条作为测试集,导入到系统里面完全处理(我其实想跑完 12.8w 条,但是时间不允许)
企业赛道肯定更加看重对数据集的使用
我也赌对了,全场只有我们队伍用了这么多数据来处理

UX 改造

我们有一名队友是 UX 出身的,在跟 Codex 合作后,他完成了初步设计
拿过来的是一份完整设计稿 HTML,我直接拍进去集成:
  • 5 个核心模块:数据总览 / 多频工单 / 工单透势 / 工单中心 / 标准字典
  • 顺德 10 镇街 SVG 态势地图
  • 紧急 × 重要四象限透势图
  • 右下角悬浮 AI 研判副驾驶 Copilot
Civic Light 设计语言统一配色,Tailwind + Radix UI 撸出来
非常完美,很省我时间

路演准备

我们的两位小姐姐非常给力,处理好了 PPT 和路演的内容,并且我们一起做了各种计时演练
短短一天时间,我们完成了所有项目落地,凌晨 12 点我提交了初步的数据,也用 AI 生成了很多文档
团队连夜打磨到 4 点,等着第二天 10 点最后的提交,机器也不停歇地跑脱敏数据
(这一天实在没什么素材,太忙了,最终我们得到了下面这个东西)
notion image

比赛日(Day 3)

一开始,其实我也没有底,不知道对手怎么样,也不清楚能拿到什么成绩
在 10 点提交完材料后,就等着公布路演名单了,原本计划每个赛道选 6 个队上去路演,结果企业赛道比较拥挤,官方扩充到 13 个队
我们成功进了路演名单,我的小红手抽到了 12 号(倒数第二个路演队伍),同样选了 12345 作为命题的,还有 1 个队伍
notion image
相当于 13 -> 3 个获奖名额,其实压力很大
我们可以上台 2 个人,计划是抓我去的小姐姐:她来路演(5 min),另一个是我:负责答辩(3 min)
我们就简单扒拉了几口饭,就等着上台,一直也在看其他队伍的作品
上台其实也还好,就是我没留下特别好的人生照片,有点遗憾
notion image
在路演完了以后,我有一种能获奖的强烈预感,同样选了 12345 命题的那组,PPT 很好,但是本地地址 + 没有任何数据,对我们没有任何威胁

我们获奖了

在等待宣判的时候,突然我的微信收到了主办方的语音聊天,我激动地马上给队友看
然后台上主持人几乎同时在宣布:请 赢了就回家吃鱼生 团队,上台领取企业赛道第二名
我们一队快速奔跑,奔向领奖台
可惜只有我和 UX 小哥上去了,另外 2 个小姐姐队友被拦住了(不过后面的队又可以全员上去,很奇怪)
notion image

尾声

这次 AI 黑客松,我们在现场看到很多:
  • 有带着作品来的,改一改就上的(还好我们从 0 到 1 的项目也不弱)
  • 有带着团队过来的,每人报了一个赛道,掏出很完整的作品,包揽了 2 个赛道的第一(这种我们惹不起也打不过,他们作品和路演实力都很强)
  • 有在那边认真专研作品,却因为没切题、没上线,最终没有进路演
  • 有在享受社交的人,来这里就是认识更多的人
  • 有摇摆不定的人
  • ...
这些林林总总,像个小型社会,我们拿奖之后,也有团队过来 Social,大家聊了很多,又好像什么都没聊
我们这次能拿到奖,是因为真的卷,又有一点点运气,而且也是因为评委是真的懂
很感谢我的队友,虽然你们整天催我出货,还要把包含 豆包 AI 生成 的水印放在 PPT 里面,但是真的谢谢你们
notion image
在晚上,真的一起去吃了鱼生,我也兑现了承诺给大家买了驱虫药
notion image
notion image
notion image
notion image
这是我们一开始在群里面招募的截图
补上买药的照片了哈哈

附:项目技术栈 & 信息

维度
选型
全栈框架
Next.js 15 (App Router) + React 19
工作流引擎
@langchain/langgraph + LangGraph JS
数据库
PostgreSQL 16 + Drizzle ORM
UI 体系
Tailwind CSS + Radix UI + Civic Light 政务设计语言
LLM
本地模型
部署
Docker + VPS(支持 vLLM / Ollama 政务信创纯离线)