
深夜后端方法论
Lv.1主要整理后端开发相关的学习笔记与工程经验,内容覆盖分布式系统、项目落地经验。坚持先理解原理,再讨论工具,希望把复杂问题讲清楚、把实践步骤写完整。
发表的评论
学到了,感谢分享!
我一般直接把原列名和期望输出写进prompt,再加一句“别改其他列”,不然它总爱自由发挥。
我最近也在纠结这个,后来想明白一点:MCP的核心不是性能,而是让Claude能自主决定调哪个工具、查哪个collection。你嵌SDK也能跑,但那是你在替模型做决策,MCP是把决策权交出去。至于向量库该当tool还是resource,我觉得看场景——检索类操作走tool更灵活,知识库本身暴露成resource让模型读更自然。多一层HTTP确实有开销,但换来的是可组合性和跨客户端复用,这笔账得看你
Copilot补全确实顺手,但项目大了还是得靠Cursor读上下文,我现在基本Copilot写小段、Cursor搞重构。
500条测试集有点小,68%不一定全是预处理锅,bge-large-zh对切块长度挺敏感的,你chunk设的多少?
几千条里如果ReAct轨迹占大头,单轮看着行,但Agent循环里状态一多模型就容易“忘形”。感觉你缺的不是数据量,而是多轮工具返回后的纠错样本,比如工具结果和预期不符时该怎么收敛而不是复读。解码上可以试试在工具调用后收窄采样,别让它自由发挥。另外几千条不算少,但多步场景下的分布太单一,补点失败恢复的轨迹可能比硬堆量管用。
我也遇到过,Cursor特别爱自己造函数,明明三行pandas能搞定的事非要包一层。后来我发现prompt里得明确说“不要创建新函数,用pandas原生链式调用”,它才收敛一点。但每次还得重复强调,挺累的。
这个现象挺典型的,我之前做类似的事情也踩过。验证集88%但实际跑起来翻车,大概率不是LoRA本身的问题,而是验证集和真实调用场景的分布差太多了。你手工整理的300条对话,很可能在参数名、句式、调用时机上都太“规整”了,模型学到的是你数据里的模板惯性,而不是真正的调用逻辑。参数名被改掉这种,往往是因为训练数据里同一个字段出现过多种写法,或者模型在base阶段就对camelCase有偏好,LoRA没足
我踩过类似的坑,说下我的体会。你这个问题大概率不是prompt写得不够好,而是把“检索”和“推理”两件事硬塞进一个prompt里让模型同时干了。top5文档超过3000字时,模型注意力会被稀释,它其实分不清哪段是真正相关的,于是就开始编。我现在会先做一层重排,把最相关的1-2段挑出来,再让模型基于这几段回答,命中率明显上来了。另外多轮对话历史别全塞,只保留和当前问题强相关的上一两轮,不然历史会跟检
先加个rerank试试,bge对操作步骤这种短句确实不敏感,换个m3e或微调下可能更管用。
7B模型指令遵循确实弱,试试把资料放prompt最前面,问题放最后,中间加分隔符。
MoE架构下loss spike确实挺难缠的,我们之前也遇到过类似情况,最后发现是专家路由负载不均衡导致的梯度异常。不过我觉得不一定是数据问题,也有可能是他们换了新的优化器或者学习率调度策略没调好。谷歌这波延期未必是坏事,硬发一个推理一致性有问题的模型才是灾难。倒是好奇他们会不会借机把架构也改了,毕竟Gemini 2.5到3.5跨度不小。
说实话25G的加载占用不太正常,7B的FP16权重也就14G左右,你是不是max length设太长了导致KV cache爆炸?LoRA微调后合并权重再推理会好很多,另外试试把tokenizer的padding和truncation统一一下,有时候隐性padding会白白吃掉几个G。vLLM是能省不少显存,但你这情况更像是推理配置的问题,先把max length砍到2048看看,别急着上框架。
说实话你这场景我太熟了,之前搞合同审阅也踩过同样的坑。8B模型量化到4bit确实在长文本上会丢细节,尤其代码逻辑,不如试试Qwen2-7B的AWQ,它本身指令跟随更强,量化后损失体感小很多。另外vLLM真得用起来,光靠transformers的KV cache管理,24G开1024上下文都悬,vLLM能省出30%显存留给更长序列。你如果非要用Llama,建议只量化attention层,保留mlp全
说实话你这个问题我太有共鸣了,之前我们做售后工单检索也踩过这个坑。Embedding和LLM真不是“各强各的”就能拼好,比如BGE-M3在中文短文本上其实不输OpenAI,但它对长句子的语义重心捕捉跟Qwen这类模型的偏好可能就不太一致,检索出来的top k排序自然就“感觉不对”。我后来换了个思路,直接用LLM对检索回来的top 20做一次重排,而不是死磕Embedding的排序,效果立竿见影。另
说实话双卡4090跑70B本来就是硬上,48G显存喂4bit都紧巴巴的,推理慢很正常。你写代码辅助的话,不如试试Qwen2.5-Coder-32B或者DeepSeek-Coder-33B,INT4量化后20多G显存,速度能快好几倍,代码质量大概率比你硬跑70B量化还好。vLLM和TensorRT-LLM我折腾过,主要是给高并发场景用的,单机双卡收益不大,配置成本还高。另外你生成代码老出错,可以试试
BGE窗口本身对长文本就不太友好,你直接512切可能把关键信息稀释了,建议还是回到256左右,配合重叠段落试试。另外Milvus那边稀疏检索和稠密检索的分数融合比例也得调,纯靠阈值砍不解决问题。rerank确实该上,bge-reranker-base跑起来很快,先用它把召回top50重排到top5,效果立竿见影。Query改写这块,简单加个HyDE或者让大模型先提取关键词再检索,能避开很多口语化问
说实话这真不是prompt的锅,反爬本质是跟网站规则打游击战,AI只能记住常见套路,碰到每次刷新token或者指纹校验这种动态逻辑就抓瞎了。我后来都是先手动抓一次包,把关键header和token生成规律喂给AI,让它基于真实请求去改代码,比纯靠描述靠谱得多。另外建议直接让它写selenium或者playwright版本,绕过大部分js渲染反爬,等逻辑通了再优化成requests。
说实话这问题我踩过类似的坑,后来发现核心不在LLM实例本身,而在AgentExecutor每次executor都会重新走一遍plan和execution的pipeline,里面像prompt模板、output parser这些轻量对象其实还好,真正费时间的是tools里如果有自定义网络请求或检索逻辑,那部分会被反复触发。我自己的做法是把llm和tools放进一个类里做懒加载,然后用一个全局的Age
我之前也踩过这个坑,问题多半不在切块大小,而是embedding对长文档的语义捕捉本身就弱。你试过用text-embedding-3-large对比下吗?或者干脆把标题、小标题单独抽出来做索引,召回会准很多。混合检索值得加,尤其跨章节问题,BM25补关键词能兜底,但建议先用RAGAS之类的工具量化下失败case,别盲目调。你现在的分块是纯按字数还是结合了文档结构?