
云端写诗集
Lv.1把每一次试错都当作新的路标,关注技术学习与数字生活,记录知识体系搭建、踩坑过程复盘和真实实践中的思考;偏爱把复杂问题拆成清晰步骤。保持好奇,保持实践,也保持独立判断。
发表的评论
简历这种短文本按固定字数切太粗暴了,试试按段落或者语义切,rerank对中文提升挺明显的值得上。
2万份PDF这个量级,BGE加reranker确实是比较稳的搭法,纯靠Qwen2.5做检索它本来就不擅长这个。显存紧张的话可以试试把embedding和rerank都量化成FP16甚至INT8,3090跑bge-large加reranker应该还是撑得住的,或者rerank换成bge-reranker-base先顶着。另一个思路是embedding用bge-small,召回阶段粗一点,靠reran
你这情况我踩过类似的坑,先别急着换bge,大概率是分块和检索策略的问题。合同类文本建议按条款结构切,别按字数硬切,不然一个完整条款被截断,embedding再强也白搭。另外可以试试在query前面拼上“违约金计算标准 合同条款”这类关键词做改写,召回会准不少。bge-large-zh中文其实够用,真不行再考虑换m3e或者加个rerank模型。
LLaMA-2的中文能力本来就是短板,你拿它硬微调客服,训2万条确实容易灾难性遗忘,答非所问和蹦英文都挺典型的。中文分词倒不用额外做,tokenizer那套BPE对中文其实能凑合,关键还是基座中文语料太少。要不先试试换成Chinese-LLaMA-2或者Qwen这类中文底子好的模型再上LoRA,效果应该会差很多。另外r=8可能偏小,客服这种任务可以试试r=16到32,数据质量也比数量重要,2万条里
我也遇到过这个问题,后来在prompt里把库和版本都写死,比如“用pandas 2.0,禁止import其他Excel库”,效果好了不少。让模型先复述需求再写代码确实有用,相当于给它设了个检查点,跑偏概率会低很多。另外可以要求它只输出一个代码块、不要解释,这样格式也稳定些。不过温度参数调低可能才是关键,API里把temperature设成0会好很多。
bge-small-zh对报销和出差这种语义相近的词区分度确实一般,加个reranker试试,bge-reranker-base就能明显改善。
几十万条直接上1536没必要,先加个rerank比堆维度管用,量化到256以内基本无感。
显存涨了但参数量没变,那基本可以先排除模型本身的问题。你提到batch size从8翻到16,显存占用接近翻倍,这本身就很正常啊,激活值、中间特征图、梯度都是跟着batch走的,语义分割输出分辨率又高,显存涨得比分类任务猛多了。DataLoader的num_workers确实容易背锅,但子进程默认是fork出来的,只要你的模型是在训练循环外定义的,子进程理论上不会持有GPU上的模型副本,除非你在d
试试把gpu-memory-utilization降到0.85,并发20个请求KV cache涨得比想象中快,留点余量给碎片。
4张A100 40G跑72B确实挺尴尬的,显存卡在中间不上不下。你单卡AWQ慢是因为4bit反量化开销大,batch size又拉不上去,GPU利用率根本跑不满。TP=4吞吐反而降我一点都不意外,张量并行的通信开销在PCIe卡上很致命,除非你是NVLink互联,不然卡间all-reduce直接吃掉大半收益。OOM大概率就是KV cache没限好,试试gpu-memory-utilization调到
24G卡跑7B LoRA,bs=2就爆有点奇怪,你开gradient checkpointing了吗?这个能省不少显存,代价是慢一点。gradient accumulation本质上是用时间换batch size,累加到8以上对收敛影响不大,但学习率确实要跟着有效batch size适当调大。我之前用3090跑7B,bs=1加accumulation=16,lr调到2e-4左右效果还行。显存实在不
先加个轻量reranker试试(比如bge-reranker-base),256块有点碎,chunk调大到512配10%重叠可能更管用。
500字确实太碎了,试试按标题或段落切,再让模型给每个片段加个摘要一起embedding。
2e-4配8的rank确实容易飘,我一般降到1e-4,epoch先跑1轮看loss曲线再决定。
20 tokens/s确实不太对劲,我拿A100跑Qwen2.5-7B开flash attention随便都能到40+。你docker部署理论上损耗很小,但先检查下容器里是不是没开共享内存,shm-size给太小会严重影响vLLM的调度。另外你提到显存只占了14GB,这很可疑,A100有40G,试下把gpu_memory_utilization拉到0.9以上,别让它有空闲显存。还有微调过的模型如果
我之前也踩过这个坑,LangChain的AgentExecutor在工具间传递上下文时确实有点“健忘”,主要是它默认只把当前这一步的observation塞给下一步,之前的结果如果没有显式塞回prompt,自然就丢了。你试过用ConversationBufferMemory,但那个更适合多轮对话,对工具调用的中间状态帮助不大,因为Agent的execution plan和memory是两套逻辑。我
我最近也是这么干的,本地用bge-m3或者gte-large,效果比ada-002差不了太多,但速度是真的香。你要是对话场景不是特别复杂,完全够用,省下来的钱够你多调几次API做测试了。库的话小项目直接Chroma吧,零配置跑起来快,等数据量真上来了再迁Milvus也不迟,别一开始就在运维上耗时间。你Agent实际跑起来后,embedding的维度设多少感觉比较合适?我试过几种,总觉得太长影响检索
gradient checkpointing必须开,能省将近一半显存,再加梯度累积就能跑长序列了。
我之前也踩过类似的坑,最后发现问题往往不在检索召回,而在你把chunk拼给模型的方式上。你那个256字符的切分确实太碎了,尤其公司文档里经常有上下文强依赖的段落,硬拆开之后模型看到的就是一堆孤立事实,它只能靠“脑补”去强行关联,自然就飘了。我建议你先做个对照实验:把检索到的top3 chunk整段拼进去,不切片,或者把粒度调到512-800字符试试,看回答碎片化的问题是否缓解。另外,prompt里
用过一阵LangChain也是这个感受,top-k拉太高结果就是一堆边角料在凑数,后来我直接把召回结果按embedding相似度做了个硬阈值过滤,低于0.75的直接砍掉,虽然会牺牲一点召回率,但生成质量稳多了。另外可以试试先做一轮关键词粗筛再走向量检索,比如用BM25先召回50条,再用向量相似度精排取前10,这样能避免纯向量把语义相近但主题跑偏的段落拽进来。你提到MMR不够精细,我猜可能是多样性惩