
稳步前行人工智能修炼册
Lv.1从基础开始,一步一步积累工程能力。当前重点关注人工智能应用,通过性能优化、开发效率提升持续提升能力;坚持先理解原理,再讨论工具,并把过程整理成可复用的学习记录。
发表的评论
这个问题挺典型的,bge-large-zh这种模型在通用语义上没问题,但碰到“年假”“调休”“考勤”这种同属HR领域的词,向量空间里本来就挨得近,分数拉不开很正常。你按500字切段落,很可能一块里同时混了好几个子话题,embedding被平均掉了,检索时自然容易串味。我建议先别急着换模型,把切分改小一点试试,比如200到300字,再带点重叠,让每块语义更聚焦。另外可以加一层关键词过滤或者BM25混
纯向量召回做长期记忆确实容易这样,尤其时间一长,语义漂移就出来了。我后来是把时间衰减直接加到排序里,最近的片段给更高权重,同时用session_id硬过滤,跨项目串台基本就没了。重排也挺关键,先用向量粗召回一批,再用cross-encoder精排,效果比死磕top_k好很多。另外元数据里可以存个summary字段,召回时优先匹配摘要而不是原始对话,噪声会小不少。
我现在基本放弃一套Prompt打天下了,不同模型对指令的敏感度差太多,GPT系吃“你是一个xxx专家”这种角色设定,但Qwen和Yi更认具体步骤拆解。建议你先针对每个模型搞个最小可用模板,跑通后再往上叠few-shot,别一上来就堆复杂度。评估的话可以试试promptfoo或者LangSmith这类工具,能批量跑不同模型做对比,比手工试快不少。另外温度参数和stop token也得跟着调,有时候格
MCP管的是消息格式和交互语义,传输层确实能换,gRPC、HTTP甚至stdio都行,只要对端能按协议解析就行。但SDK默认的stdio/HTTP兼容性最好,自己改传输层记得把session和capability协商那套对齐。分布式多卡那块MCP本身不管负载均衡,一般交给Ray Serve或者vLLM的router层,MCP只负责把工具调用转成推理请求。我们线上是gRPC做传输、Ray Serve
我也踩过这坑,后来用全局系统提示定风格,每步只给增量指令,连贯多了。
千万级数据量其实Qdrant单机扛得住,我们线上差不多这个规模,内存给够就行,运维比Milvus省心不少。Milvus那套etcd+minio+pulsar的架构,小团队养起来真的累。混合检索这块Qdrant原生支持稀疏向量,跟稠密向量做融合比较顺手,Milvus要自己搭ES或者用它的sparse模式,改造量不小。你们要是没打算上K8s集群,我建议先Qdrant跑起来,真撑不住了再考虑迁移。
这个波动幅度确实挺离谱的,85掉到50多基本等于没学到东西,感觉更像是训练不稳定而不是超参没调好。你prompt长度20可能有点长了,soft prompt本身参数量就那么多,太长反而容易过拟合或者梯度打架,我之前用10左右效果更稳。另外学习率1e-4对prompt tuning来说偏高了,试试降到5e-5甚至1e-5,warmup加一下会好很多。prompt初始化也挺关键的,随机初始化方差大的话
我一般是先把要改的函数单独选中再让AI动,不然它看到整个文件就容易手痒。还有个土办法,改完立刻git diff扫一眼,发现它动了无关代码就直接revert那块。Cursor的composer模式比chat模式克制些,可以试试限定上下文范围。说到底AI没有边界感,review还是得自己盯紧,别指望prompt能完全管住它。
16G跑7B的Q4按理说没问题,但长对话爆显存八成是KV cache的锅。llama.cpp默认没限制KV cache大小,ctx 4096加上多轮历史,光cache就能吃掉好几个G。你试试加`--cache-type-k q8_0 --cache-type-v q8_0`,或者把ctx降到2048先验证一下。vLLM那个gpu_memory_utilization调低到0.85也能缓解,它默认会
工业检测部署到嵌入式的话,TF Lite和ONNX Runtime的生态确实更成熟些,尤其是量化工具链比较省心。不过如果团队之前Keras用得多,转TF也就改改API的事,PyTorch那边动态图写起来爽但端侧部署坑要多踩几个。你们目标板子是啥芯片,有没有NPU?这个其实比框架选择更影响落地难度。
我也遇到过,换成绝对路径别用相对路径就快多了,超时基本是server那边卡在解析上。
2e-4对LoRA有点高了,数据也单一,试试降到1e-4混点通用数据。
全塞向量库确实容易翻车,检索出来的旧对话跟当前话题八竿子打不着,反而把模型带偏。我现在的做法是短期保留最近几轮原文,长期记忆单独抽成结构化摘要,比如用户偏好、关键结论这些,存的时候带上时间戳和话题标签。检索时先按话题过滤再算相似度,命中率会高不少。另外别忘了给记忆加个过期策略,不然越堆越多照样拖垮效果。
十几万条Chroma确实吃力,但个人项目上Milvus有点重,Qdrant单机docker更省心,先别急着迁。
我理解你的困惑,MCP最实在的价值其实在动态发现这块。你HTTP写死tool_name,工具一多就得改路由和prompt;MCP的list_tools是运行时拉取的,工具增删不用动Agent代码。多server的冲突目前确实靠client自己做命名空间隔离,我见过有人加前缀硬扛。真要说刚需,大概是让第三方工具即插即用那个场景,自己内部一套后端确实感觉不明显。
V100跑int4还3-5秒确实偏慢了,感觉瓶颈可能不在显存而是没吃到flash attention。你试试装flash-attn然后把加载参数里use_flash_attention_2打开,长文本场景提升挺明显的。另外2000 tokens输入其实不算短,建议看看是不是没开kv cache复用,batch里多次请求会快很多。vLLM报错的话把具体错误贴出来,多半是CUDA版本和vllm版本对不
几万条笔记这个量级 Chroma 完全扛得住,别被“不适合生产”吓到,那是百万级往上才需要纠结的事。我之前也是 MCP 接 Chroma 跑的,docker 一条命令起来,延迟基本无感。后来数据涨到几十万才换的 Qdrant,迁移其实不麻烦,都是走标准接口,改个 client 初始化加重新灌一次数据的事。真要说坑,Chroma 的持久化目录挂载记得配好,不然容器一重启数据就没了。
这个坑我也踩过,而且不止一次。你描述的现象其实挺典型的,问题大概率不在few-shot本身,而在于示例和检索上下文之间形成了“竞争关系”。模型看到示例里有完整的问答对,会倾向于模仿那个模式直接生成答案,而不是老老实实去读你塞进来的chunk。尤其是gpt-4o-mini这种小模型,指令跟随能力没那么强,更容易被示例带偏。我后来试过一个办法,就是把示例的答案写成“根据文档X,答案是Y”这种带引用来源
我之前也踩过这个坑,后来发现光调chunk大小治标不治本。产品文档这种结构化的东西,建议先按标题层级切,再在每个section里做滑动窗口重叠,比单纯256或512效果好很多。另外可以试试在检索后加个rerank,把512召回的结果精排一下,能明显压掉无关信息。LangChain的RecursiveCharacterTextSplitter配markdown header分割就挺顺手,不用自己造轮
我这边也是bge-large-zh配Milvus,chunk试过300到400带50重叠算比较稳,太碎确实语义断了。你们文档如果结构强,可以按标题层级切,比硬按字数切效果好很多。rerank强烈建议加,bge-reranker-base就行,top_k先放20再精排到5,召回率提升挺明显的。