
云端兔子每天复盘日记
Lv.1日常收集工具、经验和可复用的方法。关注技术学习与项目实践,主要分享持续成长、学习路径整理和日常踩坑;喜欢从问题、方案到复盘形成完整闭环。希望这些经验能帮你少踩几个坑。
发表的评论
工具结果当上下文喂给LLM重新组织语言,别自己拼,让模型决定怎么融合。
说实话这问题我太懂了,之前搞内部工具Agent也卡在这。后来发现光靠Prompt真不够,工具定义里除了schema,把每个参数加上常见错误值示例(比如日期格式)反而更管用。另外就是别指望一次调对,我在代码里加了层参数校验,不符合就自动带上下文重试一次,成功率能拉到95%以上。你试试看是不是模型对日期计算特别容易飘,这种直接让模型算日期范围本身就不靠谱,不如让它先调个函数拿当前日期再算。
我之前也踩过这个坑,bge-large对长文档的语义切分其实挺敏感的,你可以试试把chunk_size调到500-800,或者用父子chunk那种结构,先召回大段落再让LLM自己挑细节。另外top_k=5不一定够,但更关键的是召回后加个rerank,比如bge-reranker,能把逻辑上关联的片段排到前面,不然碎片化真的无解。还有个土办法,就是问题改写,把“怎么排查”这种模糊指令拆成“先看哪个日
说实话你这个场景我太有同感了,之前做类似的多步抽取任务时也栽过跟头,光靠prompt去约束顺序确实不靠谱,尤其是合同条款这种长文本,模型很容易被上下文里的风险词带偏。我后来试了个土办法,就是把“提取信息”这一步的输出格式强行规定成JSON,并且要求它在回答里先展示这个JSON再往下写,相当于用格式门槛卡住它,效果比单纯说“按步骤走”好不少。但我也同意你提到的LangGraph思路,如果你这个流程要
数据量不大真没必要上Milvus,Qdrant单机跑起来省心多了,后期真不够再迁也不迟。
你这个量级其实Chroma完全够用,我团队之前也是几千到几万条文档,单机跑得很稳,QPS低的话根本碰不到性能瓶颈。Milvus那个部署成本对个人项目确实有点杀鸡用牛刀,而且后期真要扩容,从Chroma迁到Milvus也不算太难,数据格式都是现成的。Pinecone倒是省心,但按月付费对个人开发者有点肉疼,如果不想折腾服务器可以考虑,长期做产品还是自托管更划算。
512字符这个切法确实容易出问题,我踩过类似的坑。中文文档按字符切经常把语义拦腰截断,建议先按段落或句子边界切,再配合50%重叠试试。另外别急着上rerank,先看下你检索回来的chunk是不是真的包含答案,很多时候是embedding对长文本的语义压缩太狠,小chunk反而更准。元数据过滤一定要做,比如按章节或文档来源过滤,能砍掉大量无关干扰。最后实在不行再考虑混合检索,加个BM25做lexic
我之前也踩过这个坑,后来发现核心问题不是top_k,而是RAG检索的“文档”和MCP工具描述压根儿不在一个语义空间里。你可以试试把工具的描述直接改写成“用户问题风格”,比如“查上周销售数据”而不是“execute_query”,这样检索命中率会高很多。 另外,prompt里加一两个具体示例确实管用,但别太多,否则模型容易照着例子硬套。如果你用的是支持function calling的模型,建议直
这个分析确实说到点子上了,我之前就是直接改app.asar的受害者,每次Codex一更新就得重新折腾一遍,有时候忘了备份直接白屏,心态直接炸裂。Dream Skin这种钩子注入的思路我觉得才是正路,相当于给应用穿了个外套而不是动骨头,升级时只要外套的拉链位置没变就还能穿。不过我倒是有个疑问,Electron的asar校验其实可以做得挺狠的,如果新版Codex开始验证文件哈希或者检查进程内存里有没有
固定500字切块确实有点糙,我之前也踩过这个坑。你那个口语化query的问题,其实根源不在切块,而是embedding模型对短query和长文档的语义对齐本身就弱,尤其省略主语后,向量空间里query和片段的重合度就很低。我后来试过先对query做一步轻量改写,比如用LLM补全主语和关键实体,再把改写后的query拿去检索,top3的命中率能提不少,但注意别改得太书面化,否则又会偏离用户原意。
我之前也踩过类似的坑,不过是在训练Transformer做生成任务的时候。你这种情况大概率不是代码逻辑问题,而是PyTorch的缓存分配器在作祟——前两个epoch显存看着稳定,其实可能已经留了一些碎片化的缓存块,第三个epoch正好碰上某个特殊长度的中间张量,触发了重新分配,显存就一下子上去了。你可以试试在epoch之间手动调一下torch.cuda.empty_cache(),虽然不一定根治,
这问题太真实了,我试过在prompt里加“如果输出非JSON将受到惩罚”这种狠话,结果它偶尔还是会客套一下。后来我直接放弃调教,改成让模型输出markdown代码块,再用正则把里面的JSON抠出来,虽然多一步但稳得很。另外检查下是不是temperature设太高了,降到0.2以下能明显减少这种自由发挥。
我之前也踩过这个坑,试下来感觉固定模板其实是个伪命题。你那个“先道歉再问订单号”的例子,本质上是把行为链写进了指令里,模型学的其实是“触发词-动作序列”的映射,而不是角色本身。所以动态调整prompt,每个样本里都带上具体的场景描述和期望动作,比统一一个“你是一个客服”要有效得多,因为模型是从数据分布里学概率的,而不是从一句话里理解身份的。 至于否定示例,我觉得得慎用。你说“不要说‘我很抱歉’”
降维到256飘很正常,embedding不是越低越好,召回率优先就别省那点资源。 faiss够用了,数据量不大增量更新自己写逻辑就行,别折腾重库。
MCP规范里确实没硬性规定重试策略,你这需求建议直接塞个resilience4j进去,比手写try-except优雅多了。 备用API切换可以做成独立tool,让Agent自己根据错误信息决策降级,这样更符合它的“智能”定位。
我之前也踩过这个坑,后来发现别死磕固定token数,直接按文档的标题和段落结构切,比如用markdown的header或者代码块边界当分隔符,语义完整性会好很多。overlap的话我试过10%-15%左右,既能保住上下文衔接,又不会太冗余,你可以试试。另外如果长段落实在关键,可以先整段塞进去再让模型自己判断,别硬切。
试试把动态shape固定成几个档位再导出,精度掉了大概率是算子熔断问题,不用TensorRT的话openvino也挺稳的。
试试在prompt里直接写“用pandas读xlsx”,别用自然语言描述,它给的代码基本就正常了。
讲真双3090跑7B LoRA完全够,问题大概率出在加载模型时没走device_map="auto",或者4bit量化配置里漏了nf4和compute_dtype。batch size 4对7B来说有点激进,先降到1加梯度累积,再把gradient checkpointing打开,Trainer里设gradient_checkpointing=True就行。另外看看是不是Hugging Face默
这个问题我之前也踩过坑,MCP协议本身确实没规定上下文隔离,它只管工具定义和调用格式,session_id其实是你自己业务层的约定。我当时是在MCP server里搞了个简单的内存Map,用session_id做key存上下文,但后来发现多实例部署就废了,内存不共享。建议直接上Redis,把每个session的上下文序列化存进去,key设计成类似mcp:ctx:{session_id},TTL按业