ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AI工程师国庆7天实操扫盲:从Token到RAG的工程认知地图

AI工程师国庆7天实操扫盲:从Token到RAG的工程认知地图 1. 这不是一份“词典”而是一张AI技术人的认知地图国庆七天长假朋友圈里有人晒山河壮丽有人发美食打卡也有一群人——尤其是刚转行进来的、被业务方突然甩来一串术语的、或者被老板问“大模型和AIGC到底啥关系”的技术人——默默打开文档开始补课。我去年国庆就干过这事凌晨两点对着“多模态”“RAG”“LoRA”三个词反复查资料越查越迷最后发现不是自己笨而是市面上太多内容要么堆砌定义要么空谈趋势缺一个真正站在工程师视角、按认知逻辑层层剥开的“扫盲动线”。所以今年我把这七天拆成了七个认知台阶不讲PPT式概念不列教科书式定义而是还原每个词在真实项目里“长什么样、在哪用、为什么非它不可”。比如“Agent”不是一句“能自主决策的智能体”就完事——它在我们上个月做的客服工单系统里就是那个先读邮件、再查知识库、接着调API生成回复草稿、最后让人工审核确认的“数字协作者”而“SFT”也不是抽象的“监督微调”它是把销售话术录音转成文本后喂给模型时必须加上的“行业语感校准器”。关键词就藏在这条动线上“AI概念”是表象“技术人”是主体“国庆7天”是节奏“扫盲指南”是目的——不是让你背名词而是帮你建立一套能快速定位问题、判断方案边界、和上下游对齐语言的认知肌肉记忆。适合三类人刚入行半年还在看《机器学习实战》的新人做后端/前端/测试但突然要对接AI模块的工程师还有带团队却总被新词绕晕的技术负责人。接下来的内容没有一页PPT只有七天实操级拆解。2. 概念分层为什么必须按“基础层-能力层-应用层”来组织这七天2.1 基础层Day 1–2所有高阶概念的“地基混凝土”很多人一上来就啃“Transformer”“MoE”结果三天过去连“token”和“embedding”都分不清。这不是学得慢是地基没打牢。我带过的37个新人里92%的卡点都出在基础层——不是不会写代码而是不知道代码背后的数据流走到哪一步该停、哪一步该转。所以Day 1必须死磕两个东西数据形态和计算范式。先说数据形态。“文本”“图像”“音频”这些叫模态modality但技术人真正要盯的是它们的数字化表达粒度。文本的最小单位是token不是字不是词是BPE切分后的子词单元比如“transformer”可能切成“trans”“former”图像的最小单位是像素pixel但模型处理时实际操作的是patch16×16像素块音频则是采样点sample经STFT变换后的频谱图。这个粒度差异直接决定后续所有架构选择为什么ViT要用patch因为全图attention计算量爆炸为什么Whisper用梅尔频谱因为人耳对频率的感知是非线性的。Day 1下午的任务就是用Pythonlibrosa加载一段3秒语音手动画出原始波形、STFT频谱、梅尔频谱三张图对比看能量分布怎么从时间轴转移到频率轴——这个动作比背10遍定义管用。再说计算范式。现在所有热门模型都绕不开“前向传播forward pass”和“反向传播backward pass”但多数人只记得公式。我建议用Excel模拟建一个2输入1输出的简单神经元权重W10.5、W20.3、偏置b0.1激活函数用sigmoid。先算forwardinput[1,2] → outputsigmoid(0.5×10.3×20.1)0.73再算backward假设loss0.2求∂loss/∂W1你会发现链式法则在这里不是数学游戏而是“误差信号如何从输出端倒推回输入端”的物理过程。Day 2上午就做这个Excel推演做完你会明白所谓“训练”本质就是让误差信号带着梯度在网络里反复震荡、修正权重直到输出稳定。没有这个体感后面所有“微调”“蒸馏”都是空中楼阁。提示基础层最常犯的错是混淆“表示”和“计算”。比如看到“embedding是高维向量”就以为它是某种神秘编码其实它就是模型内部的一张查找表lookup table像字典查词一样把token ID映射成向量。别急着学BERT先用numpy手写一个1000词×128维的embedding矩阵随机初始化然后用它把“apple”“banana”转成向量再算余弦相似度——你会发现没训练前它们的相似度纯属随机这才是真相。2.2 能力层Day 3–5从“能做什么”到“怎么做出来”基础层解决“是什么”能力层解决“怎么造”。这里必须打破一个幻觉AI能力不是凭空出现的而是由特定架构特定训练方式特定数据共同锻造的“工具”。比如“生成能力”Generation和“理解能力”Understanding看似一体两面但在工程实现上截然不同。Day 3聚焦生成能力。核心是搞清“自回归autoregressive”和“非自回归non-autoregressive”的本质区别。GPT类模型是典型的自回归预测下一个token时必须等前一个token输出完成就像打字你不能跳过“人”直接打“工智能”。而像FastSpeech这类语音合成模型用非自回归所有音素同时预测靠并行计算提速。实操任务用Hugging Face的transformers库加载gpt2-small输入“今天天气”观察它逐token生成“很好”“不错”“晴朗”的耗时再换tacotron2输入同一句文字看语音波形如何一次性生成。你会发现自回归模型的延迟是线性增长10个token≈10倍时间而非自回归是常数级——这个差异直接决定你选GPT还是选专用模型做实时对话。Day 4攻坚理解能力。关键破除“BERT就是万能理解器”的误解。BERT的强项是上下文感知的词义消歧比如“苹果”在“吃苹果”和“买苹果手机”中含义不同但它天生不擅长长程依赖建模超过512token后首尾词关联性断崖下跌。我们上个月做合同审查时就栽过跟头让BERT分析一份80页PDF它把第1页的“甲方”和第79页的“违约责任”完全割裂。解决方案不是换更大模型而是用“滑动窗口重叠片段”策略把PDF切成512token的块每块重叠128token再用BERT分别打分最后用规则聚合结果。Day 4下午就用spaCytransformers复现这个流程重点观察重叠率设为64/128/256时关键条款召回率的变化曲线——数据会告诉你128不是玄学是精度和效率的平衡点。Day 5深挖推理能力。这里必须直面一个残酷事实“推理”在AI里有双重含义一是模型内部的逻辑推导如Chain-of-Thought二是工程层面的部署推理inference。前者关乎算法后者关乎性能。我们曾用vLLM部署Llama2-7BQPS从12飙到320不是因为改了模型而是把PagedAttention内存管理机制跑通了。Day 5的核心任务用perf工具监控GPU显存占用对比原生transformers和vLLM在batch_size4/8/16下的显存峰值和吞吐量。你会看到当batch_size8时vLLM显存只涨15%而原生方案涨了65%——这就是“推理优化”最真实的肉身。别信“一键加速”信显存曲线。2.3 应用层Day 6–7在真实业务缝里长出来的概念能力层教你造工具应用层教你用工具解决真问题。这里最大的陷阱是把应用概念当成技术概念去学比如“Agent”不是一种新模型而是任务编排范式“RAG”不是独立技术而是信息检索与生成的耦合协议。Day 6专攻Agent。先扔掉“自主智能体”的浪漫想象看我们落地的工单系统用户邮件进来→Agent调用OCR提取文本→调用NLU模块识别意图投诉/咨询/催办→根据意图路由到不同知识库→用RAG召回相关条款→调用LLM生成回复草稿→触发人工审核工作流。整个过程没有一行“Agent框架”代码全是API调用状态机。Day 6上午就用Flask搭个最小Agent接收JSON格式工单返回结构化处理步骤含每个步骤的耗时、成功率、失败原因。重点不是功能而是暴露所有“黑盒”环节——你会发现90%的Agent故障不在LLM而在OCR识别率或知识库更新延迟。Day 7收官RAG。必须戳破“RAG万能”的泡沫。上周客户抱怨“为什么搜‘退款流程’返回的却是‘退货政策’”我们查日志发现Embedding模型把“退款”和“退货”向量距离算成0.12满分1而业务要求是0.05才视为同义。解决方案不是换更大模型而是加一层领域词典校准把“退款”“退钱”“返款”预设为同义组强制在embedding空间拉近。Day 7全天就干这件事用sentence-transformers微调一个中文embedding模型在金融语料上加入200组业务同义词对比微调前后“贷款”“借贷”“授信”的余弦相似度。数据会说话未微调时相似度0.63微调后0.89——这才是RAG在业务里该有的样子。注意应用层所有概念都必须绑定具体业务指标。比如“Agent”的成功标准不是“能否运行”而是“人工审核率是否从45%降到12%”“RAG”的验收标准不是“能否召回”而是“首条命中率是否≥85%”。脱离指标谈概念等于纸上谈兵。3. 核心概念实操拆解七个必须亲手敲代码验证的关键点3.1 Tokenization别再被“分词”二字骗了几乎所有初学者都以为tokenization就是“按空格/标点切句子”直到他们用BERT tokenizer处理“dont”才发现它被切成了[do, nt]。这背后是Byte-Pair EncodingBPE算法在起作用——一种基于统计频率的子词合并策略。Day 1下午的实操我要求你必须亲手跑通这个流程from tokenizers import Tokenizer, models, pre_tokenizers, trainers # 1. 构建简易语料1000句英文 corpus [I love NLP, NLP is fun, fun with NLP] * 300 # 2. 初始化BPE tokenizer tokenizer Tokenizer(models.BPE()) tokenizer.pre_tokenizer pre_tokenizers.Whitespace() # 3. 训练vocab_size1000 trainer trainers.BpeTrainer(vocab_size1000) tokenizer.train_from_iterator(corpus, trainertrainer) # 4. 测试 encoding tokenizer.encode(dont) print(encoding.tokens) # 输出 [do, n, , t] 或类似关键观察点当你把vocab_size从1000改成500再encode同样句子tokens数量会增加因为更粗粒度的词表无法覆盖所有子词组合。这解释了为什么小模型要用小词表——不是为了省显存而是避免OOVout-of-vocabulary问题。我在某电商项目里就吃过亏用5000词表的tokenizer处理用户UGC评论遇到大量网络新词如“绝绝子”“yyds”直接被切碎导致情感分析准确率暴跌17%。解决方案不是换大词表而是用SentencePiece的unigram模式它对未知词有fallback机制。3.2 Attention机制从公式到显存的物理实感Attention公式里的softmax(QK^T/√d_k)V初学者背得滚瓜烂熟但没人告诉你当序列长度L2048时QK^T矩阵需要2048×2048×4字节16MB显存float32而L8192时直接飙升到256MB——这就是为什么长文本模型显存爆炸。Day 2下午的实操用PyTorch手动实现Scaled Dot-Product Attention并监控显存import torch import torch.nn.functional as F def manual_attention(q, k, v, dropout_p0.0): # q,k,v: [batch, head, seq_len, dim] scores torch.matmul(q, k.transpose(-2, -1)) / (q.size(-1) ** 0.5) attn_weights F.softmax(scores, dim-1) if dropout_p 0: attn_weights F.dropout(attn_weights, pdropout_p) return torch.matmul(attn_weights, v) # 测试不同seq_len下的显存占用 for seq_len in [512, 1024, 2048]: q torch.randn(1, 12, seq_len, 64).cuda() k torch.randn(1, 12, seq_len, 64).cuda() v torch.randn(1, 12, seq_len, 64).cuda() torch.cuda.reset_peak_memory_stats() _ manual_attention(q, k, v) print(fseq_len{seq_len}, peak_mem{torch.cuda.max_memory_allocated()/1024**2:.1f}MB)结果会让你头皮发麻seq_len从1024到2048显存从120MB跳到480MB。这解释了为什么FlashAttention要重写CUDA内核——它把QK^T矩阵拆成块在SRAM里边算边丢把显存占用从O(L²)压到O(L)。别光听宣传亲手测数据。3.3 SFT监督微调不是“喂数据”而是“校准语感”很多人把SFT理解成“拿新数据再训一遍”结果模型在业务数据上过拟合通用能力反而下降。真正的SFT是领域语感校准。Day 3下午用LoRA对Qwen-1.5B做电商客服微调from peft import LoraConfig, get_peft_model from transformers import AutoModelForSeq2SeqLM model AutoModelForSeq2SeqLM.from_pretrained(Qwen/Qwen1.5-1.5B) lora_config LoraConfig( r8, # rank控制可训练参数量 lora_alpha16, target_modules[q_proj, v_proj], # 只微调注意力中的Q/V lora_dropout0.1, ) model get_peft_model(model, lora_config)关键参数解读r8不是越大越好我们实测r16时在客服对话数据上BLEU提升0.3但通用问答下降2.1target_modules选q_proj/v_proj而非全连接层是因为客服场景最需要调整的是“如何关注用户问题关键词”而不是“如何生成语法正确的句子”。Day 3的交付物不是模型文件而是两张对比图微调前后模型对“这个订单能取消吗”的attention热力图——你会看到微调后模型明显更聚焦“订单”“取消”这两个词这才是语感校准。3.4 RAG中的Embedding相似度不是数学是业务RAG效果差90%源于embedding没对齐业务。Day 4上午用Milvus搭建最小RAG pipeline重点观察embedding向量的业务含义from pymilvus import connections, Collection connections.connect(default, hostlocalhost, port19530) collection Collection(finance_docs) # 插入三条文档 docs [ {text: 贷款年利率为4.35%, category: loan}, {text: 信用卡取现手续费0.5%, category: credit_card}, {text: 理财收益率3.2%, category: wealth_management} ] # 用text2vec-base-chinese生成embedding from sentence_transformers import SentenceTransformer model SentenceTransformer(shibing624/text2vec-base-chinese) embeddings model.encode([d[text] for d in docs]) collection.insert([embeddings, [d[category] for d in docs]]) # 查询贷款利息多少 query_emb model.encode([贷款利息多少]) results collection.search(query_emb, embedding, limit1) print(results[0][0].entity.category) # 期望返回loan如果返回credit_card说明embedding模型没学懂“贷款”和“信用卡”的业务边界。解决方案不是换模型而是加领域负样本在训练数据里加入“贷款”vs“信用卡取现”的对比样本强制模型拉开向量距离。我们在银行项目里用这种方式把首条命中率从68%提到91%。3.5 Agent的状态管理没有状态机就没有AgentDay 5的Agent实操最容易忽略的是状态持久化。很多教程用内存变量存state上线就崩。真实Agent必须用Redis存状态import redis r redis.Redis(hostlocalhost, port6379, db0) def agent_step(task_id, current_state): # 从Redis读取完整状态 state json.loads(r.get(fagent:{task_id}) or {}) # 执行当前步骤 if state.get(step) ocr: result run_ocr(state[pdf_url]) state.update({ocr_result: result, step: nlu}) elif state.get(step) nlu: intent classify_intent(state[ocr_result]) state.update({intent: intent, step: rag}) # 写回Redis设置过期时间防僵尸任务 r.setex(fagent:{task_id}, 3600, json.dumps(state)) return state关键设计setex设置1小时过期避免任务卡死占满内存state里必须包含step字段这是Agent的“大脑指令指针”。我们曾因忘记加过期时间导致Redis内存爆满整个工单系统雪崩。教训Agent的健壮性80%在状态管理20%在LLM调用。3.6 多模态对齐不是拼接是坐标系统一Day 6的多模态实操必须破除“图像文本特征拼起来就行”的误区。CLIP的精髓在于联合嵌入空间joint embedding space——让图像和文本的embedding在同一个向量空间里语义相近的图文对距离近。实操验证import torch from transformers import CLIPProcessor, CLIPModel model CLIPModel.from_pretrained(openai/clip-vit-base-patch32) processor CLIPProcessor.from_pretrained(openai/clip-vit-base-patch32) # 加载一张猫图和三段文本 image Image.open(cat.jpg) texts [a photo of a cat, a feline animal, a dog] inputs processor(texttexts, imagesimage, return_tensorspt, paddingTrue) outputs model(**inputs) # 计算图文相似度 logits_per_image outputs.logits_per_image # [1, 3] similarity torch.nn.functional.softmax(logits_per_image, dim1) print(similarity) # [0.82, 0.15, 0.03] —— 猫图和“cat”最相似重点观察第三句“a dog”相似度仅0.03说明CLIP不是简单匹配关键词而是理解“猫”和“狗”的生物分类差异。这解释了为什么用CLIP做电商搜图用户上传“红色连衣裙”返回的不仅是同色图片更是同款式的——因为embedding空间里“红色连衣裙”和“酒红修身裙”的向量距离比“红色T恤”更近。3.7 模型量化INT4不是魔法是精度-速度的硬交换Day 7的量化实操必须亲手验证精度损失。用bitsandbytes对Llama2-7B做4bit量化from transformers import AutoTokenizer, AutoModelForCausalLM import bitsandbytes as bnb model AutoModelForCausalLM.from_pretrained( meta-llama/Llama-2-7b-chat-hf, load_in_4bitTrue, # 关键开关 bnb_4bit_compute_dtypetorch.float16, device_mapauto ) tokenizer AutoTokenizer.from_pretrained(meta-llama/Llama-2-7b-chat-hf) # 测试精度损失 prompt 中国的首都是 input_ids tokenizer.encode(prompt, return_tensorspt).to(cuda) output model.generate(input_ids, max_new_tokens10) print(tokenizer.decode(output[0])) # 观察是否输出北京实测结果INT4量化后模型在常识问答上准确率从92%降到85%但在长文本生成中首字延迟从320ms降到85ms。这意味着什么如果你做实时客服宁可接受85%准确率换响应速度但如果你做法律文书生成就必须用FP16。量化不是升级是权衡——所有技术决策最终都要回到业务SLA。4. 国庆七天实操路线图每天2小时拒绝虚假勤奋4.1 Day 1Token与Embedding的物理世界2h0:00–0:30用librosa加载语音画波形/STFT/梅尔频谱三图验证数据形态0:30–1:00用numpy手写embedding lookup table随机初始化算“apple”和“orange”相似度破除神秘感1:00–1:30跑通BPE tokenizer训练观察“dont”切分结果理解子词本质1:30–2:00用transformers库加载bert-base-chinese输入“苹果手机”和“吃苹果”提取[CLS]向量算余弦相似度验证上下文感知实操心得别跳过画图环节。我见过太多人说“懂了”一画图就露馅——波形图上看不到频谱图的能量集中区说明根本没理解时频转换。每天2小时至少1小时花在可视化上。4.2 Day 2Attention的显存暴政与破解2h0:00–0:45手动实现Scaled Dot-Product Attention测512/1024/2048序列的显存建立物理直觉0:45–1:15用FlashAttention重跑相同测试对比显存和速度理解优化本质1:15–1:45用torch.compile()编译一个小型Transformer观察JIT优化效果体验现代加速1:45–2:00总结“序列长度-显存-延迟”三角关系画出自己的经验曲线形成决策依据注意测显存时务必用torch.cuda.reset_peak_memory_stats()否则数据不准。很多教程漏掉这步导致结论错误。4.3 Day 3SFT不是重训是语感手术2h0:00–0:30用LoRA微调Qwen-1.5B只改q_proj/v_proj理解参数高效微调0:30–1:00对比微调前后对“这个能退吗”的attention热力图验证语感校准1:00–1:30用QLoRA做4bit微调测显存节省和精度损失平衡资源与效果1:30–2:00写一个“微调效果检查清单”首字正确率、长句连贯性、专业术语覆盖率建立验收标准4.4 Day 4RAG的Embedding必须业务驱动2h0:00–0:30用Milvus搭RAG插入3条金融文档建立最小闭环0:30–1:00查询“贷款利率”观察返回类别验证基础能力1:00–1:30加入领域负样本如“贷款”vs“信用卡取现”重训embedding理解业务对齐1:30–2:00用t-SNE可视化微调前后embedding分布直观看到向量空间变化4.5 Day 5Agent的状态即生命线2h0:00–0:30用Flask搭最小Agent API接收JSON工单建立服务意识0:30–1:00集成Redis存state加setex过期解决生产隐患1:00–1:30模拟Agent卡死用Redis CLI查僵尸任务掌握运维技能1:30–2:00写Agent健康检查脚本查Redis连接、查API延迟、查任务积压形成SOP4.6 Day 6多模态不是拼图是坐标统一2h0:00–0:30用CLIP计算猫图与三段文本相似度验证联合空间0:30–1:00用CLIP做电商搜图上传“红色连衣裙”返回Top3理解业务价值1:00–1:30替换为BLIP-2对比图文匹配质量理解模型差异1:30–2:00分析失败案例为什么“红色连衣裙”返回了“红色衬衫”培养debug思维4.7 Day 7量化是权衡不是升级2h0:00–0:30用bitsandbytes做INT4量化测响应延迟体验速度提升0:30–1:00跑GLUE基准测试记录准确率下降量化精度损失1:00–1:30用AWQ做组量化对比INT4和AWQ的精度/速度理解进阶方案1:30–2:00写《模型部署决策树》按QPS/延迟/准确率要求选择FP16/INT4/AWQ产出交付物提示每天结束前必须产出一个可验证的交付物Day1是三张对比图Day2是显存曲线表Day3是attention热力图Day4是t-SNE图Day5是健康检查脚本Day6是搜图结果截图Day7是决策树文档。没有交付物等于没学。5. 常见问题与避坑指南那些没人告诉你的血泪教训5.1 “为什么我按教程跑通了但业务效果很差”这是最高频问题。根本原因在于数据漂移data drift。教程用公开数据集如SQuAD、GLUE业务数据却充满噪声客服对话里的错别字、OCR识别的乱码、用户UGC的缩写“xswl”“yyds”。我们做过统计某电商客服数据中32%的文本含非标符号18%的句子无标点。解决方案不是清洗数据而是在tokenizer里注入业务符号# 在tokenizer训练时强制保留常见网络用语 special_tokens [xswl, yyds, awsl, nb] tokenizer.add_special_tokens({additional_special_tokens: special_tokens}) # 或者用正则预处理 import re def preprocess_text(text): text re.sub(rxswl, 笑死我了, text) text re.sub(ryyds, 永远的神, text) return text血泪教训去年一个项目团队花两周调参效果平平。我检查原始数据发现2000条对话里有17条含“xswl”而tokenizer直接把它切成了[x,sw,l]。加了一行正则替换准确率立升11%。记住业务数据的脏永远超乎想象。5.2 “RAG召回不准是不是embedding模型太弱”90%的情况问题不在模型而在chunk策略。默认用固定长度切分如512token会导致语义断裂。比如合同里“甲方应于收到发票后30日内付款”被切成两半RAG只能召回“甲方应于收到发票后”或“30日内付款”无法匹配完整条款。正确做法是语义chunkingfrom langchain.text_splitter import RecursiveCharacterTextSplitter # 不用固定长度用标点和标题作为分割锚点 text_splitter RecursiveCharacterTextSplitter( separators[\n\n, \n, 。, , , ], chunk_size256, chunk_overlap32 )实操验证我们对比过语义chunking比固定chunking在合同审查中关键条款召回率高37%。关键是separators列表要按业务文本特点定制——新闻稿加“——”代码文档加“”。5.3 “Agent总是卡死日志显示timeout”表面是超时根因是状态机死循环。典型场景OCR失败后Agent没设fallback一直重试OCR。解决方案是状态机加超时计数器def agent_step(task_id, state): if state.get(ocr_retry_count, 0) 3: # 三次失败降级到人工 send_to_human(task_id) return {status: escalated} # 正常OCR流程 result run_ocr(...) if not result: state[ocr_retry_count] state.get(ocr_retry_count, 0) 1 r.setex(fagent:{task_id}, 3600, json.dumps(state)) return {status: retry_ocr}经验所有Agent必须有“熔断机制”。我们规定任何步骤重试超过3次必须人工介入。这比修bug快十倍。5.4 “量化后模型胡言乱语是不是量化错了”INT4量化必然损失精度但“胡言乱语”通常是KV Cache精度不足。Llama2的KV Cache默认FP16量化后若不配对就会数值溢出。正确配置model AutoModelForCausalLM.from_pretrained( meta-llama/Llama-2-7b-chat-hf, load_in_4bitTrue, bnb_4bit_compute_dtypetorch.float16, bnb_4bit_quant_typenf4, # 必须用nf4不是int4 bnb_4bit_use_double_quantTrue, # 启用双重量化 device_mapauto )关键参数bnb_4bit_quant_typenf4NormalFloat4比纯int4保留更多动态范围bnb_4bit_use_double_quantTrue用另一层量化压缩量化参数本身。漏掉任一都会导致生成崩溃。5.5 “多模态模型看不懂我的图是不是训练数据不够”大概率是图像预处理不匹配。CLIP训练用224×224中心裁剪但业务图可能是手机竖拍1080×1920。直接resize会拉伸变形。正确做法from PIL import Image def preprocess_image(image_path): image Image.open(image_path).convert(RGB) # 先按比例缩放再中心裁剪保持宽高比 image image.resize((256, 256), Image.Resampling.LANCZOS) image image.crop((16, 16, 240, 240)) # 224×224中心裁剪 return image验证方法用预处理后的图和原始图分别跑CLIP对比相似度。我们发现未预处理图的相似度标准差是预处理图的3.2倍——说明模型根本没在“看”图而是在“猜”图。5.6 “SFT后模型变笨了是不是过拟合”更可能是学习率太高。SFT不是从零训练而是微调LR应该比预训练小10-100倍。Qwen-1.5B预训练LR2e-4SFT用2e-5就足够。实测数据LR训练步数业务准确率通用能力下降2e-4100078%15.2%2e-5100089%3.1%2e-6100085%1.8%结论SFT的LR不是调出来的是算出来的。公式LR_sft LR_pretrain / (sqrt(num_finetune_samples) / sqrt(num_pretrain_samples))
返回列表