语义搜索系统旨在理解用户查询的意图和上下文含义,以返回相关结果,即使关键词不完全匹配也是如此。其架构通常包含三个核心组件:数据预处理与嵌入、向量存储与索引,以及查询处理与排序。每个阶段都旨在将非结构化文本转换为有意义的数值表示、实现高效的相似性搜索,并优化结果以提高准确性。
第一步包括数据预处理和生成嵌入。原始文本(文档、网页等)经过清理、标准化处理,并分割成较小的块,以适应嵌入模型的输入限制。例如,一个 PDF 可能被分割成段落或句子。然后使用 BERT、Sentence-BERT 或 OpenAI 的 text-embeddings 等模型将这些块转换为密集向量表示。这些模型将文本映射到高维向量,从而捕获语义关系——相似的短语在向量空间中距离更近。例如,“car”和“vehicle”的嵌入向量会比“car”和“banana”的更近。像 Hugging Face 的 Transformers 库等工具通过提供预训练模型和 API 来简化此步骤,以便生成嵌入向量。
接下来,向量存储在针对相似性搜索优化的数据库中。传统数据库对于高维向量比较效率不高,因此使用专门的向量数据库,如 FAISS、Pinecone 或 Elasticsearch(及其 dense_vector 类型)。这些系统使用 HNSW(Hierarchical Navigable Small World)等算法对向量进行索引,以实现快速的近似最近邻搜索。例如,FAISS 使用量化和分区来降低搜索延迟,从而可以在几毫秒内查询数百万个向量。索引策略通常需要在速度和准确性之间进行权衡,这取决于具体的用例——产品搜索可能优先考虑速度,而研究论文检索系统可能更偏向于精度。
最后,在查询处理过程中,用户输入会使用与索引数据相同的模型转换为嵌入向量。系统从数据库中检索最接近的向量,并通常应用重新排序步骤来优化结果。例如,交叉编码器模型(如 BERT)可能会重新评估前 100 个结果,通过分析查询与每个文档之间更深层次的上下文关系来提高相关性。结合语义搜索和基于关键词技术(如 BM25)的混合方法也很常见。例如,混合系统可能首先使用 BM25 按精确关键词过滤结果,然后应用语义排序按含义对它们进行排序。性能通过诸如 recall@k(前 k 个结果中有多少相关项)和延迟等指标进行监控,并采用缓存机制来加快频繁查询的速度。