从简历被拒到用AI提效:一个大专前端的野路子探索

一行代码半杯茶
2025-12-27 20:15
阅读 4496

大家好,我是阿强,一个刚入职两个月的大专应届前端。每天8点雷打不动坐在工位上泡枸杞茶(别笑,是真的),一边啃着煎饼果子一边刷掘金。去年秋招时投了47份简历,39个石沉大海,剩下8个面试里有6个问我“为什么学历不是本科”——但好在最终还是靠自学Vue3 + TypeScript + 一些开源项目混进了现在这家公司。

最近我们组接了个新活:给内部运营后台加个“智能文案生成”功能,产品经理说:“用户填几个关键词,AI自动出五条营销文案,要快、要准、还要带点网感。” 我一听就懵了——我连PyTorch都没装过,这不纯纯赶鸭子上架?

但转念一想:这玩意儿要是做成了,下次跳槽简历上就能写“AI+前端融合实践”了,立马来劲!


被产品需求逼出来的技术探索

事情是这样的。上周三站会,产品小李推了推眼镜,一脸认真地说:“老板看了竞品,说人家都能用AI写Slogan了,我们怎么还在手动复制粘贴?” 技术老大老王瞥了我一眼:“阿强,你不是最近在学AI吗?试试看。”

我?学AI?我只是在B站看了几节吴恩达的课,还在Colab上跑过Hello World级别的模型……但嘴上还是硬气:“行,我搞!”

于是,我开始了为期五天的“边学边干”式开发。目标很明确:不能让后端改接口,不能影响现有系统,前端自己搞定AI调用和展示。

第一坑:选型纠结症

最开始我想直接调OpenAI API,但公司网络策略卡得死,连curl都超时。后来发现国内有阿里云百炼、腾讯混元、讯飞星火,但要么要企业认证,要么按token收费贵得离谱。

最后灵光一闪:用开源模型 + Web Worker + ONNX.js!
对,就是那个能在浏览器里跑AI模型的ONNX Runtime Web。虽然模型小、效果一般,但胜在——免费、离线、不依赖后端。

我在Hugging Face上扒拉了半天,找到一个叫 gpt2-chinese 的轻量级中文生成模型,压缩后只有50MB左右(实际加载时还得分块,后面再说)。

🤓 小知识:ONNX(Open Neural Network Exchange)是个跨框架的模型格式,PyTorch/TensorFlow训练好的模型都能转成它,然后用 onnxruntime-web 在浏览器跑。


开发心得:前端也能玩转AI,但别太飘

说干就干。我建了个新分支,信心满满地 npm install onnxruntime-web,结果页面直接卡死三分钟。

原因?模型太大,主线程直接崩了。

赶紧查文档,发现官方推荐用 Web Worker 加载模型。于是我把推理逻辑扔进 worker 里:

// ai-worker.js
import * as ort from 'onnxruntime-web';

let session = null;

self.onmessage = async (e) => {
  const { type, payload } = e.data;
  
  if (type === 'LOAD_MODEL') {
    try {
      // 分片加载模型(关键!)
      const modelUrl = '/models/gpt2-chinese/model.onnx';
      session = await ort.InferenceSession.create(modelUrl, {
        executionProviders: ['webgl'], // 用GPU加速
      });
      self.postMessage({ type: 'MODEL_LOADED' });
    } catch (err) {
      self.postMessage({ type: 'ERROR', error: err.message });
    }
  }

  if (type === 'GENERATE_TEXT' && session) {
    const { inputText, maxLength } = payload;
    // 这里省略tokenizer处理(实际用了transformers.js)
    const output = await session.run({ input_ids: ... });
    self.postMessage({ type: 'TEXT_RESULT', result: decode(output) });
  }
};

主页面那边就简单多了:

// main.vue
const worker = new Worker('/ai-worker.js');

worker.postMessage({ type: 'LOAD_MODEL' });

worker.onmessage = (e) => {
  if (e.data.type === 'TEXT_RESULT') {
    this.generatedTexts = e.data.result;
  }
};

// 用户点击“生成”时
generate() {
  worker.postMessage({
    type: 'GENERATE_TEXT',
    payload: { inputText: this.keywords, maxLength: 50 }
  });
}

踩坑记录:

  • 模型文件必须放在 public/ 目录,否则Webpack会把它当模块打包,体积爆炸
  • WebGL执行提供者(execution provider)在低端手机上可能不支持,得降级到CPU
  • 中文Tokenizer处理巨麻烦,最后用了 @xenova/transformers 库,但它本身就有1.2MB……

产品上线后的“惊喜”

周五下午,我提了PR,测试小姐姐跑完用例说“基本OK”,我就美滋滋准备下班。结果周一早上,运维大哥私聊我:“你们那个AI页面,昨天晚上把CDN流量打爆了!”

原来我把50MB的模型文件直接放CDN,而没做缓存策略。每个用户进来都重新下载,100人同时用 = 5GB流量,公司账单差点报警。

紧急修复:

  1. 给模型文件加 Cache-Control: max-age=31536000(一年缓存)
  2. 前端首次加载时显示“正在初始化AI引擎…”进度条
  3. 加个 localStorage 标记,避免重复加载
优化前 优化后
首次加载耗时 12s 首次加载 8s,后续 <1s
CDN日流量 5GB 日均 50MB
内存占用峰值 1.2GB 稳定在 600MB

虽然数据看起来一般,但产品经理已经拿着截图去跟老板汇报“我们实现了AI赋能业务”,而我……终于不用再被问“大专生能不能扛住压力”了。


给同样野路子出身的朋友几点真心话

  1. 简历不是学历的附属品,是能力的投影仪
    我现在敢在简历写“独立实现前端AI推理模块”,HR筛简历时根本不会点开学历。项目、代码、思考深度,才是敲门砖。

  2. 别怕用“非主流”方案
    正规军可能觉得“前端跑AI?不专业!” 但小公司要的是快速交付+低成本。用Web Worker + ONNX,零后端改造,三天上线,老板笑了,你就赢了。

  3. 开发心得:80%的时间在处理边缘情况
    比如用户关掉页面时要 terminate worker,比如模型加载失败要 fallback 到 mock 数据,比如低端机要禁用 WebGL……这些脏活累活,才是真实世界的开发。

  4. AI不是魔法,是工具
    别被 hype 带偏。我们现在这个功能,准确率也就60%,但运营说“能省下他们写文案的时间就行”。技术的价值,在于解决具体问题,而不是炫技。


最后说句掏心窝子的:作为一个非科班、非名校的大专生,我深知每一步都走得比别人更用力。但正是这种“没人帮我兜底”的处境,逼我学会快速试错、快速学习、快速交付。

现在每天早上8点坐到工位,我不再焦虑学历,而是想着:“今天又能折腾点什么新东西?”

也许这就是技术探索最迷人的地方——你不需要等谁批准,打开编辑器,世界就是你的 playground。

对了,下周产品又要加“AI自动配图”功能……我已经在研究 stable-diffusion-webui 了。兄弟们,有没有避坑指南?评论区救救孩子!

评论 0

最热最新
暂无评论
一行代码半杯茶Lv.1
0
影响力
0
文章
0
粉丝