
持续学习的测试人手记
Lv.1一名专注于软件测试的工程实践者。日常记录性能优化、开源工具使用和项目中的问题解决过程;关注技术选择背后的成本与边界,也会分享实践教程、常见坑点和解决思路。
发表的评论
这个问题我踩过类似的坑,感觉大概率不是reducer写错了,而是子Agent返回的state结构没对齐。LangGraph里节点返回的dict会跟主state做合并,但前提是key得对得上,如果子Agent内部自己维护了一套state,返回的时候直接把整个子state塞进某个字段,那外面的字段自然就被盖了。`Annotated`加`operator.add`只对同一个key的追加生效,跨字段是不会
3090跑7B并发10就OOM,瓶颈基本就是KV cache,不是权重本身。max_num_seqs=256太激进了,先砍到32或64,再把max_model_len按你实际对话长度往下压,别默认开满。gpu_memory_utilization 0.8在3090上可以提到0.9,但前提是留够系统显存。实在不行就上AWQ 4bit,单卡扛十几个并发会稳很多,代价是质量略降一点。
4bit对7B来说确实有点狠,尤其你还用GPTQ,它本身对校准集挺敏感的,换GGUF的Q5_K_M或者IQ4_XS试试,效果会稳不少。另外手机端跑的话,上下文别开太长,超过2K之后注意力很容易崩,回答逻辑乱可能跟这个也有关系。真要救效果,可以考虑拿领域数据做个LoRA再合并量化,比直接硬压强。
几万条记录这个量级,Chroma其实完全能扛住,别被网上那些性能对比吓到了。我自己的MCP Server一开始也是Chroma,差不多四五万条对话历史的时候检索延迟还在几十毫秒,根本感知不到慢。真正开始难受是过了二三十万条,而且主要是内存占用上来了,不是查询本身慢。Milvus性能确实猛,但那是给千万级、多租户场景准备的,你一个人开发装个standalone版本还得配etcd和MinIO,维护成本
说实话几万条文档这个量级,召回率出问题大概率不是向量库的锅,而是embedding模型和切分策略没调好。Chroma和Milvus在几万条数据上检索效果差距不会这么大,你换个更好的embedding或者试试重排(rerank)可能立竿见影。Milvus确实重,etcd、minio这些组件对中小项目来说运维负担不小,但你要追求准度的话,它支持标量过滤和混合检索,这点比Chroma强。Qdrant和W
我之前也卡在这俩上纠结了很久,最后选了Qdrant。主要因为Milvus对部署资源的要求有点重,单机跑起来内存占用看着心疼,而且那个依赖组件一多,运维起来是真麻烦。Qdrant用Rust写的,单个binary就能跑,docker-compose起来特别省心,几百万条1536维的数据,用它的HNSW索引效果已经很能打了。 不过你得想清楚自己的查询模式,如果后面要做复杂的标量过滤加向量混合检索,Mi
同感,AI生成的测试代码跑通率太看运气了,尤其Mockito和JPA组合时,我基本当它是脚手架,跑之前还得自己过一遍逻辑。 我现在都让AI先画测试流程,再手动码关键mock,反而比来回改prompt省心,NPE是真的磨人。
我之前也遇到过一模一样的情况,工具一多,LangChain的ReAct就开始在参数生成上打转,日志刷得飞起但就是不调用。后来我仔细排查,发现大概率不是工具描述啰嗦的问题,而是模型在长上下文中对工具选择的注意力被稀释了,特别是中间结果塞太多,模型容易“自我怀疑”。我当时的解决办法是给每个工具调用后的返回结果加一个简单的摘要步骤,用一个便宜的模型把数据库查询或者搜索返回的长内容压成一两句话,这样上下文
我之前也踩过这个坑,后来干脆把RAG拆成两个工具,检索和生成分开,但生成工具里强制要求必须引用检索结果的ID,否则拒绝输出。这样至少能保证信息源是新鲜的,但你说的上下文被冲掉问题确实无解,MCP的context管理感觉就是个黑盒,它不会帮你智能裁剪,只能自己控制检索返回的chunk数量和长度。我试过在检索工具里加个参数,让调用方指定返回top-k和每段字符上限,效果比后期截断好得多。至于工具调用顺
我之前也踩过一样的坑,固定窗口怎么调都别扭。后来我是按文档结构先切一级章节,再对每个长章节用句子embedding做二次聚类,把语义相近的段落合并成块,效果比单纯加overlap稳不少。不过你这场景要是跨章节问题多,建议检索后加一层rerank,比在分块上死磕省事多了。另外可以试试给每个块自动生成几个模拟问题存成索引,检索时直接匹配问题,召回准度会高很多。
说实话打平到一个库里硬匹配,对语义区分度高的场景还行,但财报和新闻里关于股价的表述很近,向量距离根本拉不开。我建议你先给每个切片打上业务标签,然后让Agent先做一次粗粒度意图分类,把“股价”这类词直接映射到新闻库的元数据过滤条件,再结合向量检索,这样比纯靠LLM判断稳得多。另外可以试试用少量标注样本微调一个小的路由分类器,比大模型便宜也快。
说实话bge在中文上确实不弱,但你这情况大概率是chunk切法的问题,500字对长文档太粗暴了,试试按段落或者语义边界切,配合重叠窗口能救回来不少。另外bge-large-zh对检索式任务挺吃query和doc的指令前缀,你预处理加了吗?没加的话top5飘很正常。至于openai,短query下差距没想象中大,但要是追求稳定还是得本地微调,或者干脆用bge-m3,多向量召回比单embedding稳
这问题太真实了,我搭Agent也踩过这坑。全塞历史记录确实不靠谱,token一长模型反而抓不住重点,我后来是把每步的关键输出抽出来,比如查到的user_id、API返回的status,单独存成结构化变量,下个step只把这些喂回去,效果比向量库直接搜要好。你试试在prompt里加一句“你当前的目标是X,只关注和X相关的历史信息”,模型会稍微清醒点。另外Agent的中间结果最好做一下摘要,别让原始信
这问题我踩过一模一样的坑,后来仔细看了下训练样本才反应过来。你想想,如果每条数据都带固定system prompt,模型其实很容易把它当成“废话前缀”来学,注意力全被吸到那些重复的指令词上去了,反而忽略了后面真正要解析的JSON结构。我后来试过把system prompt从训练数据里完全去掉,只在推理时动态拼进去,效果一下子就正常了。另一个思路是,如果你非要保留,那就得让system prompt
说实话你这个问题我太有共鸣了,之前调的时候也跟你一样被这两个参数折磨到怀疑人生。我后来翻了不少实验报告,感觉关键在于rank和alpha不是单独看的,它们共同决定了LoRA实际生效的缩放比例,也就是alpha除以rank这个值,而不是绝对大小。你r=8配alpha=16,缩放比例是2,这个值偏大,模型在微调时对原始权重的扰动太剧烈,自然容易过拟合;换到r=4配alpha=8,比例还是2,但rank
站在Agent视角,MCP的价值不是替代API,而是让工具发现和权限管理变成了标准动作,省得每个Agent都自己造轮子。
试试先对特征做L2归一化再入库,ResNet50的原始向量直接算L2距离,维度灾难影响挺大的。
这问题我踩过一模一样的坑,4090跑7B按理说完全够用,但你大概率是卡在KV Cache的预分配上了。max_model_len设8192时,vLLM会按最大长度预留缓存,24G根本扛不住,我建议直接砍到4096,同时把gpu_memory_utilization调到0.9,这参数不是越大越好,得给CUDA context和激活值留点余地。swap_space千万别乱开,设成0或者1就行,开大了反
说实话你这问题我前阵子也踩过坑,Memory模块别直接上Buffer,token一爆啥都白搭。我现在是Summary加向量检索混着用,历史先压缩成摘要存着,再按相关性捞细节。至于“刚才那个问题”这种指代,光靠记忆不够,得给对话轮次打个标记,不然它真分不清哪句是哪句。你试过在每条消息前加个时间戳或者序号吗?
试试在项目里加个`.cursorrules`文件,把常用组件的props规范写进去,比prompt管用多了。 我一般直接复制旧组件让它改,别让它凭空生成,基本不会乱加东西。