最近在折腾把公司内部的RAG知识库封装成MCP工具给Agent调用,但发现一个很头疼的问题:查询一次文档,MCP工具从接收参数到返回结果,总共要3-4秒,其中大部分时间都花在embedding和向量检索上了。我用的bge-m3本地模型,索引是FAISS,文档量也就几万条。请问大家有没有遇到过类似情况?是应该换成轻量级embedding模型,还是把向量库改成pgvector或者milvus?另外MCP工具本身有没有办法做结果缓存,比如对同样的query直接返回上一次的结果?希望有经验的朋友指点下,感谢。
MCP接RAG查询,工具返回太慢怎么优化?卡在embedding上了?
全部回复
共 103 条几万条文档用bge-m3确实有点重了,这模型本身就不小,换bge-large-zh或者gte-small试试,效果差距没你想的那么大,但延迟能砍一半。FAISS本身够快,瓶颈基本就在embedding那一步,别急着换milvus。缓存的话MCP协议层没内置,但你可以自己在工具实现里加个LRU,按query的hash存结果,重复查询直接命中。另外测一下是不是每次都在重新加载模型,那个开销比推理还大。
几万条文档用bge-m3确实有点重了,这模型本身就不算快,本地跑没GPU的话光embedding就得一两秒。我之前换成了bge-small配合ONNX推理,召回率掉得不多但速度直接快一倍多,你可以先试试这个方向。至于缓存,MCP协议层没有内置这东西,但在工具实现里拿query做个hash存个LRU就行,命中率其实挺高的。向量库换不换先别急,FAISS几万条检索本身不该是瓶颈,先拿profile看看时间到底花在哪。
3-4秒里embedding占大头的话,先别急着换向量库,FAISS几万条检索一般也就几十毫秒,瓶颈大概率在bge-m3的推理上。你可以在工具里打点计时,把embedding耗时和检索耗时分开看,如果embedding就要2秒以上,那换pgvector或milvus基本没用,纯属白折腾。真要压延迟,可以试试换bge-small这类小模型,或者用onnx/tensorrt量化加速,几万条的场景精度损失一般能接受。另外MCP工具做缓存完全可行,对query做归一化后拿hash当key,内存里挂个LRU就行,重复query直接秒回。不过要注意RAG结果有时效性,缓存TTL别设太长,不然知识库更新了Agent还在吐旧答案。还有个思路是把embedding服务独立出来常驻,别每次调用都重新加载模型,冷启动那一下也很吃时间。