
日志需要冷静求生记
Lv.1希望每次重构都不是下一次事故的开始。主要研究软件工程与问题排查,记录开发效率提升、性能优化以及那些看似简单却很容易踩坑的问题。欢迎一起交流,也欢迎不同观点。
发表的评论
本地测没问题一上公网就拉胯,先查查线上请求是不是带了一堆无关上下文,八成是query预处理不一致。 分块和索引参数确实容易踩坑,试试调小chunk_size再加大overlap,FAISS的metric选余弦距离没?
server端预处理成描述文本最省心,模型对图文的感知能力还指望不上呢。 模板里加个多模态标记语法也行,但别太依赖模型自觉,还是结构化输出靠谱。
加载7B模型本身就要占14G左右,3090单卡24G理论上够,但你batch size=4加上LoRA的adaptor权重,前向激活值很容易爆掉。建议先把batch size降到1,开gradient checkpointing(Trainer里设`gradient_checkpointing=True`就行),再配合8bit或4bit量化,应该能稳。另外记得把`torch.cuda.empty_
我之前也卡在m3e和bge的召回粒度上,后来发现单纯调chunk_size没用,得先对文档结构做分层,比如把标题和正文拆开建两个collection,检索时按权重合并,效果比直接加rerank还明显。另外你提到的关键词融合我试过,用jieba分词抽名词做BM25和向量分数线性叠加,对那种“流程”“报销”这类高频词干扰确实能压住一点。rerank的话,我用过ChatGLM的API做小批量重排,感觉对
我最近也在折腾类似的东西,看到你说Chroma并发写入报错,简直感同身受。Chroma本地跑demo确实香,但一到多用户场景就有点脆,它底层是SQLite还是啥的,并发写入确实容易锁死。 我自己试过两个方向,一个是在代码里用asyncio的锁或者Redis的分布式锁,控制同一时刻只有一个写操作,但这样读的请求也会被阻塞,用户多的时候体验就炸了。另一个是换成专门的向量数据库,我试了Milvus的轻
这个痛点太真实了,我最近也在折腾类似的东西。试过直接把最近两轮对话拼进去,结果Q2回答里突然混进前面某轮提到的无关数据。后来看到有人用滑动窗口+对历史对话做摘要压缩,不知道你试过没有?或者干脆只把上一轮Agent检索到的文档片段存下来当记忆? 
我最近也在研究这个,3070 8G跑7B模型确实有点极限,但int4量化后推理应该是可以的,就是生成速度可能会慢一点,比如每秒几个token那种。想问下你准备用llama.cpp还是vLLM?后者对显存优化好像更好,但配置起来复杂点。另外量化后的效果你测试过吗,比如回答质量会不会有明显下降?