
云端拾码记
Lv.1在快速变化的技术世界里慢慢积累,关注技术学习与数字生活,记录持续成长、项目实践记录和真实实践中的思考;重视可维护性、稳定性与协作效率。希望这些经验能帮你少踩几个坑。
发表的评论
FP16下有噪点挺常见的,你可以先用polygraphy跑逐层对比,看是哪一层开始误差爆掉的,一般ResNet50里的BN或者分割头附近的算子容易出问题。另外DeepLabV3+里的ASPP有大量空洞卷积,TRT对dilation的支持有时会偷偷降精度,建议把每个dilation conv单独拆出来验证。归一化那块也要确认下,如果预处理是在PyTorch外部做的,TRT引擎里没带进去,输入分布就偏
这个问题我深有体会,之前用Agent改一个数据清洗脚本也是这毛病。我觉得不完全是prompt抽象的问题,Agent每次其实是重新读一遍文件然后按当前理解重写,它没有真正的“记忆”,你上一轮说过的设计约束只要没落在代码注释或某个doc里,它就可能忽略掉。我的做法是在项目根目录放一个CONTEXT.md或者叫design_notes.md,把已经确定的设计决策、函数职责、边界条件都写进去,每次改需求前
有没有更详细的教程推荐?
我也遇到过类似的情况,用AI写代码时间一长就容易积攒这种“隐性债务”。它每次改动都是在你现有代码基础上做最小侵入,看起来每一步都合理,但三个月下来整体结构就变成了一团乱麻,因为AI没有全局架构的意识。你让它重构,它其实是在“顺着”已经歪掉的逻辑往下续,越续越绕,根本跳不出来。我的做法是定期把Service层拆开,自己重新画一遍领域模型,把那些为了兼容旧代码而塞进去的判断和状态流转全删掉,让AI从干
我也遇到过类似情况,后来发现光靠prompt约束确实不太够。可以试试在context前后加明确的引用标记,比如让模型在回答里必须带上来源片段编号,这样它会更倾向去用检索内容。另外Qwen2.5-7B这个尺寸本身指令遵循就一般,换成14B或者加个few-shot示例会稳很多。还有个偏方是把temperature再压低到0.01,同时top_p设成0.7左右,能减少它自由发挥的空间。
我之前也踩过这个坑,MCP里的Prompt模板和系统提示词根本不是一回事。模板更像是“可选工具”或者“场景化入口”,客户端可以决定要不要用、什么时候用,模型并不会因为你在server里定义了模板就自动遵守。所以你觉得AI忽略它,其实挺正常的,它压根没被强制注入到上下文里。 真想让它稳定输出JSON或者限制长度,最靠谱的还是把约束写进工具本身的描述和返回结构里,比如用JSON Schema把字段和
我之前把偏好和知识库分开存两个collection,召回准多了,元数据加个type字段过滤就行。
别指望一次Prompt就写对,边界情况得靠你自己列出来喂给它,比如把“不递归、特殊字符”写进测试用例让它先跑再说。
确实,做代码审查这块我也有同感,prompt稍微换一下措辞结果就完全不一样。我后来发现一个比较管用的做法,是把“按模块分组”这种要求再往下拆一层,直接给它一个输出模板,比如先列模块名,再在下面写变更点和影响范围,这样模型跑偏的概率会低很多。另外你提到的“写得很清楚还是跑偏”,有时候不是prompt的问题,而是上下文里代码diff太长,模型注意力被稀释了,我会把无关文件先过滤掉再喂进去。还有个小技巧
MCP本身其实没规定你必须配Agent框架,它就是个协议层的东西,客户端只要按照规范完成initialize、capabilities交换、tools/list和tools/call这几个步骤,理论上裸写JSON-RPC完全能跑通。你直接发请求失败,大概率是漏了初始化握手那一步,MCP server一般会要求先发initialize,收到响应后再发notifications/initialized
试试deepspeed zero3加cpu offload,40G跑2048序列单卡确实紧,8bit量化也值得试。
这锅得AI背一半,Composer确实爱自作主张重构,改bug前先跟它说只改这一处别动别的。
我一般在prompt里直接写“只输出代码,零注释”,配合.cursorrules文件基本能压住。
我一般是把角色设定和输出格式这类通用指令放服务器的system里,工具description只写这个工具具体干啥、参数啥意思。因为description是给模型判断“要不要调这个工具”用的,塞太多格式要求反而容易被忽略。你那个周报场景其实挺适合用MCP的prompts资源,它是专门给用户主动触发的模板,跟工具调用是两套逻辑。如果实在想放工具里,可以在工具返回结果时再拼一段格式指令,比写在descr
loss降到0.8不代表模型学对了,CodeAlpaca这种数据集本身质量参差不齐,3个epoch很容易过拟合到它的固定格式上,然后base模型的泛化能力反而被带偏了。我建议你先别急着调rank,拿几十条真实业务prompt做个对比eval,看看是格式乱了还是逻辑崩了,这比瞎猜lr有用得多。rank16其实不小了,7B模型做代码生成rank8到32都常见,关键在target_modules,q_p
我一般会把流程拆成两步:先让模型从上下文里摘出跟问题相关的原句,标上来源,再让它基于这些句子作答。这样能明显减少把“不适用”当结论、或者硬缝矛盾片段的情况。系统提示里加一句“只使用摘出来的句子,信息不够就直接说缺什么”也挺管用。另外别只写“不知道就说不知道”,太笼统了,改成“如果上下文没有直接支持答案,就说明哪部分没覆盖到”。
我之前也踩过类似的坑,MCP的进程组初始化和PyTorch DDP的默认超时时间不太对付,卡在“Waiting for other nodes”往往是某个rank还没进来。建议先把NCCL_DEBUG=INFO打开看看到底停在哪一步,顺便确认下有没有哪个卡的显存被其他进程占着。另外MCP自己那层通信封装有时候会和DDP的allreduce抢资源,试试只跑单机8卡、把MCP的分布式开关先关掉对比一下
62%对85%,这个差距明显不是调参能救回来的,更像是索引和查询没对齐。先确认下embedding写库前有没有做归一化,Milvus不同metric对归一化的要求不一样,IP和COSINE混用很容易踩坑。另外你nprobe是不是设得太保守了,50万数据IVF可以把nprobe拉到64甚至128试试,召回会明显回升。如果还不行,粗排之后加个rerank基本是RAG标配了,效果提升比死磕索引参数划算得
你手动del loss和output其实没啥用,因为只要没调用backward之前,计算图本来就该释放的,真正容易漏的是把loss累加到列表里做日志,比如losses.append(loss)这种,它会把整个计算图都拽住不放。还有个常见坑是自定义Dataset里如果__getitem__返回了带梯度的tensor或者缓存了一堆numpy数组没转成tensor,DataLoader的worker会一
我也踩过这个坑,工具一多模型真的会犯选择困难症,尤其是GitHub和文件系统有些功能语义上挺接近的,它经常绕一圈才找对。我现在生产上一般就挂三到四个,核心的数据库和HTTP请求必留,其他的按任务类型拆成不同Agent,而不是全塞一个里面。动态加载我试过,用路由先判断意图再决定挂哪些工具,效果还行但多了一层判断延迟,得看你的场景能不能接受。超时设置影响挺大的,MCP server如果默认超时太长,一