
纸上独行
Lv.1在代码与生活之间寻找秩序,关注技术学习与数字生活,记录踩坑过程复盘、知识体系搭建和真实实践中的思考;不追求堆砌概念,只记录验证过的经验。慢慢写,长期做,把有用的内容沉淀下来。
发表的评论
几十万文档Qdrant单机完全够用,千万级再考虑集群吧,Milvus那套依赖确实劝退小团队。
“那电子发票呢”这种指代确实最容易翻车,我一般会让LLM先做一步query补全,把它改写成“报销流程中的电子发票怎么处理”,再拿去检索,命中率会高不少。全塞历史记录肯定不行,噪声太大,我通常只保留最近两轮加一个摘要。另外rerank挺关键的,检索多召回一些再用cross-encoder筛一遍,比直接调top-k稳。你们知识库如果实体关系复杂,确实可以考虑上graph,但成本不低,先试试query改
我在 .cursorrules 里明确写了“只做最小改动,禁止重构”,比放 .md 里管用多了,你试试。
工具调用样本也得混进训练集,不然格式全忘了。
先让LLM出查询计划再执行,比事后拆子查询靠谱,合并那步用重排兜底就行。
llama.cpp的显存管理确实比较吃紧,尤其Agent循环里每次工具调用都会重新走一遍推理,上下文一长就容易爆。你可以试试把context长度调小,或者用--no-mmap让内存映射方式变一下,有时候能省不少。另外建议检查下是不是每次工具返回结果都把完整历史塞进去了,考虑只保留关键轮次,能明显降显存峰值。轻量框架的话,可以看看LangChain的LCEL或者LlamaIndex的Agent模式,
试试把“不知道”写进prompt里当选项,模型就不硬凑了,冲突信息让它输出对比也行。 结构影响真挺大,我习惯先丢两三个示例再放上下文,它就知道该咋取舍了。
12G跑7B量化其实还行,但并发一多就露馅,问题多半出在KV cache和推理框架的调度上。我试过vLLM的paged attention,单看显存确实省了大概20%-30%,但小卡上它启动和预热开销也不小,而且跟LangChain的Agent循环配合时,如果工具调用频繁切换batch,反而可能因为continuous batching的等待增加延迟,你得自己权衡一下。 我觉得更实际的路线是模型
试试把共享状态拆成独立的子图节点,别一股脑塞进同一个State,并行写入时用merge操作符合并。 上次我也踩这坑,最后用字典分区存上下文,Worker各自读写自己的key,就没再覆盖过。
数据格式转换不如直接在MCP server层统一成Dataset,省得来回倒腾。轮询确实笨,可以试试自己搞个SSE推流,官方没有就自己造轮子。
7B模型在TS这种类型系统复杂的场景下确实容易翻车,尤其6.7B对泛型和联合类型的上下文理解有限,补全时经常顾头不顾尾。prompt模板影响没那么大,重点是把光标前后的代码片段截长一点,特别是把类型定义和函数签名带进去。Qwen2.5-Coder 7B在类型推断上比DeepSeek-Coder要稳一些,尤其对TS的支持好不少,8G显存跑量化版完全够用。另外可以试试把补全触发改成手动快捷键,避免它在
说实话你这数据量我有点怀疑是索引参数的问题,几万条对ChromaDB来说真不算多。我之前用默认配置存了差不多十万条,召回慢得离谱,后来把HNSW的M和efConstruction调大,速度直接翻了倍,你可以先试试这个。 Milvus我也折腾过,你这配置跑起来确实吃力,光是那一堆依赖组件就能占掉好几个G内存,而且真要玩转还得学它那套collection和partition的概念,就为几万条数据这么
我之前也踩过这个坑,bge-m3跑CPU上确实慢,但你这几万条数据其实不算大,先加个缓存试试,用faiss的id map存query的hash或者直接redis记结果,重复问题能省一大半时间。模型换成轻量级的像bge-small或者gte-small,效果差不了太多但速度能快两三倍,至于pgvector和milvus,几百毫秒和几十毫秒的差距,对你这个量级其实无所谓,先别折腾架构。另外MCP工具本
四五百条数据做微调确实有点悬,我之前试过类似规模,效果也是飘忽不定,尤其容易过拟合到那几百条样本上。你可以试试把学习率调低一点,比如降到1e-5左右,轮数控制在2-3轮,观察loss曲线别让它陡增。另外建议拿几十条完全不相关的测试集对比看看,有时候主观感觉“差不多”其实已经有点变化了。可视化的话,用Weights & Biases记录每层的梯度分布挺直观的,能看出模型是不是真的在学。
4090 24G跑7B其实不用上量化,你试试用transformers加载时开device_map="auto"加上torch_dtype=float16,再把max_length调低点,一般能塞进去。量化掉精度确实明显,尤其代码任务,我试过GPTQ的4bit写Python都容易出低级错误。要不你换个思路,用llama.cpp的Q5_K_M或者Q6_K,比4bit好不少,显存也就多占2-3G,逻辑
说实话我也碰到过类似的情况,不过是拿Qwen2.5-7B做实验的时候发现的,加个“且”字输出格式直接从markdown变纯文本,当时我还以为是显存不够导致加载出错。后来换成temperature=0.3和top_p=0.8之后稳定性好了不少,感觉高采样温度会放大这种微小扰动的影响,你调到0.7确实有点激进。另外我觉得这跟模型在指令遵循上的“锚点”机制有关,有些词(比如“严谨”)可能跟大量的训练样本
我之前也踩过类似的坑,3090跑DeepLabV3+按理说512分辨率batch4不该炸的。你先别急着怀疑DataLoader,我遇到过最离谱的一次是模型里有个没用的辅助loss分支,它把中间层的超大特征图一直保着不释放,直接吃掉好几个G。建议你用torch.cuda.memory_summary()看下当前峰值在哪,或者干脆在关键层后面手动插torch.cuda.reset_peak_memor
这个问题我前两天刚踩过,AgentExecutor默认确实不会把工具输出自动塞回prompt,你光加memory没用,得在工具函数里把返回值手动append到chat_history里。我现在的做法是定义一个全局的context列表,每次工具调用完把结果存进去,然后自定义prompt时明确带上“以下是之前的工具结果:{context}”,效果立竿见影。另外试试把memory的return_mess
说实话你这情况太典型了,我试过好几个AI编程工具,基本都栽在事务和并发这种“状态敏感”的环节上。它们对CRUD的套路化代码确实熟,但一旦涉及session生命周期或者异步上下文,模型本质是在猜,不是真的理解业务约束。你写“注意事务安全”这种指令,它大概率当成一个普通形容词处理,不会触发任何逻辑上的自我检查。我的做法是把大任务拆成极小步骤,比如先让它单独写一个不带装饰器的纯SQL查询,再手动加事务包
我试过精简prompt后效果反而稳了,指令太多模型容易懵,先砍到只剩核心要求试试。