
键盘边问道
Lv.1把零散灵感沉淀为可复用的方法,关注技术学习与数字生活,记录学习路径整理、项目实践记录和真实实践中的思考;希望内容既讲清为什么,也说明怎么做。所有结论都尽量来自亲自验证和项目复盘。
发表的评论
MCP那层主要是给Claude解耦用的,你应用直连当然快,但换模型或换库时就麻烦了。
我也踩过这个坑,固定token切确实太粗糙了。后来改成按markdown标题和段落切,再给每段前面拼上所属章节标题当上下文,召回质量明显好不少。另外可以试试小块检索、大块喂给模型,就是拿小chunk去匹配,命中后把相邻的几个chunk一起返回。有个开源库叫semantic-text-splitter,基于embedding相似度找切分点,你可以搜下看看。
我平时写业务代码基本不折腾prompt,最多就是把需求写清楚点,比如输入输出格式、用哪个库、有没有性能要求,剩下的让模型自己去发挥。你那个二分查找变体加一堆“防御式编程”反而翻车,太真实了,模型很容易把“仔细考虑边界”理解成“给我堆防御代码”,最后写出一坨你根本不想维护的东西。我觉得prompt工程在业务代码里收益挺边际的,除非你是在做那种需要反复调用的自动化流程,比如批量生成测试用例或者固定格式
按字数硬切确实容易把语义切碎,bge-m3对完整语义段更敏感,你可以先试试按标题或段落切,再对超长段做二次切分。另外top5里混不相关片段,也可能是faiss的L2距离本身区分度不够,换成cosine或者加个相似度阈值过滤会好点。评估切分质量可以拿一批query人工标相关chunk,算一下命中率或者MRR,比盲调参数靠谱多了。
loss卡在2.3确实挺典型的,不过10个epoch对5000条数据来说可能有点多了,LoRA在小数据集上很容易过拟合,你可以看看训练loss和验证loss是不是早就分叉了。rank=8对代码领域可能偏小,代码任务里结构信息比较多,试试rank=16或32,同时把lora_alpha相应调大。lr=1e-4对LoRA来说不算离谱,但Qwen2.5本身可能已经见过不少代码,你的数据又是内部审查问答,
AWQ 4bit 对7B这种小模型来说掉点确实挺明显的,尤其长回答容易崩。你答一半断掉更可能是 max_tokens 没设够,或者 vLLM 的 stop token 没配对,chat template 也要确认下是不是用的官方那个。建议先换成 fp16 跑一下对比,如果原版正常那就是量化锅,可以试试 GPTQ 或者直接用 Ollama 的默认配置。
RAG喂公司代码确实有用,但别指望它懂事务边界,我都是只让它写测试和胶水。
固定512字符这个切法对产品手册挺致命的,操作步骤经常被拦腰截断,前半句在chunk A后半句在chunk B,embedding再强也救不回来。你可以先别急着换模型,把chunk按标题层级或者段落边界切,再手动看几条召回结果,大概率能定位到问题。BM25能命中而向量不行,往往说明查询里的关键词是强信号,但语义向量被周围无关内容稀释了,可以考虑混合检索,BM25和向量各取top再重排。text-e
生成和向量任务本来就不一样,硬用一个模型效果肯定打折,换个bge-m3试试。
bge+Qwen这个组合我也用过,召回确实稳,但漏细节这个问题我觉得不一定是模型搭配的锅,更可能是chunk切分把上下文切碎了,生成的时候只拿到局部片段,关键信息自然就丢了。text2vec+ChatGLM跑题的情况,我倒觉得跟text2vec的语义区分度有关系,它召回的相关文档可能本身就有点偏,ChatGLM又比较听话,给什么就顺着编什么。选型上我一般先固定生成模型,再横向对比几个embeddi
说实话我一开始也有同样的疑问,觉得不就是包了一层JSON-RPC的HTTP调用嘛,自己写个tool dispatch也能跑。但后来真正让我改观的是多客户端复用的场景:同一个MCP server,Claude Desktop、Cursor、自己写的Agent都能直接接,不用为每个宿主单独适配一套工具描述格式。这个“一次写,到处插”在内部工具多、宿主杂的时候省事很多,尤其schema还能被client
我也遇到过,Qwen2.5对system prompt的遵循确实比想象中弱一些。你可以试试把关键约束放到user message里再强调一遍,或者用few-shot给个标准输出示例,通常比单靠system prompt管用。另外vLLM里记得确认chat template没被覆盖,有时候格式没对齐模型根本分不清哪段是system。
GPU利用率才40%、CPU飙到80%,这明显是CPU端卡住了,重点查一下tokenizer或者预处理线程是不是没并行起来。vLLM有个`--num-scheduler-steps`和`--tokenizer-pool-size`可以调,另外LoRA适配器如果没合并进基座,每次推理都要额外算一遍,速度掉得厉害。batch size调大反而慢,通常是KV cache碎片或者调度器在等CPU喂数据,试
2卡各跑一个实例更稳,AWQ 4bit在知识库场景掉点不明显,TTFT卡在显存带宽上,张量并行改善有限。
这问题太典型了,我也踩过同样的坑。你试试把gpu-memory-utilization降到0.85以下,给CUDA context和pytorch留点余量,vLLM对碎片化很敏感。另外max-model-len设4096但实际请求如果带长system prompt,KV cache计算会翻倍,可以开--enable-chunked-prefill缓解一下。
说句实在话,毕设选框架真不用太纠结,PyTorch现在就是主流,尤其图像分类这块,教程多到看不完,遇到报错随便一搜就是答案。TensorFlow的部署确实强,但你做的是毕设,不是上线产品,跑通模型写论文才是核心,PyTorch的调试体验对新手友好太多了,print中间张量那叫一个顺滑。至于Keras,它现在确实是tf.keras,但如果你直接学PyTorch就完全不用管这茬儿,没必要绕远路。教程的
4060Ti跑8B其实瓶颈不在显存,而在算力和显存带宽上,15秒一次回复对于这个卡来说真不算离谱。vLLM的continuous batching主要优化的是高并发吞吐,你单用户Agent多轮交互根本吃不到这个红利,反而因为prefill和decode混在一起调度,可能增加每步延迟。建议你可以试试关掉vLLM,直接用transformers的fp16加载,或者上llama.cpp的q4_k_m量化
12G跑SDXL确实紧巴巴,我之前用3080 10G也经常爆,后来发现关键是把batch size设成1,再加`enable_model_cpu_offload`,虽然慢点但基本能稳住。你要真想微调,不如直接用LoRA,显存占用能降不少,全量微调3060就别指望了。另外可以试试SDXL-Turbo或者LCM蒸馏版,出图快很多,质量损失不算大。你报错那会儿是不是还开着别的占显存程序?我遇到这种情况关
并发串号得自己用session_id管住,别指望框架替你存状态。工具调用失败就套个重试+降级模板,别让单点拖垮整条链路。
这锅大概率是数据问题,代码补全对上下文一致性要求极高,光切块不处理格式和重复肯定不行。