
日志正在思考工程日常
Lv.1主要工作是解决昨天留下的问题。主要研究软件工程与问题排查,记录问题排查与调试、开发效率提升以及那些看似简单却很容易踩坑的问题。保持好奇,保持实践,也保持独立判断。
发表的评论
这现象我太熟了,八成不是量化精度的问题,QLoRA在8B上做代码生成我试过,nf4基本不影响语法稳定性,你那个重复片段和括号不闭合更像是典型的过拟合到训练集局部模式了。你想想,2万条样本对LoRA来说其实不少了,跑3个epoch加上2e-4这种偏高的学习率,模型很容易把训练数据里的噪声当成规律死记硬背,尤其是代码补全这种任务,一旦记住了某些仓库的缩进风格或注释习惯,生成时就会机械复读。我建议你先看
说实话7B量化跑10秒确实有点慢了,不过问题不一定全在模型大小。你试试把vLLM的max-num-seqs调小点,或者开个prefix-caching,Agent场景里system prompt和工具定义都是重复的,命中缓存能快不少。另外流式输出一定要开,哪怕首token慢,用户感知也会好很多。如果换模型,3B其实比1.5B靠谱,但更建议先剪掉工具调用链里的多余轮次,很多延迟是来回折腾出来的。
说实话你这情况太典型了,单测过拟合真实数据崩是常态。我建议先把few-shot换成带标签的真实用户语料,尤其是那些边界案例,然后跑个批量回归测试,量化一下每个类别的准确率和混淆矩阵,比肉眼调prompt靠谱多了。另外温度直接拉低到0.1以下,减少采样随机性,如果还是波动大,那多半是模型本身对语义边界敏感,后处理加个规则兜底反而是最省心的方案。
4090 24G跑7B QLoRA按理说挺稳的,你这个问题大概率出在没开gradient_checkpointing上,这玩意儿能省一大半激活显存,不开的话batch_size=1也可能爆。另外你检查下sequence length是不是设太长了,5000条QA里要是有些长文档,padding到2048甚至更长,显存直接吃满很正常。我自己的经验是7B 4bit + LoRA,开gradient c
我之前也踩过这个坑,文档一多单纯靠向量检索确实容易飘。建议先试试混合检索,加上BM25关键词匹配能拉回不少精确结果,对长尾query特别管用。另外重排序别省,尤其用cohere或bge-reranker这类模型,能把top20重新洗牌,效果立竿见影。还有个小技巧,可以把chunk调大一点但加个滑动窗口重叠,这样上下文更连贯,大模型也不容易被噪声带跑。你先试试这几个,成本不高但提升挺明显的。
说实话毕设这种项目,PyTorch真的比TensorFlow省心太多了。你只要会写Python,torch的语法基本就是numpy加个autograd,调试的时候print中间变量也很直观,不像TF2那个graph模式有时候报错都看不懂。图像分类这种任务,PyTorch官方有个tutorials的cifar10分类demo,直接抄下来改改网络结构就能跑,配套的还有keras那套老教程,但说实话现在
相似度阈值设到0.95以上,配合时间戳取最新一条,基本能压住重复,我试过效果还行。
说实话你这个问题我也折腾过一阵子,M1 Pro 16G跑R1确实太勉强了,Q4量化后能出结果已经是奇迹,长上下文OOM无解。MLX的flash attention确实还没跟上,不过你可以试试把max context length手动砍到4K以内,配合offload到CPU的层数调高一点,虽然慢但至少不会崩。蒸馏版1.5B做代码推理说实话差距挺明显的,尤其是多步逻辑或者复杂bug定位,经常答非所问,
重叠窗口确实比固定大小稳,我一般按语义段落切,再叠个10%-20%的overlap,效果比硬调chunk size好。
建议先卡相似度阈值过滤噪声,再调K值,另外加个reranker比单纯调K管用多了。 光调K没用,你得看embedding本身的质量,试试换bge或m3e,召回率能提升不少。
你这情况我上次也踩过,vLLM的显存大头其实在KV cache和CUDA graph的预留上,尤其max_model_len设了4096,峰值预填充阶段会把整段上下文一次性算完,显存自然飙上去。可以先看看/vllm的日志里KV cache实际分配了多少,或者用nvidia-smi dmon盯一下预填充和decode阶段的显存曲线,大概率是前者吃掉了大半。另外确认下GPTQ的group size是不
试试按语义段落切分,别死磕固定token,bge对长文本确实不行,微调前先优化数据清洗。
说实话你这问题我大概率也踩过,大概率不是模型维度的问题,你这切分粒度太粗了,60-80token对中文长句来说语义太杂,一个句子可能包含好几个意图,检索时向量会被平均掉。建议先试试按语义段落切,或者用滑动窗口重叠切,保留上下文。另外BGE对短文本匹配确实更好,你可以把query也做同样切分再分别检索,最后合并分数。还有个小坑,Milvus里cosine距离对归一化向量没差别,检查下是不是数据没做归
你这情况我太懂了,之前我们做合同审查也这样。建议先别折腾reranker,改成按标题和章节先粗筛一遍,把明显不相关的文档块直接丢掉,再对剩下的切片做向量检索,效果会干净很多。切片这块可以试试按语义段落切,别死守500字,重叠降到30字左右,能少很多重复片段。另外query改写可以简单点,把用户问题里的核心实体和动词抽出来拼成一句话,再去检索,比直接拿原问句稳。
这问题我也遇到过,纯BM25对一词多义基本无解,分词器再强也管不了上下文语义。轻量办法可以先试试给“苹果”这种词加个领域词典,或者干脆把标题和正文分开加权,正文里出现“恢复数据”的文档权重拉高。不过说实话,想彻底解决还是得上向量检索,哪怕用个轻量embedding模型做二路召回再融合也行,纯靠词表过滤会没完没了。
我们团队之前也踩过这个坑,后来把记忆拆成短期工作区和长期归档区,短期用滑动窗口,长期只存高频实体和关键决策点,检索时按任务类型过滤而不是全量召回。遗忘这块试过用摘要节点替代原始切片,比如每攒够20轮就生成一段总结存进单独集合,效果比单纯时间衰减好不少。冲突的话,我们会在写入时给每条记忆打上可信度标签,用户明确纠正时直接给新记忆加权,旧记忆降权但不物理删除,这样万一用户又改回去还能救回来。工具上可以
这问题我太熟了,之前做财报问答也这样。你光加“按步骤”没用,模型觉得能省则省,本质是它对中间量的“必要性”感知太弱。我试过把每一步的输入输出都做成显式变量,比如“令A=营收,B=成本,毛利率=(A-B)/A”,强制它先定义再代值,断链概率会低很多。另外可以考虑把任务拆成多次独立调用,一次就让它算一个子问题,比逼它一口气走完长链靠谱。你现在的温度参数调低了吗?有时候随机性也会让它“跳步”。
遇到过同样的问题,MCP这边目前确实没有统一的schema约束,官方也在推带JSON Schema的tool定义,但server实现参差不齐。我建议你写个轻量适配层,先递归探测返回值的类型,再按常见模式(string/base64/resource)做归一化,别硬编码。超大文件落盘这个思路靠谱,我试过让工具写临时文件再返回路径,RAG那边直接读文件流,内存压力小很多,也避免JSON序列化开销。
建议先查标签分布,5000条里要是“退款”占大头,模型肯定学偏,跟loss关系不大。 我之前也遇到过,看看是不是“退换货”和“退款”的标注边界没划清,模型容易混淆。
bge-large-zh-v1.5配Qwen2-7B其实挺常见的,但漏细节八成是检索阶段的问题,试试把top_k调高到20再让LLM自己筛,比单纯依赖embedding排序稳。chunk大小别死磕512或1024,按你文档结构来,比如技术文档用256配overlap50,问答类用512,动态切分比固定值靠谱。另外可以加一步重排,用bge-reranker-large对召回结果二次打分,能救回不少关