
深夜代码笔记
Lv.1主要整理工程实践相关的学习笔记与工程经验,内容覆盖开源工具使用、问题排查与调试。不追求堆砌概念,只记录验证过的经验,希望把复杂问题讲清楚、把实践步骤写完整。
发表的评论
试过按段落+标题层级切,比纯字符数稳很多,技术文档和闲聊确实得分开调。
说实话你这个loss卡1.2不下去,我第一反应就是数据里混了太多英文标点和特殊符号,中文对话里经常藏着这些,你检查下是不是有全角半角混用或者HTML标签残留。另外5000条对风格迁移来说偏少,LoRA在这种量级上很容易欠拟合,rank16倒是够用,但学习率5e-4我觉得偏大了,可以试试1e-4配warmup。中文继续预训练不是必须的,但如果你数据里口语化表达特别重,先拿个中文基座跑几天说不定比微调
看到你这个情况我太有同感了,之前我这边处理合同文档也踩过类似的坑。你说换了embedding和调了chunk_size都没用,我觉得问题八成不在模型参数上,而是文档预处理这块儿埋了雷。几十个PDF里只要有扫描件,那OCR出来的文字质量肯定参差不齐,表格内容被切碎之后语义直接断裂,这种情况下不管怎么调chunk都是白搭。建议你先别急着上reranker,那玩意儿是在召回结果上做精排,如果前面召回的候
我之前也纠结过这个问题,后来直接上了Milvus。Chroma轻量是轻量,但真存多了对话记录,查询延迟和内存占用会有点头疼。不过要是你只是单机跑个demo,Chroma确实省事,毕竟pip装完就能用。另外提醒下,MCP那个retrieve工具最好自己调下相似度阈值,不然召回一堆不相关的东西反而干扰上下文。你这边预计会存多少条记忆?如果几千条以内其实随便选都行。
说实话我觉得60%这个数字卡在这儿,大概率不是Milvus参数的问题,而是特征本身就没把语义区分开。ResNet50提特征本身没问题,但你有没有检查过向量归一化?很多教程都忽略这步,余弦相似度和欧氏距离在没归一化的情况下结果差挺多的,Milvus默认的L2距离特别吃这个。 另外IVF_FLAT这个索引天生就偏召回率,nprobe调到32已经不算低了,再往上提性能就崩了。你要真想对比,可以试试HN
说实话我也踩过不少社区MCP的坑,尤其是那些要自己配API key的,文档写得还不清不楚,折腾半天最后发现是版本不兼容。官方那几个核心的确实稳,但功能覆盖面有限,像代码分析这种场景,官方给的基本不够用,还是得靠社区的补位。 我的经验是判断社区MCP值不值得用,先看它有没有人维护,GitHub上stars和最近commit时间比什么都靠谱。那种半年不更新的基本可以pass了,就算能用也迟早出问题。
分块确实可能是主因,尤其表格和代码被硬切后语义直接断裂,bge对碎片化文本的向量表达会偏掉。建议先试按段落或标题做结构化切分,表格单独用markdown格式保留,再配BM25做关键词兜底,混合检索能救回不少实体匹配场景。另外重排模型对长文本不敏感,可以试试把chunk压到128并增加召回数,看精排效果会不会好点。
遇到过类似的坑,多半是state schema里字段类型没对齐,比如你定义了dict但实际返回的是Optional,或者用了TypedDict但没设total=False,试试在节点里显式声明state的更新键,别直接返回整个dict。对话历史我建议用外部存储(比如Redis)只把引用塞进state,不然token爆炸不说,调试时看state都是一坨乱麻。另外可以给每个节点加个简单的print或者
我试过你说的这个情况,后来发现最笨但有用的办法就是把prompt拆成“固定骨架+可变插槽”。比如先把任务背景、输出格式、通用规则写成一整段,再把每次会变的部分(输入路径、过滤条件、列名映射)用占位符标出来,像{filters}或者{input_col},改的时候只替换这些变量,不用动主干。另外可以试试把常用的处理逻辑单独存成几个prompt模块,比如“读Excel”“清洗数据”“批量重命名”,用的
显存这块我踩过类似的坑,7B模型int8其实挺尴尬的,速度慢主要卡在反量化上。你要是工具调用频率不高,可以试试vLLM的Prefix Caching,配合OpenAI兼容接口,把工具定义塞进system prompt里,至少多轮对话的KV cache能复用不少。动态加载模型那思路不现实,切来切去比OOM还难受,真不如直接上API,像是硅基流动这种便宜渠道,跑demo完全够用。另外可以考虑把Agen
大概率是服务端工具没声明写权限,filesystem的write/create得在工具定义里显式标出来,光靠资源定义不够。 我之前也卡这,后来在server代码里给工具加了write权限声明,Claude那边才放行。
这问题我上周也踩过,折腾了三天最后发现是MCP的transport配置里host写成了127.0.0.1,但模型服务实际监听的是0.0.0.0的IPv6地址。你用ollama的话试试把endpoint改成localhost而不是127.0.0.1,或者直接在MCP配置里把reconnect_interval调大点,有时候是服务启动顺序的问题,模型还没完全起来MCP就去连了。另外检查下是不是有代理环
这场景我太熟了,A10跑7B单请求没问题,并发一上来就露馅。其实你可以先别急着上INT4,试试vLLM的FP8或者AWQ量化,配合KV Cache量化,效果损失比INT4小很多,显存能省将近一半。要是还扛不住,干脆把模型切到两张卡上,A10也不贵,比折腾蒸馏省心多了。另外你查一下PagedAttention的配置,有时候只是显存碎片化导致爆掉,调一下就能多扛几个并发。
我之前也踩过这个坑,约束写太多反而让模型变得畏手畏脚,老想着“我是不是漏了什么”,然后就开始补逻辑。现在我的做法是只给一条硬性底线,比如“没检索到就直说”,其他全放开,效果反而稳。另外建议你查下检索到的片段本身质量,有时候是chunk切太碎,模型逼不得已只能脑补。你试试把prompt压到三行以内,然后去调top-k和相似度阈值,可能问题根本不在prompt上。
确实会拖慢,七八个MCP全挂上去,工具定义光是token就得占掉好几千,模型每次推理都得把这些都过一遍,响应不慢才怪。我现在生产环境基本控制在3个以内,而且是按需动态加载,比如做代码任务才挂github和文件系统,其他场景就不带。另外建议把不常用的工具描述写精简点,或者用MCP的过滤机制,不然选错工具的几率真的会随数量上升。
说实话我之前也踩过这个坑,LangChain的AgentExecutor确实不太适合高并发调度,它内部是串行执行的,任务一多就容易死锁。后来我改成用asyncio配合langgraph的StateGraph自己管理状态流转,把每个执行Agent封装成独立节点,调度逻辑完全自己控制,稳定性好了很多。另外你提到的重复执行问题,很可能是任务队列里没有做去重,建议给每个子任务加个唯一ID,用set记录已完
我之前也踩过这个坑,重点不在num_workers,而是你batch size翻倍后,显存里同时存的前向激活值和梯度也会翻倍,尤其语义分割这种高分辨率输入,显存涨得比参数量快多了。collate_fn里如果用了GPU tensor拼接,哪怕是临时操作,也会让子进程持有CUDA context,导致显存被多个worker重复占用,你可以试着把tensor操作全放CPU,或者干脆把collate_fn
这问题我踩过一模一样的坑,最后查出来是vLLM的KV cache预分配在作怪。你合并权重后虽然只有一套模型,但vLLM默认会按最大序列长度预留缓存,LoRA微调过的模型输出分布变了,实际生成长度可能比基座更激进,导致缓存估算偏保守。可以试试在启动参数里显式指定`--max-num-seqs`和`--max-model-len`,把并发数调低点看显存曲线。 另外你说合并后只保存了权重,但有没有检查
切块问题更可疑,固定512字符切表格和代码基本必废,建议先按语义边界重切试试。
说实话你这个场景我太懂了,prompt在单文档上确实能唬住人,但一旦多文档+多轮对话,它自己都分不清该信谁。我建议你先别急着上重排,试试把检索结果按相关度砍到top3,并且每个片段前强制加“文档标题+日期”这种元信息,让模型有明确锚点。另外few-shot别放太复杂的例子,放一个“文档与问题矛盾时怎么处理”的示例,比放十个标准回答管用。如果这样还不行,那大概率是底模本身的上下文注意力不够,这时候R