AI赋能转型:从原有岗位到AI相关岗位实践成长之路
一、转岗第一步:先盘点能力差距,再确定学习顺序
转岗最常见的错误,是可以直接去学大模型微调,却没有整理好原有能力。在动笔之前,我先把新旧岗位的能力矩阵列了出来,明确哪些可以复用、哪些必须补齐:
| 能力项 | 原岗位水平 | AI 岗位要求 | 处理方式 |
|---|---|---|---|
| 业务理解 | 熟 | 熟 | 直接复用,作为差异化优势 |
| 数据处理 | 中(Excel/SQL) | 高(Python/Pandas) | 两周内补齐 |
| 工程能力 | 中 | 高(服务化、并发) | 项目驱动补齐 |
| 模型知识 | 零 | 中(原理 + 调参) | 先懂推理链路 |
| 评测与迭代 | 零 | 高 | 必须最先掌握 |
结论:先学评测,再学模型。如果不懂怎么判断输出好坏,写再多 Prompt 也只是凭感觉调整。数学与反向传播只补到能看懂梯度流向、能解释 loss 变化的程度,不追求完整刷完教材。
二、用最小闭环验证学习成果
第一个练手项目不要选太大的:用 200 行代码跑通"数据 → 训练 → 推理 → 评测"全链路,重点在跑通流程,不在达到多好的指标。
python
import torch, torch.nn as nn
class TinyClassifier(nn.Module):
def __init__(self, vocab=5000, dim=128, num_cls=4):
super().__init__()
self.emb = nn.Embedding(vocab, dim, padding_idx=0)
self.encoder = nn.Sequential(
nn.Conv1d(dim, 256, kernel_size=3, padding=1),
nn.ReLU(),
nn.AdaptiveMaxPool1d(1),
)
self.head = nn.Linear(256, num_cls)
def forward(self, x): # x: [B, L]
h = self.emb(x).transpose(1, 2) # [B, dim, L]
return self.head(self.encoder(h).squeeze(-1))
model = TinyClassifier()
opt = torch.optim.AdamW(model.parameters(), lr=3e-4)
loss_fn = nn.CrossEntropyLoss()
for step, (x, y) in enumerate(loader):
logits = model(x)
loss = loss_fn(logits, y)
opt.zero_grad(); loss.backward(); opt.step()
if step % 100 == 0:
acc = (logits.argmax(-1) == y).float().mean().item()
print(f"step={step} loss={loss.item():.4f} acc={acc:.3f}")
这一步解决的关键认知:训练不收敛,多半是学习率、数据分布或归一化出了问题,而不是模型结构不够深。这个判断能力后面会反复用到。
三、第一个真实项目:RAG 问答系统
真正能写进简历的是有业务输入、有量化指标的项目。我选的是内部知识问答,链路清晰、效果可测量:
python
from openai import OpenAI
import numpy as np
client = OpenAI()
def embed(texts, model="text-embedding-3-small"):
resp = client.embeddings.create(input=texts, model=model)
return [d.embedding for d in resp.data]
def chunk(text, size=300, overlap=50):
step = size - overlap
return [text[i:i + size] for i in range(0, len(text), step) if text[i:i + size].strip()]
docs = [d for doc in corpus for d in chunk(doc)]
vecs = np.array(embed(docs))
vecs /= np.linalg.norm(vecs, axis=1, keepdims=True) # 归一化后内积即余弦相似度
def retrieve(query, k=4):
q = np.array(embed([query])[0])
q /= np.linalg.norm(q)
scores = vecs @ q
return [docs[i] for i in np.argsort(-scores)[:k]]
def answer(query):
ctx = "\n\n".join(retrieve(query))
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "只依据给定资料回答,资料中没有就回答"未找到依据"。"},
{"role": "user", "content": f"资料:\n{ctx}\n\n问题:{query}"},
],
temperature=0,
)
return resp.choices[0].message.content
上线前必须先建评测集:从真实提问里抽 100 条,人工标注标准答案,分三档打分(正确/部分正确/错误)。只有这样,"改了切分策略后效果变好"才是可论证的结论,而不是主观感受。
四、踩过的主要问题
- 切分过细:单块丢失上下文,召回片段读起来像孤立的句子。改为按标题层级切分、给每块补上所属章节标题后,正确率明显回升。
- 只调模型不调检索:大部分错误答案的根因是没召回到正确片段,而不是模型不会回答。因此先看检索命中率,再谈 Prompt 优化。
- 忽略成本与延迟:把 top-k 从 8 降到 4,质量几乎无损,token 成本与响应时间明显下降。数值要在评测集上确认,不能凭感觉调整。
- 无灰度就全量上线:新版本先走 10% 流量、保留回滚开关,才敢动线上。
五、从"能做"到"能交付"
工程化落地要守住几条:
- 输入做长度与格式校验,防止超长文本导致成本失控;
- 所有模型调用加超时与重试,失败降级到规则兜底;
- 记录每次请求的检索片段、耗时、token 数,问题可回溯;
- 敏感信息在进入模型前脱敏;
- 版本、Prompt、模型名一起做配置管理,可一键回滚。
六、转型心得
转岗的胜负手不在模型原理背得多熟,而在于能否把业务问题拆成一条可评测、可迭代、可运维的链路。原有岗位积累的业务判断是最稀缺的资产,技术只是把它放大。
海量精选技术文档和实战案例持续更新,敬请关注【风骏时光少年】