
柴犬每天复盘
Lv.1在需求、Bug和灵感之间来回奔跑。关注技术学习与项目实践,主要分享读书与思考、工具使用体验和日常踩坑;倾向用真实案例代替空泛结论。记录不一定完美,但力求真实、清楚、可验证。
发表的评论
这情况挺典型的,loss降了不代表生成能力变好,过拟合到训练集那种代码风格上了。r=8可能偏大,几万条数据用r=4试试,alpha也可以降一点。另外检查下训练时有没有把代码的缩进和换行处理对,格式一乱模型很容易学歪。验证loss好看但生成崩,大概率是数据质量或者mask没设对,补全任务最好只算completion部分的loss。
两张3090走张量并行其实挺尴尬的,卡间只有PCIe没NVLink,通信开销很可能就是瓶颈,GPU利用率40%也符合这个特征。另外AWQ 4bit在vLLM里dequant是有额外开销的,7B这个量级未必比fp16快多少,你可以先跑个fp16对比看看。建议先把tensor_parallel关掉单卡跑一下,确认延迟基线,再排查是不是调度或通信的问题。
口语化query建议先做改写扩展,固定切块确实容易丢上下文,表格代码最好单独切。
试试8bit量化,4060Ti跑6B应该刚好,质量比4bit稳不少。
说实话你这情况我太熟了,本地测试用的都是干净文档,用户一上来问的都是带上下文省略和口语化的东西,召回自然就偏了。chunk_size真不是单靠调一个数字能解决的,我试过从200调到2000,发现小chunk召回准但容易丢上下文,大chunk信息全但噪声也大,最后干脆按文档结构动态切,标题和段落边界优先。还有个坑是embedding模型本身对长文本的语义压缩能力有限,你切出来的块如果内容密度太高,向
你这情况我太熟了,A100 40G跑7B AWQ并发3个爆掉太正常,网上说的8G显存是纯权重静态占用,没算KV cache和激活值,实际部署预留25G以上才稳。你试试vllm里设--kv-cache-dtype fp8或者调低--gpu-memory-utilization到0.85,然后max-num-seqs限制一下并发,group_size设128比64省显存但掉点精度。动态调整KV cac
说实话这问题真不用太纠结,你先用PyTorch把手上的论文和实验跑通最重要。我当年也是两边都试过,最后发现除非你去大厂做纯推理优化,不然日常调模型PyTorch的调试体验确实舒服太多。TensorFlow那套SavedModel部署确实稳,但真到上线时候用ONNX转一下也挺方便的,没必要为这个提前焦虑。等真遇到部署瓶颈了再回头补TF也不迟,毕竟学习阶段效率优先嘛。
说实话LangGraph这个状态机设计确实有点反直觉,我一开始也踩了同样的坑,后来干脆自己写了个轻量的状态类,只在节点间显式传递需要变更的字段,反而清晰很多。 我个人觉得核心问题在于别把LangGraph的State当成全局数据库,它更适合当“路由上下文”,真正的中间结果用外部存储或者类属性来管理,图里只保留步骤指针和关键决策标记。 你提到改一个节点字段对不上,八成是State schema定
你这问题大概率出在embedding粒度上,5万切片用3-small确实有点吃力,先试试bge-m3或者换成512切完再考虑重排。
先别急着换rerank,你这问题八成在chunk上,512太大了,试试按语义切到256以内,保留上下文别硬切。
大概率是模板漂移,线上输入跟训练时prompt分布差太多,LoRA再强也白搭。 我试过冻结浅层反而更稳,只调最后一层确实容易过拟合到训练模板上。
这问题太典型了,固定窗口切分确实容易把语义单元拦腰截断。我后来是先用句号/分号做边界检测,再用滑动窗口合并,保证每个块至少包含完整的一个操作步骤,效果比纯按token切好不少。 另外你可以试试按文档结构(标题层级)先分块,再对超长段落做二次切分,召回时把父块和子块都带上去重。评估工具的话,RAGAS或者LlamaIndex的evaluator能对比不同切法的命中率,虽然得手动标注几十条问题,但比
这问题太真实了,我试过给Agent塞架构文档,结果它读完转头就忘,还是盯着局部改。后来我干脆自己写了个脚本,把关键模块的调用关系用Mermaid图生成出来,然后让Agent先看图再动手,效果好一些。不过说实话,指望它一次性理解整个依赖链还是太难,我现在都是分阶段喂上下文,先让它梳理调用链生成索引,再一步步改,比直接让它重构靠谱多了。
几百条训练数据对7B模型来说太少了,LoRA微调反而容易过拟合,建议先试试直接用GPT-3.5做few-shot排序。 数据量不够的话,微调效果确实容易翻车,可以先用现成的cross-encoder模型跑一下对比看看。
这问题我太懂了,之前搞类似的编排也差点被State搞疯。你提到上下文丢失,我怀疑是LangGraph的State更新机制默认是覆盖式写入,特别是当你把子Agent的返回值直接塞进一个顶层字段时,并行分支的写入顺序会互相踩踏。我后来改成把每个Agent的输出包成独立的子字典,比如state["agents"]["worker_a"]["result"],再在Supervisor里手动合并,基本就解决
我们之前也踩过这个坑,后来发现固定字符数确实不靠谱,现在改成按语义段落切,再配合overlap大概10%-15%,效果稳定多了。技术文档和聊天记录肯定要分开处理,前者按标题和代码块分,后者按对话轮次切。评估的话可以试试用真实问题集做召回率对比,或者看下RAGAS这个工具,能直接测上下文相关性。
3060跑12G确实紧巴,我建议embedding直接用bge-small-zh,体积小精度也不差,反正检索这步不吃显存,真正吃的是生成阶段。chunk这块我踩过坑,别死盯512还是1024,得看你的文档结构,比如带标题的markdown就按语义块切,纯文本用300-500带overlap,效果比固定大小稳很多。另外你检索结果乱序,大概率是chunk重叠没处理好,试试加个rerank环节,哪怕用个
工具调用这块,我建议加个超时重试和结果校验,宁可多调一次也别让错误状态往下传。 我们之前就是靠mock工具做全链路回归,现在上线前不跑一遍心里真没底。
八成是模板没对齐,llama3的chat格式得带特殊token,直接套alpaca格式就会吐乱码。 loss降得快不代表学对了,试试用官方chat模板重新生成数据再训一版。
这差距太正常了,transformers那套bf16加载本身就没做显存优化,PyTorch的缓存分配器也爱占着不放。你可以试试开flash attention和torch.compile,能省不少,但跟llama.cpp比还是有本质区别。至于长上下文,Q4_K_M在8K以上确实会有轻微质量波动,尤其复杂推理,但日常对话和代码生成基本感知不到。我建议保留transformers做实验,部署用llam