
长街煮茶集
Lv.1把零散灵感沉淀为可复用的方法,关注技术学习与数字生活,记录知识体系搭建、读书与思考和真实实践中的思考;习惯用项目结果检验技术判断。慢慢写,长期做,把有用的内容沉淀下来。
发表的评论
几千条函数级片段确实偏少,代码补全这种任务对上下文多样性要求挺高的,模型很容易记住你那些项目的固定写法,eval loss回升基本就是过拟合的典型信号了。显存吃20G+在4090上其实还算正常,Llama3-8B全参数fp16光权重就16G了,你虽然只训LoRA但前向激活和优化器状态还是省不了太多,试试gradient checkpointing开起来,能省不少激活显存,代价是慢一点。LoRA只挂
vLLM确实能省显存,PagedAttention对并发请求很友好,先换框架试试再考虑换卡。
把llm和tools在模块级别初始化好,AgentExecutor每次new的时候传同一个实例就行,别在函数里重新创建。
7B模型确实吃prompt格式,GPT-4o那套花哨模板搬过来水土不服很正常。我建议你先别急着堆few-shot,用vLLM的话拿tokenizer.apply_chat_template走标准chat格式,看看基础对话能不能稳住。然后few-shot示例控制在2到3条,格式跟推理时严格一致,多一条都可能让它跑偏。temperature先调到0.1左右测,稳定了再往上加,不然采样噪声会把promp
法律这种场景光靠system prompt确实压不住,模型一看到法条就忍不住自己发挥。我后来是把指令拆成两步:先让它从检索片段里摘出相关句子,再基于摘出的内容组织回答,效果好不少。另外top3召回没问题不代表排序对,有时候第三篇反而是关键法条,可以试试重排或者调低相似度阈值。你现在的prompt里有没有明确要求它引用片段编号?这个对约束输出挺有用的。
我也遇到过类似情况,后来发现关键在工具返回结果别塞太多原始数据。比如query_db回来几十行,模型后面就容易串。我一般只回传精简后的摘要或字段列表,让每步上下文保持干净。另外试试把上一步的返回值显式写进下一步的prompt里,而不是指望它自己记住。多轮规划里模型对“新鲜”信息更敏感,旧结果放太深基本就靠编了。
我之前也踩过这个坑,后来改成按语义切分,再用滑动窗口加个overlap,效果比纯段落或纯句子好不少。你这种FAQ场景其实可以混着来,短问答按整条切,产品手册按段落切但控制下长度。没上reranker的话,建议先加个简单的关键词过滤或者BM25混合检索,召回质量能提一截。另外切片时把标题层级带进去当上下文,对“保修期”这种问题挺有用的。
工具间依赖最好用状态字段硬约束,别全指望模型自己排顺序。
换结构化输出才是正路,LangChain里直接上with_structured_output绑Pydantic模型,让模型按schema吐,比事后修JSON省心多了。不过有些小模型对function calling支持稀烂,这时候可以套一层instructor或者outlines做约束解码,基本能根治格式乱飞。CrewAI底层还是靠模型本身,换框架治标不治本,先把结构化输出这块吃透更实在。
这种情况我太熟了,检索没问题但生成瞎编,大概率是出在“上下文注入”这一步。你有没有看过拼完的prompt长什么样?很多时候chunk里带着一堆无关的元数据、标题、甚至上一段残留,模型注意力直接被带偏了。另外bge-small-zh本身对长chunk的语义压缩比较狠,top3看起来相关,但关键那句话可能被稀释了,模型拿到的是“半对半错”的信息,它就容易自己脑补。我建议你先做个消融实验:把检索到的原文
试试用onnxruntime的profiling看看瓶颈在哪,有时候是内存拷贝或者线程数没设对。
几百万条Qdrant单机完全够用,M设16、efConstruction设200先跑起来,别过度调参。
我们之前也踩过这个坑,后来换成Milvus按doc_id做upsert,删旧版本时直接按元数据过滤删掉,比Faiss省心不少。切分那块建议把chunk的hash存下来,更新时先比对再决定要不要重新embedding,能省很多算力。不过并发高的时候还是得加个队列串行处理写入,不然容易冲突。你们文档量大不大?如果几千份以内其实pgvector也够用了。
我之前也卡在这过,后来发现MCP的stdio模式跑起来时,子进程的工作目录默认是Claude Desktop的安装目录,不是你的项目目录。你试试在config里那个命令前面加个cd到项目路径,或者直接在启动脚本里写死绝对路径的日志输出,比如log_file那个参数,能直接看到Python的报错堆栈。另外检查下Python环境,Claude Desktop调用的可能是它自带的那个python,跟你终
我们团队之前也是从Chroma迁出来的,后来试了Weaviate,中文这块没想象中那么拉胯,只要分词做好其实够用。但你要是奔着混合检索去,Milvus的sparse+ dense组合确实更稳,尤其rerank那步能省不少事。中小团队的话,其实可以先上Milvus的standalone模式,别一上来就搞集群,部署没那么吓人。另外你文档量大,建议先拿真实数据跑个benchmark,我见过不少项目是栽在
确实,27%的提升在真实工程场景里体感会很明显,尤其是self-debug这块,我之前用GPT写pytest脚本时也老在参数校验上翻车,得手动补一堆边界条件,Agent 2.0能自己生成mock数据这点挺戳痛点的。不过你说到混合技术栈我就来劲了,我试过让它搞个Vue3+FastAPI+Redis的小项目,结果它在跨语言调用时经常把异步逻辑搞混,比如前端回调里直接塞了await,然后整个链路就断了,
我倒觉得不全是prompt的锅,Cursor这类工具在生成代码时默认会“过度设计”,它老想帮你把边界情况都处理了,结果反而偏离了最朴素的指令。你试试把需求拆得更“死”一点,比如直接告诉它“只允许修改这一列,禁止改动其他任何列名或索引”,甚至把原始DataFrame的列名清单贴进去,它跑偏的概率会小很多。另外4o模型在长对话里容易“自作主张”,可能跟你前面聊过别的需求有关,它把上下文里的“隐含意图”
你这大概率不是模板结构的问题,是官方Demo里藏了没写出来的隐式设定,比如对话历史格式、特殊token或者few-shot示例。7B模型对prompt的格式变化特别敏感,你试试把system prompt完全复制过去,只改角色名,其他一个字别动,看效果还差不差。另外vLLM和Ollama的默认采样参数跟网页端可能不一致,我遇到过temperature实际没生效的情况,建议你显式打印一下生成配置。还
说实话我最近也在折腾类似的东西,合同条款这种任务挺吃格式一致性的,我觉得Alpaca可能更适合一点,因为那种“指令+输出”的强结构对单任务提取更友好。混合训练确实容易让模型犯迷糊,我试过把短指令和长对话放一起,收敛明显变慢,而且偶尔会蹦出无关的上下文。你要是想兼顾,建议按比例分batch喂,或者干脆先全量单轮指令微调,再用少量对话数据做第二轮。另外别忽略系统提示词,对这类专业场景帮助比想象中大。
别降维,768维直接上,你这数据量faiss够用,Milvus等量大了再迁不迟。