
周末安全手记
Lv.1主要整理信息安全相关的学习笔记与工程经验,内容覆盖攻防案例复盘、安全测试与风险分析。希望内容既讲清为什么,也说明怎么做,希望把复杂问题讲清楚、把实践步骤写完整。
发表的评论
几千个chunk其实不算大,rerank模型选个轻量级的,比如bge-reranker-base,延迟也就几十毫秒,线上基本扛得住,比你在prompt上反复调要靠谱得多。另外top5召回里混进擦边内容,很多时候是embedding本身区分度不够,可以先看看召回结果的分数分布,如果top1和top5分差很小,说明检索阶段就没拉开差距,这时候光靠rerank也救不了。我的做法是先用rerank筛到to
V100 16G跑GPTQ-4bit的7B理论上够,但你崩多半是KV cache没管住。vLLM开gpu_memory_utilization=0.9加enable_prefix_caching会稳不少,比裸transformers强太多。真要保险就换AWQ,4bit下比GPTQ省一点显存,配合vLLM基本能压住长上下文。还不行就上GGUF走llama.cpp,CPU+GPU混合offload,速
我之前也踩过这个坑,纯BM25在中文场景下确实很容易被高频词带偏,“苹果”这种多义词基本无解,因为BM25只看词频和逆文档频率,压根不关心上下文。你说的分词器消歧其实指望不上,主流分词器只是切词,顶多做个词性标注,真要做词义消歧那是另一套NLP任务了,成本不低。轻量点的办法可以先试试给查询加个领域词典或者实体识别,比如识别出“苹果手机”就把它当成一个整体term,而不是切成“苹果”和“手机”,这样
固定长度切就是容易这样,试试按标题或段落切,再加个rerank模型效果会好很多。
A10跑7B AWQ这个速度确实偏慢,但也不算完全离谱,关键得看你的具体配置。15-20 tokens/s在并发8的情况下,如果每个请求都在同时生成,那总吞吐其实是120-160 tokens/s,这个数字放在A10上不算太差,但首token 3秒多确实有点问题。你检查过max_model_len吗?如果设得太大,比如8192甚至更高,KV cache会占掉大量显存,导致实际能用的batch si
检索准不代表生成就能用,这俩其实是两回事。top5相关但答案泛,大概率是LLM没被约束到那些细节规范上,光靠embedding调解决不了。我之前试过一边LoRA生成模型一边加few-shot示例,效果比只调检索侧明显得多,尤其行业标准这种术语密集的场景。不过few-shot得挑真正体现规则的关键片段,不然容易带偏。你先试试在prompt里塞两三个精准示例,成本低还能快速验证是不是LLM理解的问题。
8G显存跑8B的Q4确实挺紧张的,ollama默认可能没完全offload到CPU,你可以试试在Modelfile里调num_gpu层数,留一两层给显卡就行,剩下的扔CPU跑。llama.cpp那边用-ngl参数控制,别全塞显存里,速度慢可能就是因为爆了之后偷偷走CPU了。RAG实验的话其实7B的Q4_K_M更划算,或者试试Q3_K_S,显存压力小很多,精度掉得也不算太狠。swap就别折腾了,那玩
我也有这感觉,尤其是写模板代码的时候,Tab按得根本停不下来。但后来发现,越是依赖它补全,遇到它搞不定的问题就越容易卡住,因为脑子已经习惯被动等答案了。我现在刻意在写核心逻辑前先自己理一遍思路,哪怕最后用它的建议,至少心里有数。这东西当加速器可以,别让它替你思考就行。
这个问题我太有共鸣了,之前用LangChain做类似的东西也踩过一模一样的坑。工具明明返回了正确的JSON,Agent却一本正经地说“调用失败”,然后换个参数再来一遍,看着日志真的血压高。后来我发现很大一部分锅不在工具本身,而是Agent对“成功”的定义太模糊了——它很多时候是在靠语义猜结果对不对,而不是靠明确的字段判断。你可以在工具返回里加一个固定的status或者success字段,再在pro
小模型做二分类比LLM靠谱多了,bge-reranker这类拿去微调一下,比死磕prompt稳。
短期记忆这块我也踩过类似坑,后来干脆把向量库只当兜底,最近几轮直接按时间顺序全塞进去,反而更稳。你那个“那明天呢”的问题本质是 query 太短、语义漂移,检索自然会把上一轮天气原样捞回来。我的做法是先做一轮滑窗截断,再用 rerank 把重复度高的片段压掉,效果比单纯限 topk 好不少。
RASP这块我踩过坑,规则维护确实是个无底洞。去年我们上了某家的RASP,光是给核心交易链路做白名单就折腾了两个月,业务迭代一快,规则立马跟不上。所以长亭想用AI来降低规则依赖这个方向我是认的,但问题在于RASP的误报代价太大了,直接拦请求啊,不是WAF那种记录一下就行。AI模型再准,只要在生产环境误杀一笔订单,业务方就能把你喷到怀疑人生。我比较好奇的是他们怎么处理AI决策和RASP阻断之间的置信
500字符切PDF太碎了,先试试按标题层级切,再上混合检索加rerank,召回能明显好一截。
MCP主要还是给LLM做工具调用的协议,你想让PyTorch训练循环里直接调数据库或图像服务,其实没必要绕MCP这层。训练时工具调用一般走的是自定义dataset里的预处理或回调,真要动态调外部服务,直接写个异步client比套MCP简单得多。你遇到的延迟和dataloader冲突,大概率是MCP的请求响应模式跟训练的高吞吐节奏不搭。如果非要用,建议把MCP server单独跑成服务,训练侧只做轻
LoRA省的是优化器状态和梯度那块,激活内存该占还是占,所以你序列一拉长照样爆。gradient checkpointing对激活效果挺明显的,大概能省一半多,但速度会慢个20%左右,看你能不能接受。另外可以试试flash attention 2加上bf16,再配合梯度累积把batch等效上去,序列长度比batch更吃显存。如果还不行就看看unsloth或者liger kernel,能再压一截。
温度调到0.1还飘,那基本不是采样随机性的锅了,7B这个量级的模型指令遵循本来就偏弱,尤其是“只输出JSON”这种硬约束,它经常压不住。我之前也踩过类似的坑,后来发现把任务说明和格式约束拆到system里会稳不少,user消息只放待分类的原文,模型对角色边界的敏感度比想象中高。另外你可以在prompt末尾加一句“直接输出JSON,第一个字符必须是{”,这种前缀约束对本地小模型挺管用的,比单纯写“不
这个坑我也踩过,MCP上下文一长规则就飘,光靠prompt确实不靠谱。我现在的做法是MCP server端拦一道,把生成的依赖做白名单校验,不在项目锁定列表里的直接拒绝执行,比事后擦屁股省心多了。不过requirements.txt二次校验也有必要,尤其CI那层必须卡死,不然AI绕过server改了别的文件你都不知道。有个点想确认下,你们项目是锁死单一版本还是允许小版本浮动?我这边试过给AI喂一个
MCP主要还是给LLM做工具调用设计的,PyTorch训练循环里直接发请求确实不太合适,尤其你提到延迟高,这很正常,训练时每个step都等外部响应根本不现实。我之前也踩过类似的坑,后来改成在数据预处理阶段离线调工具,或者用消息队列把请求异步丢出去,训练本身不阻塞。你试过把MCP调用放到DataLoader的worker里吗?那边本来就是多进程异步的,可能比在主循环里硬接要顺一点。另外可以看看Lan
按函数和类切确实更靠谱,Python可以用ast模块,Go用go/parser,比按行切强多了。
我之前也踩过这坑,后来干脆把所有事件塞进一个队列,前端统一消费,省心多了。