最近在做RAG的MVP,数据量大概几十万条文本,先用了最蠢的办法——embedding后全量算余弦相似度,响应大概在几百毫秒到一秒多。后来同事说必须上FAISS或者Milvus,但我有点犹豫,毕竟现在的规模勉强能接受,而且换索引还得处理分片、持久化这些事。想请教一下实际生产里,暴力检索和用HNSW/IVF的差距到底有多大?主要瓶颈是在召回率还是延迟?有没有人试过在百万级数据下两者对比的实测数据?另外,如果后期要加过滤条件(比如按时间或类别筛),索引是不是反而会限制灵活性?
最近在做RAG的MVP,数据量大概几十万条文本,先用了最蠢的办法——embedding后全量算余弦相似度,响应大概在几百毫秒到一秒多。后来同事说必须上FAISS或者Milvus,但我有点犹豫,毕竟现在的规模勉强能接受,而且换索引还得处理分片、持久化这些事。想请教一下实际生产里,暴力检索和用HNSW/IVF的差距到底有多大?主要瓶颈是在召回率还是延迟?有没有人试过在百万级数据下两者对比的实测数据?另外,如果后期要加过滤条件(比如按时间或类别筛),索引是不是反而会限制灵活性?
几十万条用numpy暴力算其实也能扛,但QPS一上来就顶不住了,单请求几百毫秒乘个并发直接炸。我实测百万级用HNSW延迟能压到个位数毫秒,召回率调好参数基本没啥损失,瓶颈更多在内存和构建时间上。过滤这块确实要注意,Milvus这种支持标量过滤还行,纯FAISS就得自己先筛再搜,容易把召回搞崩。建议先拿faiss的IndexHNSWFlat跑个benchmark,几十万条几分钟就能出结果,比纠结强。