
向内求解深度学习成长记
Lv.1记录从不会到会、从能用到做好。当前重点关注深度学习,通过提示词与上下文工程、RAG知识库搭建持续提升能力;不追求堆砌概念,只记录验证过的经验,并把过程整理成可复用的学习记录。
发表的评论
别太焦虑,我当年也是TF1.x和PyTorch来回横跳,后来发现真正卡住你的不是API,而是对计算图、自动求导这些底层逻辑的理解。建议你挑一个当主力(现在肯定选PyTorch),另一个只当工具用,复现老论文时直接找现成的TF代码改,别从头写。平时把两边共通的模块(比如数据管道、训练循环)抽象成自己的模板,切换时只换胶水层就行。工业界TF serving也没那么神,现在TorchServe和ONNX
我也遇到过类似情况,排查下来大概率是MCP tool的参数schema设计问题。你如果把top_k和阈值写成了可选参数,模型经常就默认不传,走的是服务端兜底逻辑,跟本地pipeline的参数对不上。建议先把tool描述里每个参数的语义和推荐值写死一点,然后开日志对比一下模型实际传了什么。另外MCP那层如果做了结果截断或重排序,也会让相关性看起来变差,这个容易被忽略。
我踩过一模一样的坑,后来发现光向量召回不够,top5里经常混进语义相近但没回答问题的片段。加个bge-reranker重排一下提升挺明显的,另外MiniLM对中文确实一般,换成bge-m3试试。还有你说的“我不知道”,很可能是prompt里没给模型足够的上下文约束,或者切块把答案切断了,512有点小,试试800带点重叠。
几十万条数据其实还不至于非上Milvus,我用Chroma撑到百万级也还行,就是filter多了会有点拉胯。Milvus确实重,etcd加minio一套下来小机器扛不住,个人项目折腾运维不划算。可以试试Qdrant,单机docker跑起来很轻,性能和持久化都比faiss省心。真要图省事,先把faiss换成支持增量写入的方案,别急着上分布式那套。
Prompt工程肯定有用,但没教程吹得那么神。关键是理解模型对词序和权重的敏感度,比如画质词堆太多反而会互相打架。我自己的经验是先把构图和主体描述清楚,风格词放后面微调,负面提示词只加确实出问题的那些。至于工具,可以试试用XYZ plot脚本批量跑同种子不同提示词,对比几次就有感觉了,纯靠抽卡确实效率太低。
我之前也踩过这个坑,后来发现是节点返回的 state 更新没做 reducer 合并,LangGraph 默认直接覆盖,导致下一轮读到的还是旧值。你可以在每个节点里只 return 增量字段,然后用 Annotated 配 reducer,顺序乱的问题基本就没了。至于 Send API,适合做扇出并行,但你这种串行依赖其实用子图隔离更清晰,每个 Agent 管自己的 state,主图只传必要字段,
我试过bge-large在3090上跑,其实batch小一点推理速度还能接受,比换模型更值的是加个重排序。你可以先用bge-small粗召回top20,再用bge-reranker-base精排,效果提升挺明显的。chunk我建议别死磕固定值,按条款或段落切,再带点重叠,比纯按token切干净很多。
5000条4分类其实不算少,但7B模型做短文本分类,LoRA的rank和target module选择挺关键的。你试过只挂q_proj和v_proj吗?我之前做类似任务加上k_proj和o_proj后F1涨了大概5个点。另外loss稳在1.2说明模型可能已经过拟合了,验证F1卡住不一定是欠拟合,建议看看验证loss曲线是不是在往上走。还有分类任务其实可以考虑在LoRA上面接个分类头,别直接让模型生
5000条数据其实不算多,loss降到1.8卡住挺正常的,别太指望它一直往下掉。rank=16不算高,问题可能出在lr 2e-4对LoRA来说偏大了,容易把预训练知识冲掉,试试降到5e-5或者1e-4。另外检查下数据里是不是有大量重复或格式不统一的样本,客服对话如果回复太模板化,模型学到的就是复读。验证集答非所问也可能是过拟合了,早停加评估生成质量比盯着loss有用。
先别急着怀疑DeepSpeed,大概率是你自己代码里某个tensor没detach或者数据没清干净,建议从数据加载那块排查。
说实话我觉得你大概率不是prompt的问题,而是检索那一步出的错。知识库问答里上下文质量直接决定输出上限,prompt再花哨也救不了垃圾输入。你可以先把召回的文档片段打印出来看看,是不是本身就有噪音或者互相矛盾的内容。另外试试把temperature调到0的同时加一个“如果信息不足就明确说不知道”的约束,能挡掉不少幻觉。微调真不是首选,先把检索和上下文清洗做扎实了再说。
prompt长确实吃显存,吞吐瓶颈可能在prefill,试试把max_num_seqs调低点看单请求延迟是不是好很多。
这问题太典型了,我之前的坑就踩在这。RAG管的是外部知识,长期记忆其实是用户状态的沉淀,混在一个collection里必然互相干扰。我后来是把对话历史按session_id分片,再单独建一个user_profile的collection存偏好,查询时先查profile再查历史,召回精度会好很多。ChromaDB的话,试试给每条记录加个type字段做过滤,别只靠向量相似度硬扛。
说实话你这个问题我前段时间刚折腾过一遍,最后选了Qdrant。Chroma和FAISS我都试过,几万条文档完全够用,但FAISS那个索引重建和metadata过滤的痛,demo阶段还好,真做产品迭代会想骂人。Chroma倒是轻,可一旦数据涨到几十万,内存占用和持久化那块的坑就露出来了。你提到中文长文档切块后embedding维度,这个其实跟向量库关系不大,主要看模型,Qwen和ChatGLM的默认
这个问题我太有共鸣了,之前也被搞到怀疑人生。我的做法是只带跟当前子查询相关的最近两轮追问,而且不是直接拼接,是让Agent先总结一下用户到底在纠结点啥,再生成查询。你那个固定前缀我觉得问题在于太模板化,模型容易忽略真实意图,不如让Agent自己判断哪些历史信息值得保留。其实也可以试试分级策略,粗粒度问题用固定拆,复杂追问才走Agent规划,这样能省很多调参的力气。
LoRA确实会稳很多,你这学习率全参数微调对8B来说偏高了,降到1e-5再试试。
说实话你这问题我太有共鸣了,BGE-large配ChromaDB我调了俩礼拜,最后发现是chunk overlap设太小导致上下文割裂,引用对不上其实跟向量库关系不大,更像是chunk切完以后元数据没带全。距离算法在中文场景真没维度重要,但M3E换过去检索准了引用乱,大概率是候选数太少,试试把retrieval的top_k调大再重排。至于Milvus和Qdrant,数据量没到百万级真没必要折腾,C
看到这个结果真不意外,LLM做rerank不是光看loss降没降就行的。你拿几百条query-文档对去微调,这个数据量对7B模型来说太少了,LoRA虽然能压低训练loss,但泛化能力大概率跟不上,尤其企业文档的领域术语和真实query分布,可能跟你标注的样本差距挺大的。 另外有个很关键的点,rerank任务里LLM需要的是对“相关性”的精确排序能力,但生成模型天生更擅长“生成”而不是“判别”,你
我之前也踩过类似的坑,top10命中率高但生成乱套,大概率不是chunk粒度的问题,而是prompt里没做“硬约束”。你直接塞片段,模型会把所有内容当背景知识自由发挥,尤其当多个chunk里都出现相似术语时,它就容易串。建议先把检索结果按来源文档分组,然后在prompt里明确写“仅基于以下编号段落,若信息不足直接回答不知道”,甚至把每个chunk前面加上文档标题,这样模型能感知边界。另外,你可以做
变量位置真挺关键,放前面比放后面稳,分隔符用特殊符号也容易让模型抓重点。