县城码农的AI副业:三天给产品加上智能客服
六点五十,天刚蒙蒙亮,窗外传来隔壁王大爷遛狗的咳嗽声。我揉了揉眼睛,泡上一壶浓茶——这已经是我在县城远程办公的第372天。作为曾经靠刷题考上985的小镇做题家,现在每天在家撸代码,倒也自在。上周产品经理突然在钉钉群里@我:“能不能加个智能问答功能?竞品都上了。” 我差点把键盘摔了:我们连正经后端都没招齐,现在要搞AI?
但转念一想,最近投简历时发现好多JD写着“熟悉大模型API优先”,再不摸点OpenAI,怕是要被求职市场淘汰了。于是咬咬牙,周末两天硬是啃下了OpenAI API接入,顺便还顺手优化了几个动画交互——毕竟老本行不能丢。
一个被产品经理逼出来的AI需求
事情是这样的:我们做的是一款面向中小企业的SaaS工具,主要用Vue3+TypeScript开发。用户经常问一些重复问题,比如“怎么导出数据”、“为什么报表不刷新”。客服妹子每天要回答上百遍,怨气值快爆表了。老板的意思是:搞个AI客服,先糊弄住用户,等融资到账再招NLP工程师。
说实话,我一开始是拒绝的。咱学的是前端,虽然知道点算法皮毛(当年LeetCode刷了300多道),但跟真正的AI工程差远了。更别说团队里还有人神神叨叨地说什么“AI会取代程序员”,搞得我晚上睡不着觉。但仔细一想,OpenAI API本质不就是个HTTP接口吗?JavaScript发个fetch请求的事儿,能有多难?
从零开始:注册、密钥、第一个请求
第一步永远是最简单的:去 platform.openai.com 注册账号。这里有个坑——必须绑国际信用卡!我翻箱倒柜找出大学时办的那张Visa卡(额度只有500刀),祈祷别被风控。好在验证通过了,拿到API Key那一刻,感觉自己像个黑客。
接着装官方SDK:
npm install openai
然后写个最简单的测试:
import OpenAI from 'openai';
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY, // 别把key写死在代码里!
});
async function askAI(question) {
const completion = await openai.chat.completions.create({
model: "gpt-3.5-turbo",
messages: [
{ role: "system", content: "你是一个专业的SaaS产品客服" },
{ role: "user", content: question }
]
});
return completion.choices[0].message.content;
}
本地跑起来,问它“怎么导出Excel?”,秒回:“点击报表右上角的‘导出’按钮...”。我当时就惊了——这比我们现在的帮助文档还清晰!但冷静下来一想:直接让AI自由发挥?万一它胡说八道怎么办?比如告诉用户“删除数据库就能解决问题”... 那可真是社死现场。
约束AI:Prompt工程才是真·算法
这时候我才明白,所谓“调用AI”,80%的工作其实在设计prompt。就像当年写算法题,边界条件没考虑清楚,再牛的代码也会崩。
我翻遍了OpenAI的文档,总结出几条保命原则:
角色设定要具体
别只说“你是个客服”,要说“你是XX产品的资深客服,只能回答与产品功能相关的问题,不知道就说‘请联系人工客服’”输出格式要锁定
要求返回JSON,或者固定话术模板,避免AI自由发挥知识库要隔离
绝对不能让它瞎编我们的产品逻辑!
于是我把prompt改成了这样:
const SYSTEM_PROMPT = `
你是一个名为"QuickBI"的商业智能产品的AI客服助手。
- 你的回答必须基于以下知识库内容
- 如果问题超出范围,请回复:"很抱歉,这个问题我无法回答,请联系人工客服"
- 回答要简洁,不超过100字
- 禁止提及竞争对手
- 禁止生成任何代码或SQL
【知识库】
- 数据导出:支持Excel、CSV格式,在报表页面右上角点击"导出"按钮
- 刷新机制:报表每5分钟自动刷新,也可手动点击"刷新"按钮
- 权限管理:管理员可在"设置-成员管理"中分配权限
`;
效果立竿见影!测试时故意问“你们和Tableau比怎么样?”,AI乖乖回了预设话术。那一刻我仿佛看到了年终奖在向我招手。
性能与成本:县城网络下的血泪教训
理想很丰满,现实很骨感。第一次上线测试,用户反馈“AI回复要等10秒!”——我这才想起自己在县城,上传带宽只有20Mbps。更惨的是,GPT-3.5-turbo按token计费,一次对话大概0.002美元。如果每天1万次请求... 我默默算了下账单,手心冒汗。
优化方案有三个方向:
1. 缓存高频问题
把常见问题(如“怎么导出”)的答案缓存在Redis里,命中率能达到60%以上。代码很简单:
// 伪代码
const cachedAnswer = await redis.get(`faq:${question}`);
if (cachedAnswer) return cachedAnswer;
// 调用AI...
await redis.setex(`faq:${question}`, 3600, aiAnswer); // 缓存1小时
2. 流式响应提升体验
前端用response_mode: "stream",让用户看到文字逐字出现,心理等待时间缩短50%。配合我拿手的CSS动画,loading效果丝般顺滑:
.ai-response {
animation: typeWriter 2s steps(40, end);
}
@keyframes typeWriter {
from { width: 0 }
to { width: 100% }
}
3. 降级策略保平安
当AI服务超时或报错时,立刻切到静态FAQ。毕竟比起炫技,系统稳定更重要——上次双11因为动画特效太炫导致页面卡死,被运维追着骂了三天。
当AI遇上区块链:一个离谱的需求
正当我以为万事大吉时,老板突然在周会上抛出一个脑洞:“能不能把AI回答上链?这样用户能验证回答没被篡改!” 全场沉默三秒,产品经理小声说:“老板看了篇Web3文章...”
我表面微笑,内心OS:这俩技术八竿子打不着啊!但为了保住饭碗,还是硬着头皮研究了下。结论是:完全没必要。区块链适合存不可篡改的事实(比如交易记录),但AI回答本质是概率生成的内容,今天问和明天问结果可能不同,上链反而会造成混乱。
最后我用一篇《关于AI回答可信度的技术说明》说服了老板,核心论点就一句:“您愿意为每次客服回复多付0.5美元gas费吗?” 老板秒懂。
求职启示:AI时代前端的新定位
折腾完这个项目,我最大的感悟是:前端工程师的价值正在迁移。以前拼的是组件封装、性能优化;现在得懂怎么和AI协作。最近面试了几家公司,发现JD里频繁出现:
- “能设计AI交互流程”
- “有Prompt Engineering经验”
- “熟悉LLM应用架构”
甚至有HR直接问我:“如果让你用AI重构现有产品,你会怎么做?” 这哪是面技术,分明是在考产品思维!
但别慌,底层逻辑没变。就像当年jQuery到React的变迁,工具在变,解决问题的能力才是核心。我甚至觉得,前端反而是AI落地的最佳阵地——毕竟所有AI能力最终都要通过UI触达用户。那些只会调API的人,很快会被淘汰;而能设计出“人类友好型AI交互”的前端,会越来越吃香。
写在最后:小镇做题家的AI生存指南
回到县城的日常:早上8点开工,下午陪爸妈买菜,晚上研究新技术。这次接入OpenAI API的经历让我明白,所谓“技术壁垒”很多时候是自己吓自己。一行JavaScript,一个API Key,就能让产品拥有智能。
当然,过程中踩的坑也不少:
- 忘记设置
max_tokens导致账单爆炸 - 在生产环境打印了完整response(包含敏感信息)
- 本地测试用GPT-4,上线后切回3.5-turbo发现效果差一大截...
但这些都不重要。重要的是,当用户第一次收到AI回复时发来感谢消息,当简历上终于能写“主导AI功能落地”,当深夜调试成功后窗外的星星特别亮——这就是我们小镇做题家,在数字世界的微小高光时刻。
附:我的OpenAI调用成本对比表(日均1000次请求)
| 方案 | 模型 | 日均成本 | 平均响应时间 | 用户满意度 |
|---|---|---|---|---|
| 原始方案 | gpt-3.5-turbo | $2.1 | 4.2s | 78% |
| 优化后 | gpt-3.5-turbo + 缓存 | $0.8 | 1.5s | 92% |
| 极简版 | 自建FAQ匹配 | $0 | 0.3s | 65% |
建议:初期用缓存+AI混合方案,平衡成本与体验。别一上来就All in AI,那都是VC们的故事,不是我们县城码农的现实。
对了,如果你也在小城市远程办公,欢迎交流!说不定哪天我们还能合伙做个AI副业——毕竟,在算法和生活之间,总得找到自己的最优解。

评论 0