【向量库】Weaviate 搜索与索引技术:从基础概念到性能优化
文章目录
- 零、概述
- 一、搜索技术分类
- 1. 向量搜索:捕捉语义的智能检索
- 2. 关键字搜索:精确匹配的传统方案
- 3. 混合搜索:语义与精确的双重保障
- 二、向量检索技术分类
- 1. HNSW索引:大规模数据的高效引擎
- 2. Flat索引:小规模数据的轻量级方案
- 3. Dynamic索引:动态数据的智能适配
- 三、量化技术(与索引协同,提高搜索速度)
- 1. Product Quantization(PQ)
- 2. Binary Quantization(BQ)
- 3. Scalar Quantization(SQ)
- 四、重排序(Reranking):优化结果相关性的关键环节
零、概述
Weaviate通过向量搜索、关键字搜索、混合搜索的灵活组合,搭配HNSW、Flat、Dynamic索引及量化技术,提供了从语义理解到高效检索的完整解决方案。重排序模块进一步优化结果相关性,确保复杂场景下的搜索精度。
实际应用中,需根据数据规模、查询模式和业务需求动态调整技术栈,实现性能与效果的最佳平衡。
最佳实践:
- 索引选择指南
- 小规模数据(<1万条):Flat索引,配合BQ压缩提升磁盘性能。
- 中大规模数据(>10万条):HNSW索引,结合PQ量化优化内存占用。
- 动态数据场景:Dynamic索引,自动适配数据规模变化。
- 性能优化建议
- 向量量化优先:高维向量场景优先使用PQ+HNSW组合,平衡内存与速度。
- 参数调优:根据业务延迟要求调整HNSW的
ef
参数(低延迟场景设为10-100,高召回场景设为500-1000)。- 重排序策略:对关键业务场景启用重排序,使用深度学习模型(如BERT)提升结果质量。
一、搜索技术分类
1. 向量搜索:捕捉语义的智能检索
向量搜索是基于相似度的核心技术,通过机器学习模型将文本、图像等数据转化为高维向量(如OpenAI的text-embedding-ada-002生成1536维向量),利用余弦相似度或欧氏距离度量向量间的语义关联。例如,查询“dark”时,向量搜索能匹配到语义相近的“noir”或“black”,因为它们在向量空间中距离较近。
核心原理:通过向量化器(Vectorizer)将数据转换为向量,存储于向量数据库中。查询时,系统将输入转换为向量,与库中向量进行批量比较,返回最相似的前n个结果。
适用场景:跨模态检索(如图片-文本匹配)、多语言语义搜索、推荐系统等需要理解内容语义的场景。
2. 关键字搜索:精确匹配的传统方案
关键字搜索基于BM25算法,通过统计查询词在文档中的出现频率(TF)和逆文档频率(IDF)计算相关性分数。例如,查询“法律条款”时,包含该短语且出现次数多的文档得分更高。
核心原理:分词后统计词频,结合全局词频分布评估重要性,适合精确匹配场景(如法律条文检索、医疗记录查询)。
适用场景:用户查询明确、需精确匹配术语的场景,如技术文档搜索、电商商品标题匹配。
3. 混合搜索:语义与精确的双重保障
混合搜索结合了向量搜索和关键字搜索的优点,同时考虑语义相似度和关键词精确匹配。它会并行执行两种搜索,并将结果融合,生成最终的相关性排序。
例如,查询“人工智能发展趋势”时,向量搜索捕获“AI技术演进”等语义相关结果,关键字搜索匹配“人工智能”出现频繁的文档,两者融合后提升结果全面性。
混合搜索会分别执行向量搜索和关键字搜索,然后根据设定的融合算法(如 rankedFusion 或 relativeScoreFusion)和参数(如 alpha 权重)将两者的结果合并,得到更全面且鲁棒的搜索结果。适用于主题广泛、用户输入不可预测或需要兼顾语义与精确匹配的场景Hybrid Search 概念。
二、向量检索技术分类
1. HNSW索引:大规模数据的高效引擎
HNSW(分层可导航小世界图)是Weaviate处理大规模向量数据的核心索引,通过多层图结构实现对数时间复杂度的搜索。高层图节点稀疏,用于快速定位大致区域;底层图节点密集,用于精细化搜索。
关键参数:
efConstruction
:构建索引时的探索因子,数值越大(如100-500),索引质量越高但构建时间越长。ef
:查询时的探索因子,数值越大(如10-1000),召回率越高但查询速度越慢。
典型应用:实时推荐系统(如电商商品推荐)、图像检索(如百万级图片库快速查询)。
2. Flat索引:小规模数据的轻量级方案
Flat索引采用线性扫描,直接遍历所有向量计算距离,无需复杂索引构建过程。适用于数据量小(如几千条)或更新频繁的场景(如开发测试阶段)。结合二进制量化(BQ)可减少磁盘I/O,提升扫描速度。
优势:简单直接,无需预处理,适合动态数据场景。
局限:数据规模增大时性能显著下降,不适合高并发或大规模数据集。
3. Dynamic索引:动态数据的智能适配
Dynamic索引根据数据规模自动切换策略:数据较小时使用Flat索引,数据量增大后自动切换为HNSW索引。无需手动调整,适合数据规模动态变化的场景(如日志数据实时写入)。
如下小结
索引类型 | 数据规模适用性 | 核心结构/原理 | 关键参数 | 典型结合量化技术 |
---|---|---|---|---|
HNSW | 大规模 | 分层导航小世界图 | efConstruction、ef | PQ |
Flat | 小规模 | 线性扫描 | 无复杂参数 | BQ |
Dynamic | 动态变化 | 自动切换 | 无专属参数 | 按需结合 |
三、量化技术(与索引协同,提高搜索速度)
向量量化通过压缩 向量嵌入 的内存占用,降低部署成本并提升向量相似性搜索速度。Weaviate支持三种技术:Binary Quantization(BQ)、Product Quantization(PQ)、Scalar Quantization(SQ)。
1. Product Quantization(PQ)
a. 核心原理
- 两步压缩:先将向量维度分割为多个segments(段),再对每段独立量化为低精度表示(如8位整数)。
- 质心训练:通过K-means(无监督学习聚类算法)等算法为每段生成256个质心(默认),构成码本(codebook),用最近质心ID压缩向量段。
b. 关键参数与效果
- segments数量:需整除原始向量维度,影响内存与召回(越多segments→越高内存/召回)。 例:OpenAI text-embedding-ada-002(1536维)支持512/384/256等segments(见表1)。
- 压缩比:768维向量从3072字节(float32)压缩至128字节(128 segments×1字节),压缩约24倍。
c. 适用场景:与HNSW索引结合,减少内存占用并支持高维向量搜索。
表1:常见向量器的segments配置
模块 | 模型 | 维度 | 支持segments |
---|---|---|---|
openai | text-embedding-ada-002 | 1536 | 512, 384, 256, 192, 96 |
cohere | multilingual-22-12 | 768 | 384, 256, 192, 96 |
huggingface | sentence-transformers/all-MiniLM-L12-v2 | 384 | 192, 128, 96 |
2. Binary Quantization(BQ)
- 核心原理:将每个向量维度转为二进制(1位/维度),压缩比达32倍(如32位→1位)。
- 特点:
- 有损压缩:信息损失显著,距离计算精度较低。
- 适用模型:Cohere V3系列(如embed-multilingual-v3.0)和OpenAI ada-002表现较好,需结合业务数据测试。
- 优化:启用 向量缓存(vector cache) 减少磁盘读取,但需平衡内存占用(n_dimensions位/向量)。
- 适用场景:配合flat索引(磁盘型),加速搜索速度。
3. Scalar Quantization(SQ)
- 核心原理:将32位浮点值转为8位整数,通过256个均匀分布桶映射数值(基于训练数据的最小/最大值)。
- 压缩比:4倍(如32位→8位),精度高于BQ。
- 优化机制: 过.fetch与重打分(Rescoring):按
rescoreLimit
多获取候选向量,用原始向量重新计算距离。 例:查询limit=10,rescoreLimit=200→先取200条压缩结果,再用原始向量筛选前10条。 - 训练配置:默认10万条数据/分片,自动推导桶边界。
四、重排序(Reranking):优化结果相关性的关键环节
重排序通过重新排序搜索结果提升相关性,解决初始检索结果相关性不足的问题。例如,混合搜索返回的结果可通过重排序模块基于特定属性(如文本字段)和查询词进一步优化排序。
基本原理:
- 对每个 (查询, 数据对象) 计算 相关性分数,按分数从高到低排序。
- 仅作用于检索后的较小数据子集,避免对全量数据计算,降低计算成本。
- 可采用更复杂、计算成本更高的模型(如深度学习模型(bert))提升精度。
GraphQL示例:
{Get {JeopardyQuestion(nearText: { concepts: "flying" } // 混合搜索阶段limit: 10) {answerquestion_additional {rerank(property: "answer" // 基于answer属性重排序query: "floating" // 重排序查询词) {score // 重排序分数}}}}
}
如上查询,先通过nearText
执行混合搜索,返回10条结果;再通过rerank
基于answer
属性和查询"floating"重排序,返回每条结果的score
。
关键参数:
property
:指定用于重排序的对象属性(如文本字段)。query
:重排序时使用的查询词,可与检索阶段不同。