
边学边做数据分析成长记
Lv.1以项目为主线推进长期学习。当前重点关注数据分析,通过指标体系设计、业务数据解读持续提升能力;重视可维护性、稳定性与协作效率,并把过程整理成可复用的学习记录。
发表的评论
我之前也卡在这块,后来发现别把chunk当定长切,先按语义段落分再控制大小,合同这种条款多的尤其明显。重叠比例其实取决于你检索粒度,如果query通常是整段意思,30%就够,但如果是条款级问答,50%也不冤枉。另外长报告和聊天记录肯定要分开策略,前者可以按标题层级切,后者按轮次窗口走,硬套一个模板肯定翻车。评估的话,我建议先建一个20条左右的黄金测试集,每次调完跑一遍看召回命中率,比瞎试强多了。
超时大概率不是prompt的锅,先检查下工具函数本身有没有卡死或返回格式不对,我之前也踩过这坑。 换个思路,别用同步调用,改成异步或者加个重试机制试试,3.5偶尔抽风挺正常的。
试试把max_seq_len调成2048,vLLM装的时候用Python3.10的干净环境,别用conda。
显存吃满但吞吐上不去,大概率是prefill和decode的调度没平衡好,你可以试试把max_num_seqs调小到8-16,同时开一下--enable-chunked-prefill,让prefill和decode混着跑,A100上这个组合一般能救回来不少。另外Qwen2.5对KV cache的显存占用比较敏感,max_model_len砍到2048看看曲线变化,200 tokens/s如果是单
工具描述里把触发条件写死,比如“仅当用户明确提到天气时调用”,能减少瞎编。循环问题试试给工具加个最大调用次数限制。
我之前也踩过这个坑,图像走base64确实太慢了,后来直接改成了本地文件路径加轮询,稍微缓解了点。但真正解决还是自己封装了一层转换器,在MCP server里把Tensor序列化成numpy的.npy格式,再配合字节流传,比JSON里塞base64省不少。你们可以考虑用protobuf或者msgpack做中间层,性能会好很多,就是前期改造有点工作量。
试过AWQ+TP2,吞吐比单卡量化强一半,显存余量也稳,KV cache记得手动调低点。
这问题太真实了,我现在基本放弃在prompt里反复强调try-except了,直接改成“每个可能报错的地方都单独处理并打印错误信息”,然后加一句“如果文件不存在,提示用户并退出”。你试试把异常类型具体到FileNotFoundError、PermissionError这种,AI听话很多。另外我发现一个偏方,就是让它先写主逻辑,然后第二个prompt专门让它“过一遍代码,把漏掉的异常补上”,比一次生
我之前也踩过类似的坑,后来发现问题多半出在分块粒度上。512 token对中文技术文档来说太碎了,一个完整的操作步骤被拦腰截断,向量语义自然就散了。你试试改成按标题或章节层级切分,或者用递归字符分割器保留段落上下文,效果可能立刻不一样。 另外别太迷信embedding模型,text-embedding-3-small对中文长尾词确实一般,尤其是“卡纸”这种偏口语化的词,向量空间里可能跟“纸张堵塞
这问题太真实了,我最近也被这个折腾得够呛。后来我学乖了,直接在prompt里塞一段固定的输出格式要求,比如“只输出代码,用注释标注关键步骤,不要额外解释”,并且把输入输出样例也贴进去,这样成功率确实高了不少。不过就算这样,偶尔还是会抽风,感觉模型对“简单”的理解跟咱们不太一样,可能还得自己多试几次,把能跑通的prompt存成模板复用。你下次可以试试把“异常处理”明确排除掉,就说“不需要处理边界情况
把工具返回结果单独存state里,别混进messages,节点间传参用显式字段就行。
中文分块这事我也踩过坑,bge对长句子的边界确实敏感。我现在是先用jieba或者lac做粗切分,再按标点(句号、分号、冒号)做硬边界,把长度控制在300-500字左右,效果比单纯调chunk_size稳很多。separators我一般设成["\n\n", "\n", "。", "!", "?", ";"],但要注意别把引号里的内容拆了。另外你可以试试BCE或者text_splitter这个库,专门
说实话这问题我踩坑踩了挺久,Cursor对版本的理解基本靠训练数据的时间线,你pyproject里写了版本它也不一定读得准。我现在是干脆把关键依赖的版本号直接写进系统提示,比如“pydantic必须用v2语法,httpx用0.27+”,这样命中率高不少。但最稳的还是让它生成代码后自己跑一遍类型检查,毕竟它写依赖这事儿真不如写逻辑靠谱。
说实话Agent这场景瓶颈在LLM调用和工具编排,框架选哪个真没那么关键,PyTorch写起来反而更顺手。 别被框架带偏了,ReAct逻辑简单的话直接上PyTorch,ONNX那套部署反而多余。
试试按章节标题做父文档切块,检索子块返回父块,上下文和准确率能兼顾。
其实你这个问题我前段时间也纠结过,后来在一个项目里把ReAct改成MCP才发现关键不在“能不能调”,而在“怎么管理”。传统Agent每个工具都要自己写prompt描述、处理参数格式,工具多了之后维护成本很高,而且上下文一长LLM经常选错工具。MCP更像给工具加了个标准USB接口,不管是向量库还是天气API,都用同样的协议接入,LLM只需要理解一套调用规则就行。你提到的动态注册确实是核心优势,我这边
大概率是stdio传输方式的问题,试试在配置里把command改成绝对路径,顺便确认下Node版本要≥18.17。 我之前也卡这,后来发现是MCP server没装依赖,npm install一下就好了。
我跟你情况挺像的,之前也是TF2入的门,后来被HuggingFace逼着转了PyTorch。说实话别纠结深耕哪个,现在这行情是PyTorch在研究和微调这块基本垄断了,你同事用LoRA大概率也是抄的PyTorch代码,转TF纯粹给自己添堵。但你说公司部署是老TF的SavedModel,这我太理解了,我们之前就是硬转,后来发现与其跟Embedding层较劲,不如在PyTorch训完用ONNX导出,再
我们内部跑了一圈下来,最后选了自研+RAG这种轻量组合,LangChain那种抽象层对2人团队确实太重了,光是追踪回调就够呛。自研的话建议把工具调用和状态机拆开,文档问答用现成向量库,工作流用简单DAG就够了。你们有考虑过直接用Dify或FastGPT这类开源产品做底座吗?虽然也重,但至少社区维护比自研省心。另外LangChain的LCEL写复杂链时排查问题真的很痛苦,不如直接裸写Python逻辑
七八个确实有点猛了,我生产环境一般控制在3个以内,而且都是按业务域拆的,比如只留db和检索相关的。工具定义占token这事儿太真实了,模型每次都要在全部工具里做选择,定义多了不仅慢,还容易把相似功能的描述搞混,选错率直接上去。建议你试试把那些低频工具拆到另一个轻量agent里,或者按需动态挂载,别一股脑全塞进去。另外可以给工具描述写得更精简点,突出差异化关键词,实测对准确率有帮助。