被产品经理逼着搞AI,我这个前测试工程师真香了
去年年底,我们组接了个“小需求”——给公司内部文档平台加个智能问答功能。产品经理拍着胸脯说:“就调个大模型,前端加个输入框,后端透传一下,三天搞定!”我当时差点一口老血喷在VSCode上。要知道,我可是从测试转开发的“半路出家选手”,三年前还在写自动化脚本、跟开发battle bug归属问题,现在突然要搞机器学习?但谁让我远程办公工资照发、绩效还得靠项目撑呢?硬着头皮上了。
从Hello World到Llama本地跑起来
一开始,我天真地以为直接调通义千问API就行。结果测试环境一跑,延迟高得离谱,而且敏感数据不能外传——合规部门邮件抄送了全组。得,只能本地部署开源模型。
翻了一堆GitHub仓库后,我锁定了Llama系列(别问为什么不用ChatGLM,问就是显存不够)。但Llama动辄几十GB,我这台MacBook Pro 16寸M2 Max差点原地升天。后来发现Hugging Face上有量化后的Llama-2-7b-chat-hf,4-bit精度,内存占用直降到6GB左右,终于能在我家书房的“工作站”上跑起来了。
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
model_name = "meta-llama/Llama-2-7b-chat-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name, use_auth_token=True)
model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map="auto",
load_in_4bit=True, # 关键!省显存就靠它
use_auth_token=True
)
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)
response = pipe("你好,能帮我总结这篇技术文档吗?", max_length=200)
print(response[0]['generated_text'])
💡 小贴士:记得去Hugging Face申请Llama的访问权限,不然会报
403 Forbidden。我卡在这儿整整一个下午,还以为是梯子问题,结果是Meta的审核机制……
前端不是摆设,交互体验也得卷
模型跑通了,但直接扔给前端一个API接口显然不行。用户输个“上周五的需求文档在哪?”,模型可能回你“根据我的知识截止日期……”。得做检索增强生成(RAG)!
我用FAISS搭了个轻量级向量数据库,把公司Confluence里的PDF和Markdown文档切块、嵌入(embedding),再存进去。用户提问时,先查最相关的3段上下文,拼进prompt里喂给Llama:
from langchain.vectorstores import FAISS
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vector_store = FAISS.load_local("confluence_index", embeddings)
def retrieve_context(query: str):
docs = vector_store.similarity_search(query, k=3)
return "\n\n".join([doc.page_content for doc in docs])
前端同事(对,我们还有前端!)用React写了个带历史记录和loading动画的聊天界面。我还偷偷加了个“吐槽模式”开关——当检测到用户连续三次说“没用”时,自动回复:“亲,要不你来写代码?”(产品经理看到后笑出了声,但没敢关)
算法选择:小数据集别硬刚大模型
你以为这就完了?Too young!上线第一天,运营同学反馈:“问‘双11活动规则’,模型居然推荐了去年的旧政策!”——因为训练数据截止到2023年中。
这时候我才意识到:不是所有场景都需要千亿参数大模型。对于公司内部这种封闭域、小规模数据,传统机器学习+规则引擎反而更稳。
于是我用Scikit-learn训了个简单的文本分类器,判断用户问题是“文档查找”还是“流程咨询”:
| 问题类型 | 使用模型 | 准确率 |
|---|---|---|
| 文档查找 | Llama + RAG | 89% |
| 流程/制度咨询 | Logistic Regression | 94% |
| 闲聊/无效输入 | 规则过滤 | - |
准确率提升不说,响应时间从2.1秒降到0.4秒。运维大哥终于不用半夜被P0告警叫醒了。
性能优化:远程办公也要讲究效率
作为曾经的性能优化爱好者,我怎么可能放过压测机会?用Locust模拟50并发用户,发现瓶颈其实在token生成速度。Llama默认一次生成一个token,网络往返延迟累积起来吓死人。
解决方案?批量生成 + 缓存!我把常见问题(比如“请假流程”、“报销标准”)的答案预生成并缓存到Redis。同时调整生成参数:
pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
max_new_tokens=256, # 控制输出长度
do_sample=True,
temperature=0.3, # 降低随机性,回答更稳定
top_p=0.9,
repetition_penalty=1.2
)
调完之后,QPS从8飙到35,连测试同事都发来微信:“你这接口终于不像树懒打字了。”
写在最后:从前端到算法,全栈不是梦
说实话,三个月前的我,看到“embedding”、“attention mask”这些词还会懵。但现在,我已经能在晨会上跟算法工程师对线模型选型了(虽然大部分时候还是听他们讲)。从测试转开发的经历让我特别注重可测试性和可观测性——每个AI接口我都加了日志埋点和bad case收集,方便后续迭代。
如果你也和我一样,非科班出身、被业务推着走,别慌。AI没那么玄乎,核心还是解决问题。通义千问也好,Llama也罢,工具而已。真正值钱的是你理解业务、拆解需求、落地交付的能力。
对了,上周五晚上我又加班到凌晨两点——不是调模型,是在给前端同事修一个CSS overflow bug。果然,程序员的世界,永远逃不开“最后一公里”的细节地狱啊。
附:我的VSCode插件清单(AI开发特供版)
- Python / Pylance
- Jupyter
- REST Client(调试API神器)
- GitLens
- Todo Tree(标记待优化点)
- indent-rainbow(看嵌套结构不眼花)
现在,我的终端还在跑着新一轮的embedding更新。咖啡凉了,但代码热着。这,就是远程打工人的日常。

评论 0