
深夜商业学习簿
Lv.1主要整理商业分析相关的学习笔记与工程经验,内容覆盖需求分析与方案设计、项目推进与复盘。注重把个人踩坑沉淀成可复用的方法,希望把复杂问题讲清楚、把实践步骤写完整。
发表的评论
并发串历史这个坑我们也踩过,最后是每个会话单独存Redis,用session_id隔离,LangChain那套memory直接弃了。工具调用失败建议包一层tenacity做指数退避重试,再加个fallback返回兜底文案,别让chain整个挂掉。状态管理确实LangGraph更靠谱,但学习成本不低,小团队自己撸个状态机也够用。
loss跳成这样大概率是长文本截断把对话截坏了,1500token一刀切下去,模型看到的context前后不连贯,梯度自然炸。建议先按长度分桶采样,把超长样本单独处理或者用packing,别硬截。lr 2e-4对7B的LoRA偏高了,试试1e-4甚至5e-5,warmup拉到300步看看还跳不跳。rank和alpha倒不是主因,r=8或16都够用,先把数据这块理顺再说。
我一般会按语义切而不是死磕固定长度,比如用段落加句子边界检测,太长的段落再按句号拆。512确实召回准但容易断章取义,1024又稀释了关键信息,所以我现在是300-500加50-100重叠,效果比较平衡。滑动窗口重叠挺有用的,尤其跨段落的逻辑衔接不容易丢,但重叠别太大不然检索结果会重复得厉害。你可以先拿一批真实query做小规模评测,看召回片段里有没有完整答案,再反过来调chunk和overlap。
我之前也踩过类似的坑,直接换embedding模型不一定能解决,问题很可能出在分块和检索逻辑的匹配上。你固定500字或按段落切,对于合同这种条款密集的文档,很容易把不同语义的句子硬凑成一块,导致向量区分度不够。建议先试试按章节+句子边界做重叠切块,比如256字带32字重叠,然后对检索结果做rerank(哪怕是简单的MMR),比单纯调top_k管用。至于bge-large-zh,中文长文本里算够用的
我最近也踩过类似的坑,一开始给Agent定的规矩越多,它反而越容易在无关紧要的地方纠结。后来我发现System Prompt更像是个“边界”而不是“操作手册”,你越是想把每一步都写死,模型就越倾向于机械执行,根本顾不上理解用户的真实意图。我现在的做法是只保留几个核心原则,比如“默认假设用户需要简洁答案,除非明确要求详细”,然后所有额外规则都塞进用户消息的动态上下文里,让模型自己判断什么时候该触发。
我之前也踩过类似的坑,后来发现其实两个因素都有,但更可能是分块粒度太粗暴了。你这种技术文档里,连接池参数和报错日志往往隔得不远,300字一块很容易把语义重心带偏,试试按标题或代码块边界切分,或者先用LLM提取关键句再检索。另外bge-m3对长文本的语义区分不够细腻,top-20里混进噪音也正常,可以换成bge-large或者试下混合检索,BM25和向量加权之后,相关片段排名会明显上浮。你现在的重叠
我们组之前也纠结过这个问题,最后是拿LangChain当参考文档用,实际逻辑自己写了个轻量调度器,只用了它的Tool抽象和回调,其他全砍了。你这需求对接三个系统,建议别硬套框架,把每个API封装成独立函数,自己维护个状态机反而好调试。长期记忆我们直接塞了向量库,但只存对话摘要和关键实体,完整记录放Redis带过期时间,不然上下文一长token开销扛不住。
模板真得按业务场景反复磨,我调客服prompt时发现少给点约束反而更稳,复杂了就容易瞎编。 我们也是踩过坑,角色设定加一两句就够,重点把回答格式和边界写清楚,推理速度基本没影响。
你这情况太典型了,我一般是用Aider配合git来做,给它设定好只允许编辑特定函数,然后每次改动完直接看diff,不对就undo,比手动回滚快多了。另外试试把要改的代码块单独复制到一个临时文件里让它改,改完再贴回来,这样它就没机会碰别的了。Cursor确实容易在长上下文里跑偏,换agent模式可能也只是换个方式跑偏而已。
说实话我觉得你这个问题卡在检索质量上,微调反而容易把模型带偏。我之前试过类似场景,负样本加太多会让模型变得过于保守,宁可拒答也不给正确信息。 建议先拿你那个“报销流程”的例子做一下bad case分析,看是embedding模型的分块粒度问题,还是query和文档的语义匹配不对。你可以试试在召回后加一个rerank模型,或者用LLM做个快速的相关性打分,比直接微调便宜得多。 微调更适合让模型学
建议主攻PyTorch,TF能跑通部署就行,大模型生态差距只会越拉越大。 我们生产环境两个都跑,但新项目全用PT,TF只维护老服务,转换问题真没必要硬吃。
遇到过类似的坑,后来发现是DDP初始化之后忘了调model.train()之前把梯度清零,但你这个loss不一致更像是通信没建立起来。建议先确认一下torch.distributed.is_initialized()是不是True,还有nccl后端有没有正确加载,1.12版本对nccl的兼容性有点迷。另外tcp://那个init_method别用localhost,多卡要写实际IP,env://的
这现象挺常见的,LoRA微调本质是让模型在格式上过拟合了,但推理链和工具调用的规划能力反而被稀释了。我之前试过把工具描述和few-shot示例混进微调数据里,效果会好一些,但复杂任务还是得靠外部编排逻辑兜底。你试试给原版模型加个结构化输出约束,或者用思维链提示词引导,可能比微调更省事。另外几百条数据对8B模型来说太少了,样本多样性不够很容易学偏。
这问题我踩过坑,后来发现根本解法是给MCP工具加个“分页返回”参数,配合检索端做rerank,只把最相关的前几段传过去。你那个“总结全文”的需求,其实可以单独做个map-reduce的MCP工具,先分段总结再合并,比硬塞大块文本靠谱多了。
这情况我遇到过,rank调到16加足量工具调用数据试试,loss正常不代表格式学对了。
这问题太真实了,我调RAG的时候也踩过这个坑。切块策略确实得跟着文档结构和问答类型走,产品手册这种半结构化文本,我后来是先用标题做章节切片,再按小节内段落合并,比纯固定token靠谱很多。另外建议你加个召回后的重排序环节,比死磕切块参数对效果提升更明显。至于评估指标,别只看单点准确率,可以统计一下答非所问的比例,还有抓取到的上下文里关键词命中率,能帮你判断是切碎了还是切断了。
说实话Trae那个端侧模型补全速度是真的爽,但复杂任务还是得看CodeBuddy的agent,俩都装了轮着用。 国产工具卷起来对我们好处最大,反正我现在已经把订阅Cursor的钱省下来吃火锅了。
本质区别不在“Tensor”这个名字上,而在背后的执行哲学:TF的Tensor更像一个待编译的符号节点,你得先定义整个计算图再喂数据;PyTorch的Tensor就是个活生生的数组对象,你写一行它算一行。关于numpy转换,两边都默认是copy,除非你显式用`from_numpy`或者`tf.convert_to_tensor`且保持内存连续,但跨框架几乎不可能零拷贝,因为内存对齐和分配器都不一样
我之前也遇到过类似情况,本地工具和远程API的成功率差一大截。后来发现主要不是模型问题,而是微调数据里远程工具的调用格式太单一了,真实场景里参数嵌套和可选字段的组合多得多,LoRA rank=8可能学不够。建议你抽点线上日志看看失败的参数错在哪,是类型不对还是缺字段,针对性补几条难例。另外system prompt里明确写死每个工具的必填项和示例格式,有时候比微调还管用。
500条数据喂7B确实少了点,风格模仿建议先拿几百条做few-shot试试,别急着训。 [INST]标记没问题,但loss卡1.8更像是学习率没配好,试试1e-4加warmup。