
一只小鹿不想加班日记
Lv.1白天解决问题,晚上整理笔记的小动物。关注技术学习与项目实践,主要分享学习路径整理、读书与思考和日常踩坑;关注技术选择背后的成本与边界。慢慢写,长期做,把有用的内容沉淀下来。
发表的评论
你这个问题我太有同感了,LoRA微调小模型做垂直场景,数据集和超参的影响比想象中敏感得多。5000条对话不算特别少,但10个epoch对7B来说很容易过拟合,loss 0.3看着低,实际可能把噪声也学进去了,建议先降到3-5个epoch试试。另外rank8配alpha16确实有点激进,尤其业务答案混在一起,可以试试rank4、alpha8,学习率降到5e-5。全量微调不一定更好,成本高还容易灾难性
试试先做query改写或HyDE,把用户问题里的“配置”动作拆细,再结合rerank过滤掉OSPF这种无关话题。
这坑我太熟了,当时也是被ConversationBufferMemory整得没脾气。你这个问题核心不在LangChain,而是你让原始对话历史直接进token,系统一长必然爆。我自己后来是换成混合方案,短期用Buffer存最近两轮保上下文连贯,长期用SummaryMemory定期把老对话压成摘要,然后手动拼接成新prompt传给LLM,这样既不会失忆也不会炸token。另外你调max_token_
我之前也踩过类似的坑,vllm的显存管理在量化模型上确实不如fp16那么稳,尤其是连续长prompt时KV cache会悄悄累积。你试试把gpu_memory_utilization降到0.7左右,然后加个--enforce-eager参数,能省不少显存,虽然慢点但至少不会OOM。另外确认下是不是用的最新版vllm,老版本对int4支持有bug。如果还不行,建议换llama.cpp的server模
采样参数没问题,这锅得扣给模型本身,微调过的指令模型对提示词敏感太正常了,换个说法输出崩不奇怪。
角色设定确实容易带偏,尤其是“资深主管”这种自带立场和表达习惯的角色,模型会忍不住往“专业报告”方向堆砌,反而丢了摘要该有的克制。我试过类似场景,加一两个few-shot示例比角色设定管用得多,直接给“输入-输出”对,模型就知道你要的颗粒度了。另外你可以试试把角色改成“严格遵循格式的编辑”,或者干脆不加角色,只把任务拆成“提取用户问题+提取处理结果”两步,效果可能更稳。
说实话,端侧模型那套补全响应确实快,但CodeBuddy改复杂代码更顶,俩都装不香吗? 上次用Trae写脚本,中文注释和OSS补全是真的顺,就是Agent模式有时候容易绕晕。
其实正常推理时no_grad影响不大,真要RL微调再单独包enable_grad就行,手写循环麻烦可以看看langchain或trl的Agent管线。
我们之前也踩过类似的坑,7B在24G卡上跑并发确实难受。你这场景其实不用纠结FP8,A10本身不支持,直接上两张卡张量并行性价比最高,vLLM开个tensor-parallel-size 2,显存翻倍的同时并发能力能好一截。prefill和decode分开优化的话,vLLM里可以调下--max-num-batched-tokens和--max-num-seqs,把prefill的batch调大点,
我们组之前也在这俩里面纠结过,最后选了Qdrant,主要是Milvus那套etcd加minio的运维成本在初期实在吃不消。百万级向量的话Qdrant用默认配置延迟大概在十几毫秒,加过滤条件也不至于劣化太多,但前提是得把payload索引建好。LangChain两边都有现成集成,不过Qdrant的API更清爽,调试起来舒服点。唯一担心的是社区热度,Milvus的issue响应确实快一些,但Qdran
试试把max_length固定成2的幂次,或者关掉动态shape那个选项,我之前也被这玩意坑过。 inductor后端确实玄学,回退到默认后端或者用eager模式过渡下吧。
我之前也踩过这个坑,7B模型本地跑和API差距确实明显,尤其qwen系列对system prompt的敏感度真的不如大参数模型。你试试把temperature调低到0.1-0.2,重复惩罚参数拉高一点,能缓解啰嗦和重复。另外上下文长度别设太长,我设2048反而比4096稳定,可能小模型注意力容易散。还有个小技巧,把“简洁回答”改成“用三句话以内回答”,带具体数字约束比抽象指令有效得多。
试试按标题和段落边界切分,再给每个chunk加上文档元数据,检索时用关键词过滤能救回来不少。
16G跑7B其实带宽是主要瓶颈,4080的显存带宽才600多GB/s,5-7 tokens/s差不多就是理论极限了。想降延迟可以试试把KV cache量化成8bit,或者用flash attention,llama.cpp最近几个版本对这两项优化挺明显的。另外如果只是内部API,可以开多进程并发处理请求,单请求延迟降不下来但整体吞吐能上来。VLLM对单卡小模型提升不大,主要优势在连续批处理,你这种
我试过把项目里的关键依赖和组件路径直接写进prompt,比如“用@/components/BaseTable,不要引antd”,效果比光说“用自己封装的”好很多。另外你提的角色设定挺有用的,我会开头加一句“你是我项目里的前端同事,熟悉我们的中后台代码规范”,它生成的东西就明显更贴实际。还有个小技巧是让它先列个实现思路再写代码,跑偏了能早点发现,不然等写完再改更崩溃。
建议用递归字符切分+按标题兜底,小chunk配个父文档召回,效果比单调token数稳多了。
PyTorch吧,部署这块现在TorchScript和LibTorch挺成熟的,而且工业检测圈子里PyTorch的预训练模型和资料明显更全。不过嵌入式要考虑推理框架兼容性,如果你之前Keras写惯了,转TF的TFLite可能上手快一些,关键还是看你目标板子支持哪个runtime。 我去年做过类似的活儿,最后是PyTorch训练转ONNX再量化,跑起来也没啥问题,就是中间调试算子挺费时间的。你不如
vLLM其实没你想的那么复杂,主要就是改一下模型加载方式和入口,但对ChatGLM3的支持确实有点坑。我建议你先把量化换成GPTQ或者AWQ试试,比Int4速度快不少。另外并发这块,可以试试把最大序列长度和batch size调小,A100 40G跑7B模型本来就不该贪多。 我之前也遇到过类似问题,后来发现显存爆掉很多时候是KV cache在作祟,vLLM的PagedAttention就是解决这
这问题太典型了,我也踩过同样的坑。主要矛盾在于faiss召回的片段虽然相关,但每个chunk的信息密度和逻辑连贯性参差不齐,LLM注意力有限,自然容易被噪声带跑。我后来是这么解决的:先看检索结果里有没有明显的关键词冲突,再在prompt里明确要求“按证据强度排序回答”,并且让模型先输出一段对每个片段的概括再综合,效果比单纯堆片段好很多。另外也可以试试把top-k降到3-5,有时候少而精反而靠谱,多
我试过类似情况,感觉思维链对复杂任务效果明显,简单任务反而容易失效,因为模型可能觉得没必要走推理。你可以试试把任务拆得更细,比如明确要求“先列出每个函数的输入输出,再描述调用关系”,这样它会更容易按步骤走。另外,配合一两个few-shot示例确实能提升稳定性,但示例要贴近你的实际场景,不然参考价值不大。还有个土办法,在提示里加一句“如果不按步骤推理,结果会被扣分”,有时候能逼它老实点。