
树懒收集工具日记
Lv.1表面轻松,遇到问题会认真追根究底。关注技术学习与项目实践,主要分享方法总结、工具使用体验和日常踩坑;希望内容既讲清为什么,也说明怎么做。这里不卖焦虑,只分享方法和真实经验。
发表的评论
切块512确实有点粗暴,我之前试过按语义段落切,配合重叠窗口,召回质量明显好一截。另外你说的“看起来相关但答非所问”,大概率是embedding对意图粒度不敏感,reranker基本是必上的,别省。至于意图改写,我觉得先看你的query是不是偏口语化,如果是,改写会有帮助,但优先级不如前两个。调试路径的话,建议先拿20条典型bad case,人工看是切块问题还是排序问题,再针对性动刀。
说实话你这情况太典型了,Cursor在代码量上去之后确实容易“自作聪明”,我建议你把它当结对编程的实习生而不是主力,核心逻辑还是得自己把控。频繁commit是必须的,但更重要的是每次让它改代码前,先在对话里明确说“只改XX函数,别动其他文件”,再配合git diff检查它到底动了啥。另外那种大重构千万别让它一次干完,拆成小步骤一步步来,出错了也好回退。我现在基本是Copilot补全简单代码,Cur
之前也踩过这个坑,固定长度切分对标题层级强的文档确实不友好。建议先按markdown或HTML标题做结构切分,再对长章节按语义段落二次拆分,overlap设个100-200字符就够。另外你embedding的是纯文本还是带元数据?把标题和章节路径拼进content里检索效果会明显提升,可以试试。 --- 这种问题多半不是chunk size的锅,而是检索策略太单一。我后来是先把文档按语义块切好
all-MiniLM-L6-v2跑中文是真的不行,它本身对中文语义的理解就偏弱,尤其长文档里那种细节指代,检索出来基本靠猜。你换bge-m3的话,3090跑起来其实问题不大,它虽然参数看着多,但实际推理时显存占用也就7-8G,你7B生成模型都跑得动,这个肯定没压力。不过我觉得你真正该想的不是单换embedding,而是看你的chunk策略是不是有问题,512的chunk对细节定位反而可能太粗,试下
3000条数据一个epoch太少,先跑3-5轮看看,另外rank值试试16或32。
检查点+bf16本来就慢,序列打包还容易让loss震荡,建议先拆开逐个调,别一把梭。
说实话你这速度不太正常,4080的带宽虽然比不上4090,但跑7B 4bit不至于只有5-7 tokens/s。我怀疑你llama.cpp的线程数没调好,或者是没开GPU offload,试试把-ngl设成99,让所有层都进显存,CPU只做采样,速度能翻好几倍。至于VLLM还是TGI,你要是只做内部API,延迟敏感的话VLLM会更合适,它对连续批处理优化得更好,但16G显存跑7B稍微有点挤,得把m
你这情况我太熟了,之前我们搞内部知识库也栽在召回上。后来发现问题不在chunk和embedding,而是query和文档的表述方式差太远,比如手册里写“服务启动失败”,用户问的是“为啥起不来”,语义检索根本匹配不上。建议你先对真实query做个badcase分析,看看是不是这个原因,另外试试给每个chunk加上关键词摘要,或者搞个query改写模块,比单纯调参管用得多。
rerank的作用是在一堆候选里挑相对靠谱的,但源头top20就偏了的话,它确实无能为力,毕竟巧妇难为无米之炊。你这情况我建议先试试query改写,把“CMS”根据对话历史或领域词典扩成“合同管理系统”,效果可能会立竿见影。混合检索也值得加,BM25对精确术语匹配很敏感,能补向量召回漏掉的。微调reranker成本不低,但如果你领域术语很集中,且数据能搞到几百条标注pair,倒可以试一次,不然先别
24G跑7B按理说真够,但你这OOM大概率不是显存不够,是加载时峰值爆了——transformer库默认会一次性把整个模型载入显存,所以low_cpu_mem_usage其实没解决根本问题。我之前也是3090,试过最稳的办法是先加载到CPU,再用accelerate的device_map="auto"让模型自动分配层到GPU,这样能省不少峰值显存。bitsandbytes报错那个setup.py问
说实话这两个我都用过一阵子,最后留在Qdrant这边了。Milvus功能确实全,但部署和运维成本真不是闹着玩的,尤其你如果只是中小规模场景,光是把那些组件理清楚就够喝一壶的,而且版本升级时踩过的坑能写篇小作文。Qdrant给我的感觉就是轻量直接,Rust写的就是快,单机模式起步特别顺,而且它的filter和payload设计比Milvus直觉多了,写查询的时候脑子不用绕弯。 不过Qdrant也不
说实话,我试过一圈下来感觉分层缓存才是正解,短期用完整对话保上下文,长期用向量库只存关键实体和偏好。你那个吃辣的例子,得在存记忆时就把用户偏好抽成结构化字段,比如spice_level=high,而不是存原句,这样召回才能命中。摘要压缩我也踩过坑,现在只让它压缩超过N轮的旧消息,价格人名这些强制留在raw里。另外图结构看着美但工程复杂度太高,小团队真没必要硬上。
模板优先级没那么玄乎,本质就是拼进系统提示词里,不如直接在客户端侧做后处理校验更稳。
几百万量级Qdrant完全扛得住,部署省心太多,Milvus光运维就够你喝一壶的。HNSW的M值调到32就够,efConstruction别超过200,不然索引建到怀疑人生。
同感,Chroma简单但filter确实鸡肋,我后来换Qdrant了,几千到几十万过渡挺顺,部署也不算重。
别纠结纯靠prompt了,模型输出JSON这玩意儿天生就不稳定,尤其字段一多更爱抽风。我之前也踩过这坑,后来直接在后端套了个修复层,用正则把多余逗号清掉,再补缺失的引号,实在解析不了就让模型重试一次,基本能救回来九成。function calling确实靠谱得多,起码结构是强约束的,字段不会凭空消失,不过也得自己写校验逻辑,别全信它返回的东西。你要是想省事,可以试试先让模型输出markdown代码
7B做工具调用确实吃力,换14B或者带function calling的模型会稳很多。vLLM倒不是必须,先把模型换对再说。
2个点确实偏多了,尤其是你校准集都上了500张还这样。我怀疑问题不在FP16本身,而在你转ONNX时有没有把某些层固定成FP32,比如BatchNorm折叠或者一些对精度敏感的op(像Resize、Softmax)在TRT里可能被强制转成FP16了,你可以用polygraphy逐层对比一下FP16和FP32的输出差异,定位到具体是哪几层炸的。另外分割任务对数值精度确实比分类敏感,因为mIoU是像素
固定500字符确实太粗暴了,表格和页眉页脚这种噪声直接会被切进块里。你试试按文档结构走,先解析出标题和段落,用markdown标题做父子分块,父块存上下文,子块做检索。另外BM25加向量检索这个思路靠谱,混合检索能补上关键词匹配的短板,但建议先解决分块问题再调检索。
其实7B AWQ4bit看着显存不大,但多工具调用时每个工具的schema和中间结果都会额外吃KV cache,而且Agent循环里如果没手动清历史,缓存会越积越多。我之前也踩过这坑,后来改成每轮对话后强制释放一下缓存,或者把max_tokens调小点,情况好很多。你用的什么推理框架?vLLM还是llama.cpp?有些框架对显存碎片处理确实差不少,换一个说不定就解决了。