
周末运维小站
Lv.1主要整理系统运维相关的学习笔记与工程经验,内容覆盖系统稳定性治理、故障复盘。坚持先理解原理,再讨论工具,希望把复杂问题讲清楚、把实践步骤写完整。
发表的评论
vLLM的gpu_memory_utilization调低点,再限制max_num_seqs,小流量能顶住。
两张4090跑7B LoRA按理说不至于几百步就炸,先看看是不是max_length设太大了,长序列的激活值很吃显存。4bit量化loss偏高挺常见的,可以试试bnb_4bit_compute_dtype设成bf16,再配合gradient_checkpointing,能好不少。ZeRO-2双卡收益确实有限,但开个offload能救急,就是慢。新手的话1.8B其实挺香,跑通了再上7B,别一上来就硬
这个问题其实挺典型的,我也踩过类似的坑。我感觉核心原因不在prompt,而在于反爬本身是个动态对抗的过程,AI拿到的训练数据里那些方案早就过时了。你让它加随机UA、处理异步加载,它生成的代码逻辑上没错,但目标网站的校验策略可能已经升级到检测TLS指纹、行为轨迹这些层面了,AI根本不知道。我现在的方式是把AI当成一个快速写模板的工具,具体绕反爬的策略自己来分析,比如先手动抓包看接口参数怎么生成的,再
我现在是俩都留着,但用法分得很开。Copilot当打字机用,写测试、补全、改命名这些它最顺手,基本不用动脑子。Cursor我主要拿来啃老项目,让它先读几个关键文件再问重构方案,比Copilot那种只盯着当前文件的思路靠谱多了。不过Cursor有时候改着改着会自作主张动别的文件,得盯着点diff。你要真是长期维护一个大项目,我倾向Cursor当主力,Copilot当辅助,反过来会很难受。
我之前也踩过这个坑,bge-small在垂直领域真不太行,换bge-m3或者fine-tune一下效果立竿见影。相似度分数别太当真,向量检索本身就是模糊匹配,加个rerank(比如bge-reranker)能明显压掉无关结果。纯prompt拼接在数据量小的时候确实能打,但一上百页文档延迟和成本都扛不住。建议先换嵌入模型再上rerank,别急着调Milvus参数。
vLLM和TensorRT在推理场景基本够用了,torch.compile除非你要抠那点性能,否则真不用强求。
先按标题切再embedding试试,固定字符切确实容易把语义切碎。粗召回加重排挺有必要,bge配cross-encoder效果会好不少。
说实话你这个情况我太熟了,之前做过类似的法律文档问答,也是bge系列,症状几乎一模一样。我后来排查下来,问题大头其实不在embedding模型本身,而是chunk切分把“合同违约金”这种关键条款的上下文给拆碎了,尤其法律文本里经常前面定义后面解释,512的窗口看着够用,实际语义跨度根本接不上。你调到256稍微好点也印证了这点,但更本质的问题是切分策略太机械,没考虑段落和条款的边界,建议你试试按文档
8G跑1B还OOM确实有点反直觉,但你试试把batch size降到1,然后开gradient accumulation,等效batch保持2就行。另外检查下是不是max length设512但实际padding太多,可以开dynamic padding或者把长度砍到256试试。
之前我们也是纠结了半天,最后上了Milvus的托管版,省心不少,但要是纯自己部署确实K8s那套够喝一壶的。Pinecone延迟和召回确实稳,但数据涨上去账单也涨得肉疼,得算好长期账。中文场景主要看分词和embedding模型,跟库本身关系不大,倒是Qdrant那个过滤性能在几百万量级上挺能打,你可以拿自己数据跑个benchmark看看。
5000条数据直接全量微调7B确实容易灾难性遗忘,建议试试LoRA或者QLoRA,冻结原模型只训低秩适配层,通用能力能保住不少。混合比例的话,通用代码数据最好占到训练集的70%以上,你这个量级可能还不够。关于MCP工具误触发,多半是prompt里工具描述的语义边界没划清楚,可以在system prompt里加一条硬性规则,比如“仅当用户显式提到审查、静态分析等关键词时才调用工具”,比单纯靠微调约束
说实话这个问题我踩坑踩了快两个月,最后发现chunk size真不是单独调的,得跟你的检索策略绑在一起看。比如我用的是父子分块,小chunk拿去匹配,但返回给LLM的是它所在的父块,这样既保住了语义聚焦又不会丢上下文。你可以试试先把200字的块做召回,然后通过索引映射到500-800字的原文段落去生成答案,效果比单纯调大小稳很多。 另外你说重叠切分没用,我猜可能是重叠量没跟上模型窗口的语义粒度,
可以试试把量化放在KV cache上而不是权重上,比如用KV cache量化+FP16权重,显存占用能压到12G左右,代码质量损失比全模型量化小很多。另外vLLM新版本支持FP8,3090虽然不支持硬件加速但能跑软件模拟,效果接近FP16,你可以对比下。如果还是不行,就切Qwen2.5-Coder-7B的FP16吧,代码场景下7B的FP16比14B的4bit靠谱。
这问题我太熟了,十有八九是MCP把query预处理那层给吞了,比如本地pipeline里可能做了query改写或者去噪,封装成tool后模型直接拿原始问题去检索了。你可以先抓一下MCP实际传进检索函数的参数,跟本地跑的对比下,大概率能找到差异。另外tool描述里最好把检索意图、关键词权重这些写明确,不然模型瞎猜参数确实会掉点。
跨章节的问题确实不是单纯调chunk能解决的,你这情况更像是检索粒度跟问题粒度不匹配。500字对单点事实够用,但“预算+负责人”这种多实体关系,信息被拆散后向量相似度自然就稀释了。我建议先试试按语义段落切,别死守字数,同时把标题和章节号作为元数据塞进chunk里,检索时做一下过滤。另外bge-large-zh对通用领域还行,但你们内部文档如果术语密度高,还是得考虑微调或者换领域预训练模型。rera
我最近也在搞类似的RAG,试了一圈感觉核心问题不是query还是context,而是few-shot本身要模拟“看完资料再作答”的那个推理过程。你第一种写法模型确实容易偷懒,第二种又太死板。我现在是把示例里context写成跟用户问题无关的通用事实,比如“某产品说明书第3节提到保修2年”,然后让模型学会从这种不相关的资料里挑关键信息,效果比直接给答案稳一点。不过换领域还是得重调,你试试在示例里加一
正常,bge-large对短query和长文本的语义对齐本来就不稳,试试先BM25粗排再向量精排,或者把chunk切小到200字。 向量召回吃的是整体语义,512字太长把关键信息稀释了,混合召回基本是RAG落地标配,别迷信单一方案。
本质就是在调模型对任务的“先验概率”,换场景失灵太正常了,先拆解badcase再动模板吧。 说白了就是概率分布拟合,跟你数据集分布强相关,few-shot得选和线上分布接近的样本才有用。
说实话我也踩过这个坑,Qwen2.5对system prompt的服从性确实不如闭源那么稳,但比你想的好救。问题大概率出在“角色设定”和“任务约束”混在一起了,它容易在长上下文里丢失优先级。我试过把“你是客服”这句话在每轮用户输入前重复一次,或者干脆把system prompt里那句改成“以下所有回复必须遵守:1.自称小助手 2.语气亲切 3.不超过50字”,效果会稳定很多。few-shot放两三
bge-large-zh对数值型内容确实不算友好,但更可能的问题在chunk切割上——Q3这种时间词和销售数据如果被切到不同块,语义关联就断了。多模型融合我试过,效果提升不稳定,还增加延迟,不如先试试把文档按表格/段落结构切,或者加个关键词检索兜底。另外你有没有试过把用户问题做一次改写再检索?对这种带限定词的query有时候挺管用。