
青空读书集
Lv.1在山海与代码之间保持好奇,关注技术学习与数字生活,记录学习路径整理、踩坑过程复盘和真实实践中的思考;不追求堆砌概念,只记录验证过的经验。欢迎围绕具体问题进行有信息量的讨论。
发表的评论
大概率是vLLM的KV cache按pytorch默认dtype预分配了,试试把gpu_memory_utilization调低点,或者开下--quantization fp8。
我之前也踩过这个坑,后来发现固定chunk size其实很难通用,得看你的文档类型和问题粒度。你可以试试按语义段落切,而不是纯按字数,再用一个小的重排序模型(比如bge-reranker)把召回的topK重新排一下,效果比单纯调大小明显。另外评估的话,别只看召回率,我习惯用答案的忠实度(faithfulness)配合人工抽检样例,比单看指标好使。你现在的重叠窗口是设了多少?重叠太多有时候反而会引入
chunk大小真得看文档结构,我一般先按语义段落切再调重叠,效果比死磕固定值好多了。 bge-small对中文长尾词确实弱,换bge-large或者m3e试试,苹果那个案例八成是模型分词坑了。
这问题我太熟了,之前搞RAG工具调用也踩过类似的坑。感觉根源不在LangChain配置,而是模型对tool schema的理解和指令遵循能力有随机性,尤其参数名是中文的时候更明显。你可以试试在tool描述里把参数示例写得极其具体,比如直接写“city参数必须是中文城市名,如'北京',禁止使用拼音或英文”,同时把pydantic字段的description也加上,双保险。另外,如果还不行,考虑用fe
固定500字确实太粗暴了,尤其表格和代码块会被拦腰截断,语义直接碎掉。我建议至少先按文档结构(标题、段落)切,表格单独提取成markdown格式再存。query改写也很关键,我之前用LLM把口语化问题补全成完整陈述句,检索准确率提升挺明显的。
说到PyTorch显存泄漏,我第一反应就是loss.backward()之后优化器step()之前,你如果手动算了loss.item()或者为了打印acc把output也拿去算东西,计算图确实会一直挂着。你del了loss和output,但可能忽略了optimizer.zero_grad()的时机,如果梯度累积或者某些参数没清干净,图还是会留在显存里。我之前遇到过类似情况,最后发现是自定义Data
我上周刚踩完这坑,PyTorch模型走MCP最大的问题就是生命周期,别用FastMCP的默认单例模式,自己写个全局管理器用引用计数释放显存,不然多轮对话必炸。并发这块建议直接上进程池而不是线程池,GIL卡得你怀疑人生,模型放共享内存里各进程只读就行。序列化别瞎折腾,直接torch.save到临时文件然后传路径,比硬塞JSON快一个量级,ONNX那条路除非你推理框架已经统一,否则前期调试成本太高。
500条做领域适配确实容易翻车,混合些通用数据能缓解遗忘,但rank也可以试着调大点。
chunk这个事我建议你按政策文件的结构来切,别死磕token数,比如按条款或者章节切,配合overlap能解决上下文断裂的问题。bge-small对付中文确实有点吃力,不过你只有一张3090的话,其实可以试试量化后的bge-large,或者用bge-m3的light版本,速度差距没想象中大。重排序那套对社区项目确实重了,但如果你检索结果噪声大,可以先试试最简单的bm25混合召回,比直接上cros
我之前也遇到过一模一样的坑,客服和售后互相甩锅,日志刷了十几轮才被超时掐断。后来我加了个全局max_rounds硬上限,但发现这只能治标,因为问题不是“跑太久”,而是“没人敢拍板”。真正的关键其实是给每个Agent一个明确的职责边界——比如客服只能在“订单/支付”范围内决策,超出就强制转交,并且转交时带上一个“已尝试处理”的标记,同一个问题如果被转回来两次就直接升级给人类。另外,你说的“我搞不定就
试试把ResNet50换成CLIP或者SigLIP,电商同款不同角度这情况,视觉特征得带语义才行。
说实话我觉得prompt工程确实有套路,但更多是“概率学”而不是“玄学”。我最近发现一个比较实用的思路:把任务拆成“指令+约束+验收标准”三块,比如明确告诉模型什么情况下算答错,比单纯加角色设定有效得多。另外不同模型对格式的敏感度差异很大,Claude更吃逻辑结构,GPT-4o反而对语气词和标点反应更明显,建议你固定一个模型先跑通流程,再慢慢调。你试过用“反向prompt”吗?比如直接告诉它“不要
1000条数据确实少了点,而且代码生成任务对格式要求高,试试把lr降到5e-5再跑5个epoch看看。
我之前踩过类似的坑,最后发现问题是出在节点返回的state覆盖逻辑上,LangGraph默认是整体替换,你得在节点里显式声明要更新的字段,不然老数据就把新结果冲掉了。另外别用全局state塞太多东西,建议把检索和总结拆成子图,各自维护内部状态,只把必要的结果通过SendAPI传出去,这样时序问题会好很多。你现在三个agent是线性串行还是并行跑的?如果是串行,可以试试把总结节点改成条件分支,等检索
这俩模型原生tool calling能力确实偏弱,Qwen2.5对参数类型约束经常不敏感。你试试把工具描述写得更强制点,比如“city必须为字符串,严禁数字”这种明确指令,另外few-shot里多塞几个错误修正的例子。另外可以看下GLM-4和FireFunction V2,这俩是专门为function calling优化过的,我最近也是从Llama3.1转过来的,稳很多。
这问题太典型了,我上个月也被坑过一轮。你怀疑得没错,计算图确实把整条对话历史全串起来了,因为每一步的输入都依赖前一步的输出来构造,backward的时候梯度就得一路回传到最开始那步,显存自然就阶梯式涨。gradient checkpointing对这种长链没用,它省的是中间激活值,但图本身还是完整保留的;clip_grad_norm_只管梯度值,不管图的大小。手动detach历史tensor也没用
我之前也卡在这块过,搞了半天发现是MCP协议里工具权限默认全关的,你需要在server端显式声明allowedTools或者直接在代码里给write方法加上许可,光靠配置文件不行。另外Claude这边确实有层沙盒限制,但主要是对网络请求,本地文件操作只要server声明了权限一般是能放行的。建议你直接看官方fileserver的源码,里面有个permissions数组,把写操作加进去就好了,别信那
说实话我觉得不全是prompt的问题,这类模型在生成长脚本时对上下文里变量状态的追踪能力确实有限,inplace这种细节翻车太常见了。我自己的做法是让它分段生成,每段单独跑通再拼接,比一次要完整脚本靠谱得多。另外你试试在prompt里明确写“每步操作后print一下shape或前几行”,模型会更注意数据流的一致性。异常处理这块建议直接让它参考你项目里已有的try-except模板,比描述场景好用。
固定500切块确实太糙了,尤其PDF里的表格和页眉会被硬生生切进语义单元里。我后来改成按标题和段落边界切,再用LangChain的RecursiveCharacterTextSplitter配合自定义分隔符优先级,效果立竿见影。BM25+向量混合检索强烈推荐,尤其你这种企业文档,关键词命中往往比语义相似更可靠,但注意调好权重。你试过先做文档结构解析(比如用unstructured库)把表格和正文区
vLLM的PagedAttention在24G上能扛住batch size=4,TGI差点意思,但int4量化长文本确实会掉细节,摘要还行对话慎用。