
网络今天稳定工程日常
Lv.1在系统报警之前努力保持冷静。主要研究网络技术,记录开发效率提升、问题排查与调试以及那些看似简单却很容易踩坑的问题。欢迎一起交流,也欢迎不同观点。
发表的评论
我一般不会死磕固定chunk size,而是按文档结构切,比如按标题或段落边界分,这样语义完整性比单纯512/1024靠谱得多。overlap我通常设10%到15%,太大反而会让重复内容干扰检索排序。判断语义是否完整,可以看切出来的块有没有孤立的代词或指代,比如“它”“这个项目”却没出现具体名字,这种就得合并。合同和技术文档确实差异大,合同适合小chunk保精度,技术文档可以大一点保上下文连贯。
256块切太碎了,语义容易散,试试先按段落切再叠个轻量reranker,bge-reranker-base就够用。
摘要压缩加独立记忆子Agent,我们线上就这么干的,比硬截断稳多了。
我也踩过这坑,后来把关键实体单独抽出来存成结构化记忆,每轮再拼回去,效果好很多。
LoRA微调7B在24G上确实挺吃紧的,batch size开到4基本不现实。你可以试试QLoRA,4bit量化加载底座模型,配上bitsandbytes和peft,显存能省一大半,我拿4090跑过类似配置,bs=2加grad accumulation基本稳。loss不稳可能跟学习率和warmup有关,LoRA一般1e-4到2e-4比较合适,warmup给个几十步。DeepSpeed ZeRO-2
我们之前也试过把MCP塞进训练循环,异步和DataLoader确实打架,后来干脆把工具调用拆到单独进程里,用队列跟主训练进程通信,卡顿会好很多。多卡场景下全局连接池基本是坑,每个rank最好独立管理自己的会话,不然并发一上来就互相抢。文档确实太薄了,多进程那部分基本靠自己踩,你可以先试试把请求批量化再喂给MCP,能省不少握手开销。
你这情况八成是召回阶段就没把对的片段捞出来,后面重排再牛也救不回来。建议先别急着上reranker,把top_k拉到50甚至100,看看那个正确片段到底在不在候选里。如果压根不在,那基本就是embedding或者分段的问题了,bge-large-zh对“违约金”这种词其实还行,但512字符带overlap容易把关键比例和上下文切散,试试按条款结构分。要是候选里有但排后面,那再考虑加bge-rera
合同场景我踩过类似的坑,问题大概率不在bge,而是你的chunk里混进了太多不同合同的内容。试试在分块前先按合同标题或编号做一次元数据隔离,检索时带上filter,比调top_k管用得多。另外“违约金计算标准”这种query太短,bge对短query确实容易飘,加一层query改写扩成“合同中约定的违约金比例和计算方式”会好很多。段落切分也别纯按字数,合同条款最好按条切,一条一块,不然半句话被截断
bge中文确实没吹得那么神,我试下来长文档chunk设500太小了,语义断得厉害,试试800到1000再加点重叠。
我也遇到过,感觉是模型默认觉得“简化”就是“更好”,根本不管类型语义。后来我在项目根目录放了个.cursorrules,明确写清楚“禁止修改已有类型定义,除非我主动要求”,情况好了很多。另外重构时可以先让它只输出diff思路,别直接改文件,确认没问题再动手。你现在是让它直接编辑还是先给方案?
3万轮数据不算少了,但LoRA微调Llama3中文确实容易这样,基座本身中文能力就偏弱,复杂多轮一崩很常见。你rank调到32都没用,我感觉更像是数据里多轮场景的覆盖不够,模型没学会追问和上下文承接。可以试试把LoRA挂到更多层上,或者换个中文底子好点的基座,比如Qwen,效果可能比死磕Llama3强。
我一般会把任务拆到“一次只改一个函数”这种粒度,然后把相关代码和类型标注都贴全,让它先复述约束再写。涉及类调用时,最好把接口签名和调用示例一起给,不然它真会自己脑补。另外别指望一次生成就能跑,我现在都是让它先写测试用例再补实现,报错率能降不少。
你这个问题我之前也遇到过,大概率不是Milvus索引参数的问题,HNSW调M和efConstruction主要影响召回速度和精度上限,但不会把“Python环境安装”这种语义差很远的结果拉进来。我建议先看看切块是不是把上下文切断了,比如“Python多线程”这段知识可能被拆到两个chunk里,导致每个chunk的向量都不完整。另外text2vec-base-chinese本身对短查询的语义区分度一
角色提示确实挑模型,我一般会先跑几组对比再定稿,别指望一套通吃。
你这情况大概率不是分块大小的问题,固定500切很容易把跨段落的逻辑切断,尤其是“和今年比”这种需要对比的时间信息。建议先把metadata里的时间字段抽出来做过滤,别急着换embedding,ada-002本身对中文语义还行。top_k调大反而更差说明噪声占比高了,加个rerank模型(比如bge-reranker)比换embedding见效快。
遇到过类似的坑,当时排查了半天发现是Milvus的索引状态没生效,你建完HNSW之后得手动调一下load_collection,不然查询时数据还在磁盘上没进内存,索引压根不会被触发,全量扫描就是这么来的。另外你说的“通过MCP调用”这个细节我觉得挺关键,如果MCP服务里每次查询都重新建立连接或者切换了collection,那可能索引就被绕过了,建议查一下查询参数里有没有显式指定一致性级别,有时候默
这情况太常见了,Cursor有时候确实会自作主张引入一些“最佳实践”的库,像pydantic-settings其实是为了帮你管理配置,httpx也是因为FastAPI的TestClient底层要用它。但问题在于它不跟你商量,搞得像在写自己的项目一样。我的建议是,跑不起来的时候先别急着装包,看下报错信息,如果某个依赖确实只在特定功能里用到,而你现在用不上,直接删掉import就行。我一开始也全盘接受
财报类文档建议先按表格和数字块切,再调高重叠比例,语义检索对精确数字天生不敏感。
遇到过,UNet++这种密集预测模型转TRT掉点基本都出在注意力模块和上采样路径上。SE注意力里的全局平均池化在fp16下精度损失会被放大,尤其遥感图像背景占比高,全局统计量稍有偏差就会让细线目标直接消失。建议先别急着上fp16,用fp32转一版看看Dice能不能回到0.93附近,如果fp32也掉,那就是图优化把某些层重排了,得用polygraphy逐层比对找出第一个精度突变的层。 另外op
vLLM对LoRA的动态合并确实有额外开销,尤其batch size小的时候更明显,你可以试试把lora权重提前merge进基座模型再量化保存,这样能省掉运行时合并的成本。另外gptq对微调后权重不友好这点我也遇到过,4bit量化本身就会放大激活值差异,建议换AWQ或者用FP16跑,显存14/24足够撑7B+LoRA。我自己之前同样配置下,merge后再量化推理速度能回到接近原版,你可以先验证下是