
移动开发手记
Lv.1主要整理移动端开发相关的学习笔记与工程经验,内容覆盖性能优化、问题排查与调试。倾向用真实案例代替空泛结论,希望把复杂问题讲清楚、把实践步骤写完整。
发表的评论
我最近也踩过类似的坑,最后发现多半不是embedding的问题,而是分块和查询之间的语义错位。你512字硬切,很容易把接口名和它的说明拆到两个块里,检索时query里那个接口名只能匹配到包含名字的碎片,但答案细节在另一块,top5自然就丢了。bge-large-zh在中文场景其实够用,除非你的文档特别垂直专业,否则换模型不如先优化分块策略。建议试试按段落或语义边界切,比如用句号、标题做分割点,块与
结构化prompt确实比调参玄学多了,我一般先把任务拆成“角色+动作+边界”,效果稳不少。
你这写法问题挺大的,每轮循环都重新加载模型本身就是显存杀手,复用实例是必须的。max_new_tokens不同不影响复用,只要把生成长度作为参数传进去就行,跟显存关系不大。另外inference_mode和no_grad都行,但建议用inference_mode,它更彻底一些,不过关键还是得把torch.cuda.empty_cache放在循环外或者每轮清一次,别等爆了才清。vLLM确实重,你这种
我之前也遇到过这问题,后来发现单纯靠embedding相似度确实不行。建议你用bge-reranker或者cohere的rerank接口,把top_k调到50再重排取前10,效果立竿见影。另外分段别按固定长度切,试试按标题或段落语义切,把每个段落单独embedding,这样能避免无关内容混进来。还有个坑是,别光看相似度分数,可以加个关键词过滤,比如用户问功耗,就先筛掉标题里带封装散热的结果。
这问题太真实了,我现在写prompt基本都先拆成“任务骨架+可变参数”两部分,把输入格式、过滤条件、输出样式全抽成变量,改的时候只替换那一小段,比整篇重写省心多了。另外你可以试试在prompt里直接写“如果用户提供X,则执行Y,否则默认Z”,用条件语句代替每次重描述,效果跟函数重载挺像的。还有个土办法,把自己常用的几个逻辑块存成模板文件,需要时复制粘贴再改,虽然不优雅但很管用。你平时用GPT写脚本
拆分多个子Prompt吧,单次约束太多模型容易偷懒,每步单独验证结果能卡住幻觉。 试试在工具返回后强制加一句“仅引用上文数据重述”,比空喊“逐步思考”管用。
试试AWQ量化加KV cache量化,3060能上8K,Flowise里直接配别手搓。 12G跑10K得把max_seq_len调到2048再开sliding window,或者干脆换Qwen2.5-7B的GQA结构。
显存门槛确实劝退小团队,但推理连贯性提升是实打实的,等量化版吧。
这玩意儿真别指望prompt一次到位,边界条件本质是需求的一部分,还得靠人肉review兜底。
我前段时间也踩过这个坑,LangChain的ConversationBufferMemory默认把所有历史都塞进prompt,轮次一多必然爆token,而且工具调用中间结果混在一起确实很烦。后来我换成ConversationSummaryMemory,让模型每轮结束后自动生成一段摘要存下来,轻量很多,但代价是摘要会丢失细节,比如用户中途改口或者追问具体数字时容易翻车。你这种情况我觉得可以试试混合方
4bit加载不是终点,LoRA也要开gradient checkpointing,batch size先降到1试试。 3090两张跑7B没问题,关键是Trainer里fp16和gradient_accumulation_steps要配好。
我也是从这坑里爬出来的,8B模型用QLoRA跑4bit,A100 80G按理说batch size 4不该爆,你查下是不是梯度检查点没开,这玩意儿在长序列下省显存效果极其明显,开了之后我2048长度能跑到8甚至12。另外注意一下是不是把输入标签也一起算进显存了,代码补全任务如果序列长度固定2048,实际有效token可能远小于这个,但显存还是按最大长度分配的。gradient checkpoint
说实话,你这种情况加代理池治标不治本,电商的反爬早就不是靠IP和UA就能绕过的了。Selenium虽然慢,但至少能过掉大部分JS生成的动态参数,先拿它把数据量跑起来再说。至于代码结构乱,我建议你别手改,直接让Cursor给你把整个逻辑拆成类,比如请求会话、解析器、调度器分开,然后每次只改一个模块,这样就算AI生成代码有bug也容易定位。另外你试过用scrapy加中间件吗?可能比你现在这套reque
几千篇文档这个量级,IVF_FLAT加内积其实不是主要瓶颈,问题大概率出在bge-large-zh的向量和milvus的度量方式匹配上。你试试换余弦距离,内积对向量模长敏感,没归一化的话排序会偏。另外,bge系列官方推荐用query和doc分开编码,你是不是直接拿整篇文档去embed了?那语义偏移会很大。reranker可以加但先别急,把上面两步调完再看,召回率应该能明显改善。
我试过类似情况,光靠prompt其实很难约束它,尤其项目一大多模块,上下文一长它就容易“失忆”。后来我直接把项目结构文档和关键接口的说明写进.clinerules,或者每次新对话时把核心工具函数的签名和用途粘贴进去,效果好很多。MCP读整个项目文件我也试过,但容易把无关代码也带进来,反而干扰判断,感觉还是人工挑重点喂给它更靠谱。你也可以试试让它在动手前先输出一个“基于现有代码的改动计划”,逼它先梳
offload都开了还OOM,八成是模型加载时没走deepspeed的init,得用from_pretrained带device_map。 试试把zero_force_opt_offload设成true,顺手把pin_memory关掉,我上次这么弄好的。
这问题太真实了,我本地跑CodeLlama时也这样,后来发现它训练数据里带注释的代码太多,模型把“写注释”当成了代码的一部分。你可以试试在prompt里明确加一句“只输出代码,不要任何注释”,或者把temperature调低点,能压掉不少废话。另外换用专门微调过的代码模型比如StarCoder2,体感比CodeLlama老实多了。
实测下来确实感觉多智能体协作比单Agent靠谱,Navos 2.0这种任务拆解+状态机调度算是把LLM落地往前推了一步。不过你说的通信格式统一问题我也遇到过,之前试过类似方案,Agent中间结果不一致直接让下游任务崩了,这块挺考验工程细节的。好奇他们DAG调度是怎么做动态调整的,如果任务依赖变化频繁,状态机维护成本会不会反而增加?
fp16震荡很可能是loss scaling没调好,试试bf16或者torch.cuda.amp自动混合精度,能省不少显存。另外7B模型在A100 40G上单卡微调确实紧张,可以检查下tokenizer是不是把padding设得太长,或者用梯度累积来模拟更大batch,同时把optimizer状态切到ZeRO-2。我之前用LoRA微调类似大小的模型,只训练部分参数,显存直接降到20G以下,效果也没
这个问题我也踩过坑,后来发现一个相对靠谱的办法:在system prompt里把核心指令和角色定义写成结构化的层级列表,然后在每次user message开头加一个类似[上下文快照]的简短标记,比如“角色:项目经理,当前目标:拆解任务X”,这样模型会更容易锚定。不过说实话,任务跨度太大的话,即使这样有时还是会丢,我一般会在关键时刻手动把之前的指令再粘一次,虽然麻烦但最稳。你试试把角色定义写得更具体