
暮色远航集
Lv.1在屏幕微光里记录学习与实践,关注技术学习与数字生活,记录知识体系搭建、读书与思考和真实实践中的思考;喜欢从问题、方案到复盘形成完整闭环。希望这些经验能帮你少踩几个坑。
发表的评论
loss先降后升挺典型的,先别急着怪数据格式。建议先确认下tool_call那部分在tokenize后是不是被截断了,1.5B模型的上下文窗口有限,2k条样本里长对话很可能被砍掉关键字段。另外可以看看反弹那个点对应的step,是不是刚好过了warmup或者数据重复采样了。我上次类似情况是padding token和eos搞混了,loss曲线也是这个形状,排查一下tokenizer的special
COT适合让模型把推理过程摊开,但排序这种有明确最优解的任务,它“推理”出来的往往是过度设计。你那个递归加lambda大概率是模型在强行展示思考深度,实际性能它根本没法验证。想让它写快排,直接给伪代码骨架或者点明“用原地分区、别用额外空间”比让它自由发挥靠谱得多。我一般只在需求模糊或者需要模型自己权衡取舍时才上COT,纯算法实现反而用few-shot示例更稳。
这个坑我也踩过,大概率不是模型本身泄漏,而是你每轮把工具返回结果原样拼进history后,张量还在计算图里挂着。尤其是你在循环里如果对logits或loss做过任何带梯度的操作,又没detach,显存就会一圈圈涨。建议先确认推理是不是在torch.no_grad()里跑的,很多人写Agent循环时忘了这层。另外工具返回的长文本如果每轮都append,KV cache和attention的显存也会线
你这个问题我踩过,纯靠向量相似度在这种指代型查询上确实容易翻车,因为“刚才推荐的餐厅”和“聊天气”在embedding空间里可能离得更近。建议你存的时候带上时间戳和消息类型这些metadata,检索时先按最近N轮过滤再算相似度,命中率会高不少。另外可以把用户当前问题和最近几轮对话拼一起再embedding,让query本身带上上下文,比单轮匹配靠谱。有条件的话再加个关键词兜底,实体名这类硬信息向量
24G跑32B的Int4确实卡在临界点上,22G加载完基本没给KV cache留多少空间,上下文一长必炸。GGUF的Q4_K_M会比GPTQ/AWQ省一点,但也就省个1-2G,别指望质变,真正能吃下长上下文还是得靠offload部分层到CPU,llama.cpp的--n-gpu-layers调到28-30层左右,剩几层扔CPU,配合--ctx-size 4096实测大概5-8 token/s,知识
我一般会把表结构直接贴成DDL,让它先复述字段再写,few-shot也管用。
这个思路不错,收藏了。
我之前也遇到过类似问题,后来换了方案。
这个思路不错,收藏了。
我之前也踩过这个坑,512 token切出来经常是半句话,检索到的片段单看没问题,拼起来就缺胳膊少腿。后来发现关键不在固定多大,而是让切分跟着文档结构走,比如按标题层级或者段落边界切,再控制最大长度,比硬性按token数切效果好很多。overlap我一般设chunk的15%到20%,太小了跨段信息接不上,太大了检索结果重复得厉害。你提到的语义完整性,可以试试用句嵌入算相邻句子的相似度,跌到某个阈值
两千条数据做LoRA微调,这个量级其实挺尴尬的,模型能学到一些领域知识的表面模式,但很难真正把任务格式刻进权重里。你观察到的现象我觉得挺正常的,微调更多是在调整模型的输出分布偏向,而不是像预训练那样重塑底层能力,所以它对prompt的鲁棒性提升有限。我自己做类似事情的时候也发现,微调后的模型如果prompt写得太随意,确实容易跑偏,反倒是base模型加几个精心挑的few-shot能靠上下文把格式约
试试torch.cuda.memory_allocated配合逐行断点,八成是某个增强里张量没detach一直在累积。
试试在项目根目录放个.eslintrc再开Cursor的自动修复,它慢慢就学乖了,我这边管用。
我们去年做内部知识库也踩过一模一样的坑,纯向量对简称和内部黑话确实容易飘,尤其你们用OpenAI的embedding,中文专业场景本来就不是它强项。后来我们改成混合检索,但关键不是BM25本身,而是两路召回后别急着合并排序,先用一个轻量规则做去重和加权,比如BM25命中标题或术语表的给高权重,向量分只做兜底。BGE-rerank-v2-m3确实慢,我们换成了bge-reranker-base加ON
50条测试集确实太少了,波动大基本是采样噪声,建议至少按类别分层凑到200条以上,或者用交叉验证跑几轮看均值。prompt版本管理我一般直接扔git,每个版本配一份对应的测试结果json,方便回溯对比。评估上可以试试LLM-as-judge,让GPT-4o自己给分类结果打分,比纯看accuracy更能看出哪类在退步。工具的话LangSmith和Promptfoo都挺省事,能自动跑批量评测,不用每次
这个问题我也头疼了很久,说下我的做法。参数校验这块一定要在工具侧做兜底,别指望模型每次都吐对格式,schema校验加自动重试能挡掉一大半问题。另外工具描述尽量写得啰嗦点,把边界情况都列出来,模型理解准确率会明显提升。还有个坑是超时和幂等,尤其调用外部API的时候,不做好重试区分很容易重复执行。
我也遇到过这情况,搜索工具一返回几千条,上下文直接炸了。后来改成让工具只吐前N条加一个游标,LLM先看摘要再决定要不要翻页。大结果集最好别硬塞给模型,存到外部再给个ID引用,需要细节时再按需拉取。MCP本身不限制你怎么设计返回结构,关键还是工具层自己做好截断和分页。
Chroma本地文件模式确实扛不住并发写,你这“corrupted database”基本就是多进程同时打开同一个sqlite文件导致的。别在代码里加锁,RAG读多写少,加锁会把延迟拖死,不如先把写入路径拆出来,查询走只读副本或者独立进程。生产环境建议直接上Milvus或Qdrant这类支持并发读写的服务,Pinecone省心但成本和延迟要自己压测,尤其跨区调用别忽略。
TF-TRT对动态shape确实不太友好,它更偏向静态图优化,每次shape变了就重新trace,Agent里反复调LLM子图这种场景确实吃不消。PyTorch这边torch.compile虽然也有重编译开销,但动态shape支持相对成熟一些,不过也不是免费的。你试试把LLM子图的输入padding到固定长度,或者用TF的concrete function缓存,可能能缓解一下。两个框架在这块的设计
500条样本做风格微调确实偏少,loss到1.8不动很可能是数据多样性和数量都不够撑住。另外你batch size才4,梯度噪声大,建议开梯度累积到等效16或32试试,学习率5e-5配cosine调度会更稳。prompt里的[INST]标记得看基座本身有没有对应的chat template,Qwen2.5 base和instruct用的模板不一样,加错了反而干扰。可以先把训练集里同风格样本复制几份