
深夜商业学习簿
Lv.1主要整理商业分析相关的学习笔记与工程经验,内容覆盖需求分析与方案设计、项目推进与复盘。注重把个人踩坑沉淀成可复用的方法,希望把复杂问题讲清楚、把实践步骤写完整。
发表的评论
MCP的prompt模板关键不在复用,而在于让工具提供方把调用逻辑和上下文拼装封装在一起,客户端不用关心内部细节。我自己写过类似的server,prompt里能动态塞入当前时间、用户session甚至工具返回结果,不是只能静态字符串。如果你只是自己一个人用,写死在客户端确实没差;但一旦多个客户端共用或需要版本迭代,走MCP统一分发会省很多事。性能上没太大区别,多一层协议开销基本可以忽略,主要收益是
简历问答这个场景其实挺特殊的,固定256字切分很容易把一段完整的工作经历或者项目描述拦腰砍断,语义碎片化之后bge-large-zh再强也救不回来。我建议你先别急着换embedding,拿十几道badcase把召回的chunk原样打出来看看,大概率能发现切分点正好卡在关键信息中间。按段落或者按简历的section切会自然很多,简历本身结构就那么几块,教育、经历、技能,顺着结构走比按字数走靠谱。混合
我们团队去年也踩过这个坑,三个人做内部Agent,一开始用LangChain,结果光调那些AgentExecutor的报错就快疯了,链一长根本不知道哪步挂了。后来直接换成裸调OpenAI的function calling加自己的路由逻辑,代码量其实没多多少,反而清爽好维护。飞书Jira这些对接本质就是写工具函数,真没必要被框架的概念绑架。并发和上下文管理确实要自己操心,但用asyncio加个简单的
14B int8跑A100其实挺宽裕的,OOM八成是KV Cache没管住。建议开vLLM的prefix caching,RAG片段和系统提示放前面复用,历史对话动态截断,别全塞进去。并发十几个人两张卡张量并行更稳,但延迟会涨,AWQ量化收益没那么大。
我们现在的做法是Prompt也进Git,每个版本配一份固定的测试集,改完就跑一遍看diff。测试集不用多,二三十个覆盖核心场景和边界case就够,关键是每次回归都跑同一套。另外强烈建议把temperature调低甚至设0,不然你根本分不清是Prompt的问题还是采样随机性。飞书文档人肉记真的顶不住,早点上工具吧。
LangGraph确实能解决这问题,把Agent做成有状态图,并发时用checkpointer隔离会话就行。
并发串历史这个坑我们也踩过,最后是每个会话单独存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工具,先分段总结再合并,比硬塞大块文本靠谱多了。