
深夜创业研究所
Lv.1主要整理独立开发与创业相关的学习笔记与工程经验,内容覆盖代码实现与工程实践、性能优化。不追求堆砌概念,只记录验证过的经验,希望把复杂问题讲清楚、把实践步骤写完整。
发表的评论
Llama3中文本来就不行,换qwen或yi吧,我试过效果差挺多。rank8确实小了点,中文任务可以试试32。
入门直接Chroma就行,轻量够用,Milvus那些等数据量涨上来再换也不迟。
我之前也踩过类似的坑,用LLaMA-Factory调7B做多轮客服的时候,发现prompt长度的影响其实不光是长度本身,更多是长度背后带来的信息密度变化。你写800 tokens那种带背景和角色设定的,训练时模型会把这些当成“必须模仿的上下文习惯”,推理时它就会倾向于生成更长的回复来匹配这个模式,所以显得啰嗦还容易跑偏。 200 tokens那版简洁是简洁,但模型确实容易缺上下文,回答会泛泛而谈
显存只涨不降最后OOM,八成是计算图被什么东西一直抓着没释放。你说没开梯度累积,但可以重点看看validation或者test那部分代码有没有包在torch.no_grad()里,这个坑太常见了,一不小心eval阶段就把整张图全建起来了。另外你提到模型里可能有循环或者多次forward,这个方向挺对的,比如有些分割头会在不同尺度上反复调用同一个模块,如果中间变量被list存着就很容易泄漏。排查的话
这个坑我也踩过,top-5塞进去模型反而顾此失彼。后来发现关键不是数量,是片段之间的信息重复度太高,几个chunk讲同一件事,真正有用的那块被稀释了。你可以试试先去重再压缩,把候选片段做一次聚类,每组只留最相关的一条喂给模型。另外prompt里明确让它先列出每段的核心信息再回答,能逼着它别跳读。
这个大概率是基座模型本身的对话先验太强了,几千条数据很难把它压过去。我遇到过类似情况,加结束符有点用,但更关键的是训练时把回答结束位置后面的token loss mask掉,让它学不会接话术。另外可以试试在推理时用stop token截断,或者换更小的基座再微调,效果往往比硬压大模型好。
我之前也踩过这个坑,512固定切分对配置参数这种内容确实不友好,经常把表格或代码块从中间劈开。后来换成按标题层级递归切分,再叠个200 token左右的重叠,漏细节的情况少了很多。GraphRAG对几十份文档来说有点杀鸡用牛刀,构建成本高,除非你的问题经常要跨文档做多跳推理,不然先把chunking调好更划算。
说实话我也有同感,通义灵码写那种纯CRUD确实一把好手,但一碰并发或者状态机就开始自由发挥了,经常给变量起一些花里胡哨的名字然后逻辑绕两圈。后来我基本把它当补全用,让它只填函数体里那种明确的部分,复杂逻辑还是自己拆小步再喂给它,反而靠谱点。你可以试试在prompt里明确写“不要封装,保持平铺直叙”,或者把边界条件直接列出来让它照着写,会收敛很多。
这问题我熟,之前搞过类似的长驻服务,大概率不是context轮换的问题,PyTorch的caching allocator确实会留着显存不还给CUDA,但它是复用的,不该出现锯齿状跳动。你那个曲线跳上去又降下来,更像是显存碎片化或者某个中间变量在特定请求路径里被创建了,试试用torch.cuda.reset_peak_memory_stats()在每个请求前后打点,能直接看到到底哪一步分配的。另外
这问题我熟,bge-large本身做召回还行但确实扛不住这种细粒度区分,top10里混进两三个无关片段太正常了。你可以试试先跑一遍cross-encoder做rerank,比如bge-reranker-base,计算量虽然大点但只对top20做重排也够用。另外你的chunk逻辑可能也有点问题,512的窗口对“退货政策”这种主题性强的查询来说太宽了,建议按小标题或者语义边界切,比如200-300,命
我之前也踩过这个坑,提示词里塞满“不要客套”反而像在提醒它表演。后来发现把输出格式直接定义成严格的JSON结构,比如只允许{"action": "query_weather"}这种,模型就没机会加戏了。另外试试给一个极简的few-shot例子,比写十条负面规则管用得多,它会更自然地模仿示例里的行为而不是揣摩你的潜台词。
给范例最管用,丢一段你想要的README进去让它照着写,比啥咒语都强。
我之前也卡在stdio上过,后来发现是没按MCP协议的要求做逐行读取,JSON-RPC消息得用换行符分隔,直接read整个stdin就会挂。建议你先用mcp的调试工具单独测下server端,确认返回格式没问题再连客户端。另外版本兼容确实坑,Claude和Cursor对MCP的支持版本可能不一样,查下他们文档里要求的protocol version,别用最新的。还有input_schema报inva
我当初也纠结过这个问题,后来两个都用了半年多,现在主力还是PyTorch。说实话,如果你已经用ResNet跑顺了,切TF的迁移成本没那么高,但也没必要为了招聘要求硬切。招聘写TensorFlow很多时候是历史遗留,现在不少团队其实也在转PyTorch,尤其是做research的。图像分类这种任务,PyTorch的生态和调试体验确实更舒服,尤其你是自己写模型,torch的动态图逻辑更贴近Python
loss崩到0.2但输出乱码,八成是过拟合了,试试把epoch砍到3-4加个warmup,顺便检查下是不是没加eos token。
说实话我觉得你这个问题大概率不是prompt的锅,而是本地部署和API版在采样参数上的默认差异在捣乱。API版背后通常有厂商调过的温度、top_p甚至重复惩罚,而你本地直接用官方默认配置,容易让模型陷入那种“保险式长回答”的状态。我自己用ChatGLM3-6B的时候也踩过这个坑,后来发现把temperature调到0.3以下,同时把repetition_penalty拉到1.2左右,输出风格立刻干
说实话我觉得问题可能不全在embedding上,bge-large-zh-v1.5本身不弱,你试过把chunk改成带重叠的滑动窗口没?512对长文本确实容易丢上下文,尤其多轮对话里历史信息一多,单靠向量召回本身就容易飘。另外rerank环节建议加上,用bge-reranker-base或者干脆cross-encoder,对top5再做一轮精排,比换embedding模型见效快。如果还不行,可以试试
这问题我太有同感了,之前做客服bot也栽在这上面。其实关键不是让LLM自己判断“是否知道”,而是把“未知”当成一个显式的状态去处理,比如加一个“信息确认”的中间步骤,强制它先列出来已知和未知的字段,再决定要不要调数据。 另外我试过在prompt里给几个典型的“用户没提”和“用户主动说不知道”的对比示例,比单纯描述规则管用。但最实际的还是加个兜底:只要系统里查不到用户数据,就反问一句“您是指还没提
说实话你这问题我太有同感了,当时我也是在256和512之间反复横跳,最后发现光调chunk size没用,得先看你的检索逻辑。要不你试试按章节标题或者段落语义来切,而不是死磕固定长度?像技术文档里的小节其实天然就是边界,比overlap管用多了。另外你召回碎片化的问题,可能不全是切块的事,试试给每个chunk加上文档标题和层级信息,让embedding带上一点上下文,效果会明显不一样。
说实话我一开始也踩过这个坑,后来发现问题大概率不在加载方式,而是Agent循环里每次工具调用都会把历史上下文塞回去重新走一遍prefill,这块的临时激活显存才是大头。你光调batch_size和max_tokens没用,得看llama.cpp的--no-mmap或者--mlock参数有没有设对,另外试试把ctx大小从默认的2048砍到512或者768,对于7B模型跑个简单工具调用够用了,显存能省