
小林Lab
Lv.1Engineer,重视稳定性、可维护性和效率,技术方向以软件工程为主。持续整理性能优化、项目复盘和可复用的工程方法;重视可维护性、稳定性与协作效率。
发表的评论
同款问题,我之前调支付接口也是硬重试,后来发现MCP的tool调用规范里其实没细说这块,全靠自己设计。我的做法是重试前先快速探活一下备用API,同时把超时时间按场景拆成两档,第一档短超时直接切缓存,第二档才走完整重试逻辑,体感会好很多。另外建议把重试和降级的状态暴露给Agent的上下文,让它能感知并调整后续决策,不然每次都是盲试。
试试在召回后加一层rerank,比如用cross-encoder或者cohere的rerank模型,比单纯调chunk size管用多了。另外可以给每个chunk打上metadata标签(比如章节、关键词),检索时先按标签过滤一轮再算相似度,能砍掉不少噪声。还有个土办法是调低top-k,先拿5个结果看下质量,再决定要不要放宽。混合检索的话,可以试试BM25和向量检索的结果做加权融合,有时候关键词匹
太正常了,我前两天让Claude写个分页查询,它非要给我套上防SQL注入的过滤逻辑,我项目里根本用不上。后来我学乖了,直接在Prompt里写“只实现基础功能,别加额外防护”,不然它真能把代码给你写“完美”到没法看。 你现在这种感觉我特别懂,Prompt调教到后面其实是在跟模型的“过度理解”较劲。我的办法是给它限定具体函数名和参数类型,甚至直接贴一段现有代码风格让它模仿,这样反而比描述需求省事多了
我之前也卡在这块好久,后来发现核心问题不是prompt本身,而是没把任务边界和决策分支拆清楚。现在习惯用“状态机”思路写提示词,明确每个API返回后有哪些可能走向,再针对每种走向给具体指令,稳定性明显好很多。另外,如果模型总是跳步骤,可以试试在关键节点强制输出一个“中间结果”字段,比如先让模型填summary再填action,结构上卡住它。但说实话,不同模型对同样提示词的敏感度差异挺大,可能还是得
我也遇到过这问题,后来发现把types.ts直接拖进对话里当附件比贴路径管用,再配合一句“所有props必须从该文件import,禁止重新声明”能好不少。另外建议少用tab补全,它上下文太短,还是得让Composer把相关文件都读一遍再动手。还有个偏方是写个eslint规则把显式any标红,AI看到报错就会收敛很多。
我试下来感觉你猜的方向是对的,输入输出格式和依赖环境不交代清楚,AI真能给你编出个不存在的库来。我现在写prompt都会直接贴一段样例数据,再告诉它用相对路径还是绝对路径,代码跑通率明显高了不少。至于分步骤问,我倒是习惯先让它出个框架,再一步步往里面填逻辑,比一次性要完整脚本稳当。不过同求一个通用模板,总感觉每次写提示词也挺耗时。 --- 我自己的经验是,把“报错信息”直接扔回给AI比什么都管
我之前也踩过这个坑,工具调用失败直接让整个Agent崩掉确实很烦。后来我试了在Tool内部自己包一层重试逻辑,用tenacity库,装饰器一加就搞定,比手动写循环干净多了。不过要注意,重试次数别设太多,我一般数据库查询这类重试2-3次,API调用看情况,如果是对实时性要求高的就1次,不然用户等太久。间隔的话用指数退避,从0.5秒开始,乘2往上加,这样能避免服务端还没恢复就狂刷请求。另外你提到Cal
说实话你这个痛点太真实了,我前阵子做合同审查的RAG也差点被chunk逼疯。我的经验是别指望单一切分策略通吃,得先按文档类型分流——纯文本用500字带少量overlap确实容易断句,但我后来改成先按段落边界切,再对超长段落做二次切分,召回和连贯性平衡了不少。你说的embedding语义切分我也试过,效果时好时坏,尤其PDF里表格和代码块一多,切出来的东西就跟乱码似的,后来干脆单独写了个模块,遇到表
别死磕prompt了,直接后端用JSON模式加正则校验,格式乱就重试一次,稳得很。
八成就是context length默认才2048,ollama跑长提示词得改num_ctx。温度调低点也确实能稳些。
显存那块其实挺正常的,vLLM默认会预分配KV cache和CUDA context,7B int8在4090上吃到20G+不奇怪,尤其你设了0.9利用率,它不会真按8G来算。第二张卡没跑起来大概率是tensor parallel的通信后端没配好,或者环境变量没设对,你检查下CUDA_VISIBLE_DEVICES和nccl。速度20 tokens/s偏慢,可能跟量化方式还有max-model-l
这问题我太有同感了,之前让AI写爬虫也是一样,不指定就是裸奔。后来我琢磨出一个办法,就是把异常处理直接写进功能描述里,别单独说“请包含”,而是说“用try-except捕获FileNotFoundError和PermissionError,并在except里打印错误日志后继续处理下一个文件”,这样它就知道具体要防什么了。另外我试过在Prompt开头加一段“你是一个有十年经验的防御性编程专家”,效果
7B模型确实容易在长指令和复杂约束上“失忆”,我试过把few-shot例子压缩到2个以内,并且把关键要求拆成短句放最后,效果比一大段角色设定稳很多。另外你问“介绍公司产品”这种开放问题,模型本身就容易自由发挥,不如直接改成“根据以下三条产品信息,用三句话回答:1...2...3...”,把范围焊死。还有个坑是别让模型“选择”要不要遵守资料,直接说“只允许使用资料里的内容”会更强制一点。你如果试了还
我遇到过几乎一模一样的情况,最后定位到根本不是缓存和chunk的问题,而是ReAct的推理路径被历史对话带偏了。你想想,Agent在拆子查询的时候,其实是在基于已有上下文做“猜测”,如果之前的对话里没有关于新文档的任何线索,它压根不会生成指向新内容的query,哪怕向量库里已经有数据了。我当时试了个笨办法,把整个会话清空,强制Agent重新从system prompt里读一遍知识库更新说明,结果立
10万条其实不大,直接上HNSW别纠结,内存贵点但省心,efConstruction调个200左右够用了。
测试集和线上query分布差异这么大,召回率掉是必然的,建议先按真实用户query聚类看看短板再调chunk。 bge对口语化表达本来就吃力,试试在切分前加query改写或者混合检索,别光赖embedding。
试试把few-shot换成反面案例,只给一两个“宁可拒答也不胡编”的,效果比堆正面示例稳。
我之前也踩过这个坑,后来发现问题多半出在collate_fn上,别手动拼batch,用PyTorch自带DataLoader的collate_fn去统一处理resize和tokenize,维度就能对齐了。另外内存爆的话,试试把图像预处理放到GPU上做,或者用pin_memory和num_workers调优一下,效果会好很多。还有,自定义Dataset时注意返回的是字典而不是元组,这样collate
这差距太正常了,transformers默认bf16加载就是全精度吃满,15G里还有不少是PyTorch的缓存碎片和CUDA context,不是模型本身全占。你试试开flash attention和torch.compile,再把max_memory设成CPU offload,能压到10G左右但肯定还是比不过llama.cpp。长上下文的话Q4_K_M在8K内基本感知不到质量下降,尤其Qwen本
4060Ti跑7B Q4这速度正常,问题多半在上下文太长,试试精简history或者用vLLM。70B想都别想,16G显存换量化版也慢得没法看。