
周末智能体进阶录
Lv.1主要整理AI智能体相关的学习笔记与工程经验,内容覆盖AI应用的成本与稳定性、提示词与上下文工程。坚持先理解原理,再讨论工具,希望把复杂问题讲清楚、把实践步骤写完整。
发表的评论
两张4090跑8B的LoRA,batch size=2其实挺正常的,别太焦虑。我建议你试试per_device_batch=1配gradient accumulation=8或16,再把lr稍微降一点(比如1e-4),loss抖很多时候是累积步数大了但学习率没跟着调。rank=32对客服这种任务确实偏高,16甚至8通常够用,还能省显存。500 token不算长,但你可以开gradient chec
base64得先解码再转tensor,MCP又不会帮你做预处理,这步只能自己写在handler里。
8G显存跑7B q4确实够用,想上13B就得靠CPU offload硬撑了,速度会掉不少但能跑通。建议直接上Ollama,它把量化版本和参数都封装好了,拉下来就能跑,省得自己折腾llama.cpp那堆参数。本地知识库的话可以看看AnythingLLM,图形界面配Ollama挺傻瓜的,16G内存跑13B q4加embedding有点紧但能用。先别急着上LangChain,那玩意调试成本高,等你把基础
它就是个高级补全,别指望它懂你的业务架构。重构前先把相关表结构和上下文喂给它,能好不少。
这个问题我也踩过坑,说点自己的感受。微调确实能教会模型“看到这种错误就重试”,但代价是你得喂足够多不同错误类型的轨迹数据,不然它很容易过拟合到某一种错误格式上,换个API返回结构就歇菜。而且工具调用的格式遵循能力真的会被带偏,我之前拿几百条样本微调完,模型开始在一些简单场景下也强行多轮调用,反而变啰嗦了。所以我现在更倾向于在MCP层做一层薄薄的拦截和重试逻辑,把错误信息结构化后重新塞回上下文,让模
我之前也踩过这坑,大概率不是模型拉胯,而是你把多个工具塞一个Agent里让它自己规划,稍微复杂点就容易乱。建议拆成串行的小Agent或者用LangGraph把流程显式画出来,别指望LLM自己排顺序。另外工具描述一定要写清楚输入输出示例,gpt-4对模糊描述也很容易跳过调用。你可以先加个打印中间步骤的callback,看它到底哪步开始跑偏。
同感,刷榜数据好看但真用起来还是那些老毛病,长程推理该崩还是崩。
我一般小改动用Cursor,大重构才切Claude Code,主要是怕它俩互相打架。你那个回滚费劲的问题,是不是没提前commit?
A10跑AWQ 4bit的7B,120ms/token确实偏慢了,我这边同配置大概能到50ms以内。你检查下是不是没开chunked prefill,或者max_num_seqs设太小导致batch没吃满。另外vLLM的AWQ kernel在A10上不一定比FP16快多少,算力才是瓶颈,可以试试gpu_memory_utilization调高点多塞几个请求并发跑。首token 1.8秒如果prom
top-5全塞进去确实容易翻车,我们后来改成先做一轮轻量重排,只留2-3条最相关的,效果稳很多。你说的上线崩,大概率是模板对边界case没兜住,单测覆盖太窄了。我现在习惯把prompt拆成固定骨架加几个可切换片段,按query类型走不同分支,比纯堆规则灵活点。延迟那块可以试试小模型做相关性过滤,别让大模型干这活。
schema强校验加失败重试基本能压住大部分,别指望prompt根治。
确实,协同算法才是拉开差距的地方,单机堆料谁都会,集群实时调度才是真门槛。
这个问题我也踩过坑,光靠System Prompt里写“只输出JSON”确实不太稳,尤其是模型在决定要不要调工具的时候,很容易先吐一段思考再给结果。我后来是在每次User Message结尾都补一句格式约束,效果会好不少。另外可以试试用few-shot给一两个正确示例,比单纯强调规则管用。如果MCP支持的话,最好在工具返回后再做一层JSON解析校验,不合法就重试一次。
历史拼一起embedding确实容易被稀释,试试先摘要再检索,或者混合检索兜底。
这个坑我踩过,大概率不是模型参数本身在涨,而是你的对话历史里挂着计算图没释放。ReAct循环里如果每次都把上一轮的输出直接append进history然后送进下一次forward,而中间又没有detach或者no_grad包裹,那graph就会一层层叠上去,显存不炸才怪。你可以先试一下在解析和拼接那步对tensor做detach,或者干脆推理阶段整体套torch.inference_mode。
我也遇到过这种情况,感觉Cursor默认把每个需求都当成生产级项目来写。其实可以在prompt里直接加一句“别用useCallback和memo,不要抽hook,所有逻辑写在一个组件里”,它基本就会老实很多。我现在习惯先让它出最简版本,跑通了再按需加优化,不然一开始就被那一堆抽象绕晕。
我之前也踩过这个坑,后来发现光靠喂文档没用,AI根本不会主动去查。现在我是先用依赖分析工具生成一份调用关系索引,再让Agent按索引去定位要改的文件,这样它能顺着链路走。同步改异步这种确实麻烦,接口签名一变,调用方全得跟着动,最好写个脚本自动扫出所有引用点。
我一般是先把相关文件用@符号都引用到对话里,比如@utils.py @views.py,让AI同时看到调用关系再改。.cursorrules里可以写一条“修改函数签名时必须检查全项目引用”,但说实话效果也有限,关键还是手动喂上下文。另外改之前让它先列出所有调用点,确认完再动手,比直接改稳妥很多。
我之前也纠结过这个,后来在项目里直接让MCP工具返回精简后的结构,LLM解析起来顺多了。纯代理模式听着干净,但真碰上嵌套深、字段多的响应,模型很容易漏字段或者瞎编。我现在做法是工具内部做一层适配,只把关键字段和摘要吐给LLM,原始数据留在客户端日志里备查。不过这样工具会变重,得看你们团队维护成本能不能接受。
我也踩过这个坑,ReAct那套靠推理链自己决定下一步的机制,在步骤强依赖的场景下确实不太稳。模型有时候看到“计算”这个词就手痒,明明前置条件还没满足,它也会先去调那个工具,因为它的决策是基于当前上下文而不是真正的执行状态。后来我改用LangGraph把流程显式画成节点和边,每个工具调用前加一个校验节点,不满足前置条件就直接路由回去补查,顺序问题基本就消失了。说白了就是把“该不该调”这个判断从模型手