
日志拒绝内耗观察员
Lv.1接口可以超时,学习和复盘不能停。主要研究软件工程与问题排查,记录开发效率提升、开源工具使用以及那些看似简单却很容易踩坑的问题。记录不一定完美,但力求真实、清楚、可验证。
发表的评论
14B在24G上跑代码补全,量化掉点确实挺难受的,代码任务对精度比聊天敏感不少。你可以试试Q6_K或者AWQ的8bit,显存可能刚好卡住,但质量能救回来一些。另外补全场景其实可以换7B的FP16,速度和质量平衡反而更好,不一定非要硬上14B。还有个偏方是用14B的Q4做draft,FP16的7B做verify,搞个投机解码,显存和效果都能兼顾。
JSON传tensor确实坑,序列化开销很大,换二进制流能省不少。MCP tool call默认是同步的,也可能是瓶颈。
我一般会在项目根目录放个AGENTS.md或.cursorrules,把已经定下来的设计决策、命名习惯、输出格式都写进去,Agent每次会先读这个,改动就不会太离谱。另外迭代时别让它重写整个文件,直接说“只改xxx函数,其他别动”,比笼统提需求稳很多。说实话这类工具确实更适合从零生成,真要长期维护还是得自己控制改动范围。
双3090跑7B和13B按理说显存不该这么紧张,你爆显存大概率不是模型权重本身的问题,而是Agent场景下KV cache随多轮对话和工具调用不断膨胀导致的。量化方面我个人觉得GPTQ/AWQ比bitsandbytes的8bit靠谱不少,后者精度掉得确实明显,尤其多轮推理时容易崩逻辑,换AWQ试试,4bit下质量保留比你想的好。框架上vLLM和TGI确实更偏静态批处理,Agent这种频繁插函数调用
你这个“相关但不精准”的描述我太有共鸣了,之前做类似项目也卡在这一步。500字一刀切其实挺容易把“配置GPU环境”和“安装CUDA”这种上下文紧挨着的内容切到不同块里,检索时反而会偏向某个局部片段。bge-large-zh本身对中文语义是够用的,但它对块内信息密度比较敏感,块太碎或者太长都会让向量表达偏掉。我建议你先别急着换模型,拿几篇PDF手动看看切出来的块,大概率能发现有些块开头结尾都是半句话
pgvector这情况我踩过,大概率是HNSW索引在过滤时的坑。它的图结构搜索会先按向量距离跳,filter只是后置剪枝,被过滤掉的近邻会让搜索路径断掉,返回的结果自然就飘了。可以试试开pgvector的iterative scan,或者干脆先按条件把候选集缩到小范围再走精确检索,5万条数据量其实扛得住。Milvus的话看看能不能用partition加filtered search,效果会稳不少。
这问题我踩过,ReAct的判断步骤太依赖语义了,不如把“系统有没有该字段”直接塞进工具返回里让它看。
这个坑我前段时间也踩过,说实话大概率不是prompt的问题,而是训练数据里工具调用的格式本身就不够规范。你提到的location写成“北京”而不是“city:北京”,其实就是模型没学会把自然语言槽位映射到schema定义的字段结构上,这种情况光靠调prompt很难救回来。我当时的做法是把每条训练样本里的tool_call都严格按JSON Schema重新对齐一遍,尤其是参数名和类型,确保模型看到的
按目录切太碎了,试试按API接口粒度重组,再给每块挂上模块名和版本号过滤,旧文档就不会来捣乱。
几十万条单机用Chroma就够,metadata过滤where完全能扛,别一上来就Milvus。
是不是训练集里assistant开头老爱复述问题?试试把这类样本删掉再训。
这个问题我之前做内部知识库也踩过,感觉不完全是embedding的锅。bge-m3本身中文检索能力挺强的,但企业文档里“报销制度历史版本”和“报销流程”这种,字面重合度太高了,向量空间里天然就挨得近,换个模型大概率还是会有。我比较建议先看看你的元数据设计,比如文档类型、生效状态、版本号这些有没有带进索引,检索时直接加一层filter把历史版本或者已作废的排除掉,往往比换模型来得快。另外你提到top
我之前也踩过这坑,后来发现关键是别一次把啥都塞进去,先让它出个骨架,确认字段和结构对了再补分页、搜索这些交互逻辑,改起来反而快。空状态和loading这种细节可以在补逻辑那一步单独强调,或者直接说“参考antd的Table写法”,它一般就不会漏。全堆一段里描述,它容易顾此失彼。
7B量化版确实有点吃力,尤其在多步逻辑和异常处理上容易糊弄。我本地也跑过类似的,感觉Coder系列更擅长补全和局部改写,从零生成复杂脚本还是得靠大参数模型。你可以试试把需求拆成小函数逐个生成,再手动串起来,比一次性要整段代码靠谱不少。另外Ollama下可以调低temperature,对减少变量名混乱有点帮助。
加个“输出格式示例”往往比堆描述管用,模型照着抄比听你讲更靠谱。
vLLM的gpu_memory_utilization调低到0.85试试,KV cache别让它默认吃满,另外AWQ实际权重确实11G左右,8G那是理论值。
第二张卡没吃上显存,基本就是tp没生效,可以看下日志里world_size是不是还是1,有时候vllm版本和环境变量会坑你一把。22G单卡占用其实挺正常的,gpu-memory-utilization=0.9就是把卡几乎占满,不是按模型实际需求分配的,KV cache会把你给的额度全吃掉。速度20 tokens/s偏低,先确认是不是单卡在跑,tp=2正常能到40以上。长上下文我这边SGLang的r
试试把opset降到11,YOLOv5里SiLU在12上经常出精度问题,我上次也这样。
我遇到同样的问题,感觉模型就是被训练成默认带注释的,光说“不要注释”权重不够。后来我在prompt末尾加一句“只输出可执行代码,任何以#开头的内容都视为错误”,效果好了不少。另外给示例代码时最好把注释全删掉,不然它会模仿。实在不行就生成后用正则把#行过滤掉,比跟它较劲省心。
改写这步不是万能的,我也踩过类似的坑。GPT-4改写后经常会把原句里的关键实体或限定词丢掉,或者换成它自己脑补的近义词,反而跟知识库里的表述对不上。建议你先固定检索测试集,对比原始query和改写query各自召回了哪些文档,看看是改写引入了噪声还是丢了信息。另外bge-small对这种语义漂移挺敏感的,可以试试改写后跟原query做混合检索,或者干脆只在query太短太口语时才触发改写。