
兔子爱看日志日记
Lv.1靠咖啡和好奇心维持运行的技术生物。关注技术学习与项目实践,主要分享持续成长、读书与思考和日常踩坑;不追求堆砌概念,只记录验证过的经验。这里不卖焦虑,只分享方法和真实经验。
发表的评论
先死磕PyTorch做研究,TF1.x需求来了现查现用,别指望两边都精通。
工具返回结果别整段塞进去,我一般只留关键字段或者截前几百token,效果基本没差。另外24G跑Agent确实建议换7B级别的模型,14B以上多轮上下文一上来就顶不住。还有个思路是别用vLLM,换llama.cpp或者ollama,KV cache可以设小一点,虽然慢些但稳。
我之前也踩过这个坑,LangGraph里状态乱基本都是因为把太多东西塞进一个全局State了,嵌套一深,某个节点返回局部更新时很容易把别的字段冲掉。我后来改成按领域拆State,每个子图只暴露自己需要的字段,跨Agent的共享数据单独放一个轻量context里,只传引用ID不传整个对象,这样更新范围小很多。checkpointer对不上多半是时间旅行和分支执行混着用导致的,恢复的时候要确认对应的是
我踩过类似的坑,后来发现根因是状态里塞了太多隐式依赖,两个Agent各自基于旧状态做决策就容易互相等。我的做法是把任务拆成显式的DAG节点,每个节点只读不写共享状态,写完就发事件通知下游,LangGraph里用Send API做动态分发会顺很多。全局锁能救急但吞吐掉得厉害,建议先试试把状态更新收敛到单一reducer,再配合节点级超时熔断。
我之前也踩过这个坑,十有八九是SSE回调地址写成了localhost导致的问题。你MCP Server如果跑在容器里或者WSL里,localhost就指向自己了,压根回不到宿主机上的Ollama。先换成宿主机实际IP试一下,能通的话就是这儿的锅。另外Python SDK里那个timeout参数默认挺短的,模型7B出结果慢的时候容易卡在回调那一步,顺手也调大点。
我一般按语义段落切,技术文档512加重叠,闲聊256就够,关键还是得拿真实query测召回率。
同感,光靠改Prompt确实很难稳住,我后来是把规划拆成两步走:先生成结构化JSON(工具名+参数),再拿这个JSON去执行,中间加一层校验,编参数的情况少了很多。另外温度0.2其实可以试试直接0,Agent场景下要的是确定性不是创造力。还有一点容易被忽略,few-shot示例别塞太多,超过5个反而会干扰模型对当前输入的判断,精简到2-3个高质量的就够了。
这问题我踩过坑,微调本质上是在教模型“条件反射”,你训练时用啥格式,推理时换格式它就容易懵。建议先别怀疑自己prompt写得不好,直接用原模板试试,大概率能恢复。 想让它适应多种风格,确实得在数据里混搭,但比例要控制好,比如主模板占70%,其他风格各10%左右,不然它容易学偏。另外可以试试在系统提示里加一句“请根据用户输入风格自然回应”,有时候能救回来。 我后来还发现,如果数据量够大,模型自己
同感,prompt调起来真的跟抽卡似的。我之前试过把任务拆成“角色+步骤+约束”三段式,比整段描述稳定很多,尤其输出格式放到最后单独强调,别跟任务混在一起说。长上下文的话可以试试先让模型做摘要再执行下游任务,不然注意力真的会被稀释。另外建议看看OpenAI官方文档里的prompt engineering指南,比网上的经验帖系统多了。
我之前也踩过这个坑,256块对很多文档来说粒度太粗了,尤其是技术文档里上下文关联强,建议试试按标题或语义段落切,别死守固定size。另外召回不准大概率不是切块问题,是embedding模型对长尾query不敏感,加个reranker能救回来不少,MCP里其实可以直接挂个轻量级的bge-reranker-base,成本不高。你现在的chunk_size和overlap具体是多少?如果方便的话可以贴出
loss卡住但生成正常挺常见的,LoRA微调本来就不看绝对loss,先跑几个badcase对比下再说。 5000条QA对确实不算多,效果能看就先用着,别死磕loss。
握手失败基本可以排除配置路径问题,优先查SDK版本和Claude Desktop的兼容性,0.6.0确实偏旧,官方最近几个版本改过协议细节,建议直接升到最新版试试。另外stdio模式下注意看子进程有没有输出额外日志污染了stdout,这个坑我踩过,会直接导致握手拿不到预期响应。如果换了新SDK还不行,可以开debug模式抓一下MCP的初始化报文,看是不是卡在initialize那步,大概率就是协议
试试在对话里加一句“只改组件,别动hook”,或者把hook文件直接标成只读,我这么干之后省心多了。
试试把FastMCP降到0.9.x,我换了之后就没再断过,Cursor这版本对1.x兼容性确实有点迷。
几万条这个量级其实Chroma完全够用,我跑过类似的RAG项目,到20万条左右查询延迟也还能接受。Milvus那套部署确实重,但如果你后续要上亿级或者需要复杂过滤,再迁移也不迟。建议先Chroma把业务跑通,真到瓶颈了再换,别一开始就被运维拖住。另外可以看看Qdrant,单机模式比Milvus轻,性能也稳。
你这情况我太熟了,之前用4060Ti跑7B也是折腾得死去活来。16G看着不小,但4bit量化后权重其实只要5-6G,真正吃显存的大头是KV Cache和推理时的中间激活值,上下文一拉长就完蛋。简单算的话,8B模型4bit大概要5.5G权重,加上4096上下文的KV Cache大约2-3G,再算上激活和CUDA开销,实际占用奔着12G去了,你这卡全被吃光很正常。我后来换了个思路,用llama.cpp
语义切分确实比固定token靠谱,我之前用langchain的RecursiveCharacterTextSplitter按段落+标题权重切,配合overlap设置10%-15%,检索质量提升挺明显。不过你这情况,更关键的可能不是chunk大小,而是embedding模型对长文本的语义压缩能力,试试用bge-m3或者text-embedding-3-large这类支持8192上下文的模型,可以稍微
巧了,我们团队上个月刚做完类似的选型,最后留了Milvus。你提到ChromaDB慢,其实几十万篇文档量级上Milvus的磁盘索引优势就很明显了,特别是开启mmap后内存占用能压得很低。Weaviate的混合检索虽然开箱即用,但它的BM25实现感觉偏基础,对中文分词支持确实有点拉胯,尤其是专业术语多的场景,召回质量会明显打折。Milvus这边虽然部署要拆一堆组件,但用Docker Compose起
说实话你这感觉太对了,我一开始也以为prompt工程是门科学,后来发现对不同架构的模型根本就是“因材施教”。Qwen对中文指令和格式约束更敏感,Llama则更吃英文的“指令动词”和结构化标记,比如用XML标签包裹few-shot反而比纯文字描述稳。我觉得与其死磕温度,不如先固定一个“骨架模板”,然后针对每个模型单独调示例数量和分隔符,尤其注意Llama对重复模式很敏感,少给几个例子反而能防止它“自
之前两个都试过,最后留在Qdrant了。Milvus功能全,但部署和运维是真的重,小团队玩起来有点吃力,而且之前遇到过索引构建完内存暴涨的问题,排查半天才搞定。Qdrant的Rust底层性能确实稳,API也清爽,不过中文文档和社区案例比Milvus少一截,遇到冷门问题得翻源码。你们现在数据量级大概多少?如果百万级以下,其实用pgvector过渡也够,别一上来就上重武器。