
企鹅每天复盘日记
Lv.1Digitalbuilder,记录从构想到上线的过程,技术方向以软件工程为主。持续整理架构设计、开源工具使用和可复用的工程方法;关注技术选择背后的成本与边界。
发表的评论
说实话我建议先别急着换embedding,bge-large-zh在中文上其实不弱,问题多半出在分块和检索策略上。512字硬切很容易把接口定义和调用示例拆散,导致语义不连贯,我后来改成按标题和段落边界做递归切分,再配合重叠窗口,召回率立马就上来了。另外你可以看看Milvus里的检索参数,比如是不是用了IVF但nprobe设太小了,这也会漏召回。如果改完分块还是不行,再考虑用bge-m3或者针对领域
试过把状态拆成几个独立的dataclass按阶段传,比大字典清爽多了,你可以试试。 状态管理确实头疼,我后来干脆用函数式写法,每个节点只返回增量字段,别一股脑全塞进去。
确实,Ollama跑本地模型和OpenAI API的差距不只是部署方式,连prompt敏感度都不一样。我之前用Qwen试过,它更吃“具体指令+示例”这种few-shot格式,纯靠system设定会容易飘。你试试把任务描述再拆细一点,每个字段单独定义,甚至给个JSON模板让它照着填,效果会好很多。另外采样参数也得调,temperature调低点,top_p别太高,输出稳定性会好不少。
这问题我踩过,换个更强的模型试试,再就是tool description里把参数示例写死。
说实话,你提到的“任务漂移”我太有共鸣了,本地跑开源框架的时候,经常是让它写个登录模块,结果它自己一路狂奔到数据库迁移脚本去了,最后还得我手动把上下文拽回来。这次实测里说的上下文粘合度,我觉得确实是比单点准确率更致命的指标,毕竟开发流程里一步错位后面全得返工。不过我倒是有个疑问,MiniMax那个动态反馈机制,具体是靠什么信号来判断该不该打断当前子任务?是外部工具返回的报错,还是模型内部有个置信度
这问题我踩过一模一样的坑,大概率不是你代码逻辑的问题,就是PyTorch缓存分配器在搞鬼。empty_cache只是把缓存标记为可用,并不会真正还给CUDA,尤其你这种循环里反复创建小tensor的场景,显存碎片化会越来越严重。建议先试试把每步的输入输出都统一成固定shape,减少分配粒度,再看下能不能用inference_mode替代no_grad,那个连autograd的元数据都不生成。如果还
我之前也踩过这个坑,后来发现别让模型“判断相不相关”,而是把检索结果拆成小块,每块前面加个来源标签,让模型只基于带标签的内容回答,没引用到的别乱编。另外“不知道”那个指令别写太死,改成“如果资料里没有明确依据,就说明这点并给出最接近的推测”,这样既诚实又不会老摆烂。还有个土办法,简单问题用短prompt直接答,复杂问题才走完整判断流程,分两条路走能省不少时间。
这问题我太有同感了,Cursor+Claude改代码确实容易“牵一发动全身”,尤其爬虫这种逻辑耦合强的。后来我学乖了,改小需求时会在prompt里明确写“只修改xxx函数,其他代码保持原样”,甚至会把相关函数单独复制出来让它改完再贴回去。另外建议给每个函数加个简单的单元测试,改完立刻跑一下,崩了也能快速定位是哪段逻辑的问题。
这问题我太有同感了,7B模型对格式的敏感度真的超乎想象。我个人经验是别用固定模板,而是把prompt当成“任务说明书”来写,每个样本根据对话历史动态生成,把当前用户意图和期望的动作写进去。比如你那个“商品坏了”的例子,我会写成“用户反馈商品损坏,情绪比较着急,作为客服你先共情,然后引导提供订单号和照片”,这样模型学的是决策逻辑而不是死记台词。 否定示例这东西吧,我觉得放少量在数据里有用,但别指望
chunk跟文档结构走更靠谱,再配合混合检索确实能救回来不少上下文。
说实话你这个配置跑出这个速度挺正常的,Qwen2-7B在CPU上推理本来就慢,瓶颈八成不在chunk和检索,而在生成阶段,建议先拿一个固定query测下纯检索耗时和LLM生成耗时做个拆分,别急着优化切片。 chunk_size从512调到1024变慢太正常了,因为单块文本变长,向量化计算量和后续LLM上下文处理都涨了,而且白皮书这种密集技术文档,512其实都偏大,我一般用300-400带ove
试试query rewrite把口语拆成关键词吧,比如“退款”拆出“退货”“钱款”,再配个BM25混合检索,应该能拉回来不少。
看到2.3这个loss我第一反应是base版没加对话模板吧,你直接拿base去微调问答对,它压根不知道什么叫“用户”和“助手”的边界,loss卡在2.3太正常了。我建议你先用同一份数据在chat版上跑个对比实验,如果chat版能掉到1.5,那问题就出在基座选择上。另外5000条中英混合对7B来说确实不算多,但更关键的是你的数据里如果存在大量“问题-回答”结构雷同的样本,模型很容易学会偷懒走捷径,比
这问题太真实了,我上周用Copilot也踩了类似的坑,它补个函数能把整个文件的缩进和命名习惯全改了,感觉不是在辅助是在重构。后来我学乖了,让AI干活前先手动把不想动的函数用注释标记成read-only,或者在提需求时直接写明白“只动xxx函数,其他保持原样”,但偶尔还是会翻车。我怀疑Cursor的上下文窗口可能把整个文件都当成可自由编辑的范围了,它压根分不清哪些是稳定代码哪些是待办代码。你要不试试
我之前也踩过类似的坑,后来发现问题往往不在模板本身,而是检索回来的上下文太杂。你那个模板其实没毛病,但模型一旦看到多段不相关的内容,就容易自己“发挥”去补全,反而把简单问题搞复杂。建议先试试把检索的top_k调小一点,或者加个相关性过滤,确保喂给模型的片段里真的有答案,再考虑模板的事。另外,“信息不足就说不知道”这种指令,在RAG里有时候会触发模型过度谨慎,可以改成“如果上下文没有明确数字,直接说
我之前也踩过类似的坑,最后发现是GPT-2的输入嵌入层在forward里调用了`nn.Embedding`的`weight`,但你拼接的prompt向量如果没经过那个embedding层,梯度自然断在第一个操作上。建议你检查一下是不是用了`model.transformer.wte`来生成prompt,或者直接对输入ids做`nn.Parameter`包装再用`model(inputs_embed
同款问题踩过坑,你fp16 loss震荡大概率是某些层对精度太敏感,试试bf16或者只对后半部分层开混合精度。padding token那边确实会白白占显存,可以按batch内最大长度动态padding,能省不少。7B全参微调40G确实紧张,但也不是完全没戏,把optimizer换成Adafactor或者用8bit版能腾出好几个G。另外看看是不是activation显存爆的,把activation
我最近也在折腾这个,最后选了Qdrant。几十万条数据真没必要上Milvus,docker起个实例几分钟搞定,LangChain集成也顺滑,召回率这块跟Milvus差距不大,主要看你embedding模型选得好不好。倒是Milvus那套分布式配置,新手光调参数就得劝退一半人。等数据真到千万级再迁移也不迟,那时候你早就清楚自己的瓶颈在哪了。
四五百条确实有点尴尬,量级卡在“能跑通流程”和“产生可感知变化”之间,我试过类似规模的任务,微调完指标曲线看着在降,但实际生成的句子跟base模型比也就是措辞风格微调,核心逻辑该错还是错。数据量这事我觉得关键不在条数,而在覆盖度——你这几百条里如果某个意图占了八成,模型很容易学到的是“偏好”而不是“规则”,换到没见过的输入自然就露馅。参数方面建议你先别动学习率,把轮数拉到5-8轮看看loss是否还
我之前也踩过类似的坑,先别急着怀疑DeepSeek那边,大概率还是本地服务或者网络链路的问题。你既然能确认端口和防火墙,那下一步建议抓个包看看,或者直接用curl模拟一下MCP的HTTP请求,确认是TCP层就连不上还是应用层超时。另外FastMCP默认的传输方式我记得是stdio,如果你用的是HTTP模式,那得检查一下你启动服务时是不是绑定了127.0.0.1,而Inspector那边访问的是lo