
低代码实验室
Lv.1主要整理低代码应用相关的学习笔记与工程经验,内容覆盖问题排查与调试、性能优化。希望内容既讲清为什么,也说明怎么做,希望把复杂问题讲清楚、把实践步骤写完整。
发表的评论
几万条片段用Chroma完全够了,我之前拿它跑过类似规模的demo,持久化没啥问题,性能瓶颈一般也不在向量检索上。Milvus那套确实重,单机部署还要etcd和minio,个人项目真没必要折腾。Qdrant我最近在用,docker一条命令起来,过滤检索比Chroma顺手,可以试试。真要纠结,不如先把pipeline跑通,后面换库成本其实没那么高。
我跑Qwen2.5-7B也踩过这坑,temperature低确实有用,但真正让它老实输出JSON的是把约束塞进system里,user只放待分类的句子。另外你那句“只输出JSON”最好换成“输出必须能被json.loads解析”,模型对这个更买账。few-shot别贪多,两三个干净例子就够,示例里混进解释反而会教坏它。
几百条数据做工具调用确实悬,格式多样性和负样本不够模型就容易乱飘,建议先查查数据里有没有混进没标注tool_call的样本。
这事我踩过坑,说点实在的。光靠系统提示里写“请输出JSON”基本等于没约束,模型该飘还是飘,尤其是多步推理时上下文一长,它很容易把思考和输出混在一起。我现在习惯把“思考”和“动作”彻底分开,让模型先输出一段自然语言推理,再用一个明确的标记比如“ACTION:”后面只接结构化内容,这样至少能靠字符串切分兜住。另外校验重试这层别省,解析失败就把错误信息塞回去让它重写,通常一两次就能收敛,比死磕prom
这个问题我之前也踩过,十有八九是query和文档语义空间没对齐。你问“退款流程怎么走”,文档里可能写的是“退费申请操作指引”,字面差异大,embedding就容易跑偏。先别急着换模型,拿几条bad case把query手动改成文档里的说法再检索,看看命中率有没有明显提升。如果改完就准了,那就是query改写或同义词扩展没做好,不是chunk的锅。bge-m3对中英混合其实挺能打的,一般不至于这么拉
刚入门,这个对我帮助很大。
你这个经历挺典型的,我去年做企业知识库的时候也踩过一模一样的坑。后来才想明白,RAG里微调LLM其实分两个完全不同的方向:一个是微调生成模型让它更好地利用检索片段,另一个是微调embedding模型让检索更准。你说的“检索准确率没变化”,大概率是因为你调的是生成端的LLM,而检索召回靠的是embedding那一步,这块不动的话召回率当然纹丝不动。至于回答质量,1000条数据对LoRA来说量不算大,
先别急着上rerank,top5看着相关但答非所问,八成是prompt里没约束好“只依据检索内容回答”,改改模板试试。
我一般temperature固定0.3左右,top_p基本不动,改多了反而玄学。开源模型对Prompt格式确实更敏感,GPT上随便写写就行,这边得把指令拆细点。代码任务可以试试few-shot塞一两个例子,比调参数管用多了。
我们线上也试过torch.compile跑推理,但T4上动态batch真心不太友好,缓存一直失效,后来还是回退到TensorRT了。vLLM本身已经做了很多kernel fusion和paged attention优化,再叠compile确实容易打架,CUDA graph那块冲突我们也踩过。个人感觉compile更适合训练或者固定shape的离线推理,在线服务还是得看具体框架的成熟度。
相似度阈值加时间衰减就行,近的优先,旧的超阈值直接合并。
几万文档Chroma完全够用,后期真扛不住再迁Milvus也不迟,别一上来就过度设计。
这个坑我踩过,DeepLab系列转TRT后边缘崩掉大概率是Resize插值方式的问题。ONNX默认导出的Resize可能是nearest或者half_pixel对齐方式和原PyTorch不一致,TRT解析时又做了自己的处理,小目标分割上特别明显。你可以用polygraphy或者trtexec逐层dump对比一下ONNX和TRT中间输出,重点看ASPP后面那几个上采样层。我当时的解法是手动把Resi
你这问题八成出在chunk切太碎+没rerank,bge-large本身够用,先按512切再跑个bge-reranker试试。
NCCL卡死多半是拓扑感知或者共享内存的问题,换个后端不一定能根治。MCP那东西我试过,PyTorch这边基本没戏,官方连C++扩展都没给全,强行load肯定崩。你要真想换,不如看看GLOO,4卡场景下小batch吞吐差距没那么大,稳定性反而好很多。另外排查下网卡中断和PCIe带宽,4090的通信瓶颈经常不在协议上。
这题我踩过一模一样的坑,pad_sequence默认往右边补零,模板token全被挤到后面去了。后来我是把模板拆成静态前缀和动态槽位,槽位单独pad完再拼回去,这样固定部分只用算一次。不过你这需求要是模板里带条件分支的话,可能得考虑用transformers的tokenizer自带padding侧参数,设成left会好点。还有个野路子是给模板token加个mask,让attention直接忽略pa
传输层真不是随便换的,MCP的协议规范虽然定义了消息格式,但底层信道的行为差异会影响状态管理和错误处理,我们之前试过把stdio换成自定义TCP,结果调试时一堆坑。负载均衡这块,如果你用Ray Serve,它本身就能扛多副本路由,MCP客户端只需要连到Serve的入口就行,不用自己折腾。倒是建议你先确认下外部工具是长连接还是短请求模式,这决定了你是走HTTP轮询还是得维持一个常驻的流式会话。
说实话你这场景我熟,之前给一个客服机器人做过类似的记忆检索,Faiss单机确实扛不住,但直接上Pinecone和Milvus之前得先想清楚一个事:你的Agent每次召回top5,延迟瓶颈往往不在向量库本身,而在embedding调用和网络开销上。我当时用Milvus自建,部署其实没想象中恐怖,但Milvus对内存和磁盘的占用挺狠的,如果你数据量在百万级以下,用Milvus Lite或者单机版就够了
试下选中代码后直接按Ctrl+K,然后明确写“仅重构此函数,其他文件内容一律不动”,比对话模式管用。
小模型真没必要开,编译开销比收益还大,我试过几次直接关掉省心。