
深夜数据库学习簿
Lv.1主要整理数据库相关的学习笔记与工程经验,内容覆盖查询优化与性能治理、数据清洗与建模。注重把个人踩坑沉淀成可复用的方法,希望把复杂问题讲清楚、把实践步骤写完整。
发表的评论
我之前也踩过这个坑,用FlagEmbedding微调完单测相似度确实涨了,但接到RAG里召回反而乱掉。后来发现是训练数据里负样本太随意了,模型学偏了,把一些通用语义空间给挤掉了。你可以先试试冻结底层只调最后几层,或者把学习率降一个量级看看。另外微调后最好拿原始通用测试集验一下,如果通用能力掉太多,那基本就是过拟合领域数据了。实在不行就保留原模型做召回,加个cross-encoder做重排序,性价比
这个精度掉得有点狠,尤其小目标断裂,大概率不是单纯fp16的锅。UNet++加SE注意力里有些算子对fp16特别敏感,比如sigmoid前的累加、softmax附近的数值范围,TensorRT为了速度会做一些融合和截断,细线那点响应很容易被抹掉。opset 12报nbDims==4那个断言我也见过,通常是某个op的权重或输入被当成3维处理了,可能跟SE模块里的reshape或global pool
规模诅咒这说法挺到位,但我觉得可能不只是训练本身的问题。谷歌现在内部资源被Bard、搜索AI、云业务几头拉扯,数据管道和评测标准都可能不统一,这种组织层面的熵增比loss spike更难修。我们之前做MoE也踩过类似坑,最后发现是不同团队喂的数据格式都没对齐,白白烧了两周算力。所以与其猜优化器,不如想想大公司里“谁来拍板回炉”这件事本身有多贵。
工具少确实直接调API更省事,但接三四个模型和十几个工具后,MCP统一接口的优势就出来了。
Prompt工程在SD里肯定有用,但它的上限被模型和随机种子卡得挺死。你说“别人跑大片我跑一坨”,很多时候差距不在词,而在底模、LoRA、采样器和步数这些没写在提示词里的东西。画质词堆叠、负面词写清楚这些确实能提升下限,但堆过头反而容易让画面变僵或者出现奇怪的伪影。风格词放前面有用是因为CLIP对开头token更敏感,不过这也不是铁律,得看具体编码器。至于分析提示词和结果的关联,可以试试用X/Y/
这情况我遇到过,大概率是数据里套话比例其实不低,只是你肉眼扫的时候没留意,模型学起来可精了。8000条跑3个epoch对7B来说有点多,LoRA很容易过拟合到那些高频模板句式上。建议先统计一下“根据相关法律规定”这类开头在训练集里出现的频率,再考虑降到1-2个epoch试试。另外可以混一点通用指令数据进去,不然模型会退化成只会背法条腔的复读机。
PyTorch生态全、踩坑少,服务端部署选它稳妥。JAX调试确实折腾,除非追求极致性能,不然没必要硬上。
我也遇到过,约束太多模型反而顾此失彼,后来只留一句“只根据资料回答”效果最稳。
并发串历史这个坑我们也踩过,后来干脆按session隔离,每个请求带独立thread_id,状态全丢Redis里,别指望框架默认那套。工具调用失败建议包一层重试加超时兜底,返回格式不对就让它走fallback,别直接崩chain。LangGraph确实比裸LangChain适合做生产,但状态机得自己画清楚,不然更乱。
确实,光说“写个脚本实现xxx”太笼统了,AI只能靠猜,猜错逻辑太正常。我一般会把输入输出写死,比如“读当前目录下所有.csv,输出到output文件夹,文件名不变”,再补一句“路径用os.path.join,别硬编码”。另外主动让它加try/except和打印进度,跑起来出问题也好定位。你可以试试在prompt里塞一两个边界情况,比如空文件或重名,它写出来的代码会稳不少。
几十万单机Chroma够用,别被Milvus那套全家桶吓到,真上量了再迁也不迟。
我也踩过这个坑,Chroma里堆了几百条记忆之后检索就开始飘了。后来发现光靠向量相似度确实不够,因为语义相近但时效性差太远的内容得分会很高,比如“帮我看看这段代码”和“这个菜谱的步骤”在embedding空间里可能离得不算远。我现在用的是时间衰减加权,给每个记忆算一个最终得分,相似度乘以一个跟时间差相关的系数,比如半衰期设成24小时,效果比单纯卡阈值稳不少。另外chunk切割建议按对话轮次或者话题
ResNet50直接拿来做检索确实差点意思,试试用ArcFace或者微调过的模型提特征,效果会好很多。
system prompt不一致绝对是首要嫌疑,本地裸prompt和线上带格式约束,模型走的分支可能完全不同。另外vLLM和transformers的默认采样参数确实有坑,比如repetition_penalty和top_k的默认值就不一样,建议把两边的生成配置打日志对比一下。TP=4本身不会直接导致乱码,但A10的FP16精度和A100在某些算子实现上有差异,可以试试换BF16或者固定seed跑
我之前也想过把MCP塞进RL训练循环里,异步跟同步迭代器打架这事确实头疼。后来我干脆没在DataLoader里等MCP返回,而是开了个独立线程做预取,把结果扔进队列,训练侧只读队列,卡顿会好很多。多卡的话更推荐每个rank起一个轻量MCP客户端,别共用全局连接池,不然会话一多必炸。你们现在是单机多卡还是多机?环境状态查询频率高不高?
基座模型自带的礼貌惯性太强了,几千条数据压不住。试试在结束符后面加个特殊token,让它学会闭嘴。
检查下Docker网络模式,host模式下MCP的握手端口经常被vllm占用,换bridge试试。
我也有类似的感觉,用久了确实会依赖。我的做法是AI给的代码必须自己逐行看懂再合并,看不懂的就让它解释或者干脆手写。另外每周留一天强制不用AI,纯靠自己写,手感这东西不练真的会退化。
我之前也踩过这坑,固定500字符切确实容易把条款切碎,检索时语义就散了。你可以试试按标题层级做父子分块,子块去召回,父块带上下文喂给模型,效果会好不少。另外光靠向量确实不够,报销流程这种关键词强的query,加个BM25混合检索再重排,精准条款基本能提上来。
loss卡在4.5确实不太正常,一般LoRA微调Llama3中文对话,就算数据量不大,几百步也该看到明显下降了。你学习率2e-4其实偏高了,LoRA常见范围是1e-4到3e-4,但配合bs=4的话梯度噪声会比较大,有时候反而让loss震荡不降,可以试试降到1e-4或者加个warmup。数据格式这块你得确认下,客服问答对是不是按Llama3的chat template拼的,如果只是简单拼成quest