传统搜索引擎靠关键词匹配。如果文档写的是"蟒蛇编程入门指南",用户搜"Python教程"就匹配不上。语义搜索解决的就是这个问题。
混合检索:向量+关键词
纯向量检索对精确关键词不敏感。用户搜索"FastAPI官方文档",他可能就是想要FastAPI的官方文档,而不是语义相近的Flask教程。这时候BM25反而更准。
最佳方案是混合检索。同时用向量检索和BM25检索,然后用Reciprocal Rank Fusion合并两路结果。RRF的公式很简单:每个文档在各路检索中的排名取倒数求和,按总分排序。不需要调权重,效果却出奇地好。
重排序提升精度
检索返回Top-20候选后,用Cross-Encoder重排序。Cross-Encoder把查询和文档拼接在一起输入模型,直接输出相关性分数,比双塔模型的向量相似度更准。推荐BAAI的bge-reranker-v2-m3。
查询改写
用户的问题可能表达不清楚。先用模型改写成更适合检索的形式,再去做向量搜索。比如用户问"电脑打不开怎么办",改写为"计算机无法启动的常见原因和解决方案"。
部署考量
百万级文档用单机FAISS。千万级用Milvus或Qdrant。延迟要求低于100ms选HNSW索引,M=16、ef_search=128是不错的起点。
语义搜索不是银弹,但搭配关键词检索和重排序,能覆盖绝大多数搜索场景。