跳到主要内容

向量索引优化

  • 索引的作用是:让向量数据库更快的找到相似内容
  • 如果不使用向量索引,向量检索时,相当于在海量的数据中每次都全量的扫描所有的向量
  • 通过向量索引,相当于给向量数据加上了目录导航,快速快速匹配相似内容,不需要遍历所有向量

向量索引常见类型​

  • HNSW 是 RAG 很常见的选择,可以理解为地图、建立导航,基于图的索引
    • 建立地图、内存消耗大、查询快,适合语义查询
  • flat可以理解为精准查询,结果最准,但数据量大时会比较慢
    • 类似mysql的精确查询
    • flat这种类型就像没有加索引的mysql的全表扫描
  • 火山引擎的向量数据库**VikingDB,**索引算法支持HNSW混合检索
    • HNSW-Hybrid:| 索引类型 | 简单理解 | | -------- | -------------------------------- | | Flat | 暴力搜索,最准确但慢 | | HNSW | 常用,速度快,效果好 | | IVF | 先聚类,再查相关区域 | | PQ | 压缩向量,省空间,但可能损失精度 |

向量索引类型记忆​

  • HNSW:图结构快速找到与查询向量相近的向量
名称英文拆解一句话记忆
FLATflat = 平铺全量扫描,最准但慢
IVFinverted file = 倒排文件先分桶,再搜索
IVF_FLATIVF + 原始向量分桶后用原始向量比
IVF_PQIVF + product quantization分桶后压缩向量,省内存
PQproduct quantization向量压缩
HNSWhierarchical navigable small world图导航,高速找相似
SCANNscalable nearest neighbors可扩展近邻搜索
DiskANNdisk approximate nearest neighbor磁盘版大规模向量索引
Cosinecosine similarity看方向是否相似
IPinner product看点积
L2Euclidean distance看空间距离

对比传统数据库的索引​

  • 传统数据库索引:为了快速找到“精确匹配”的数据。
  • 向量索引:为了快速找到“语义相似”的数据
对比项传统数据库索引向量索引
主要对象数字、字符串、日期、ID、状态字段高维向量,比如 [0.12, -0.35, 0.88...]
查询方式精确匹配、范围查询、排序查询相似度查询、最近邻查询
是否精确通常是精确查询通常是近似查询
常见索引B-Tree、Hash、Bitmap、倒排索引Flat、HNSW、IVF、IVF_PQ、DiskANN
结果含义找到满足条件的数据找到最相似的数据
主要优化目标查询更快相似搜索更快、召回更高
典型应用用户表、订单表、商品表、日志表RAG、语义搜索、推荐系统、图片搜索

向量索引配置​

  • 选择索引类型
  • 选择相似度计算方式
  • 创建索引时的参数
  • 查询的参数
配置项作用常见值
index_type选择索引类型FLAT、HNSW、IVF_FLAT、IVF_PQ
metric_type选择相似度计算方式COSINE、IP、L2
index_params建索引时的参数M、efConstruction、nlist
search_params查询时的参数efSearch、nprobe

索引配置理解​

bash
index_type = 用哪种目录结构
metric_type = 用什么方式判断相似
index_params = 建目录时怎么建
search_params = 查询时查多深、查多广

RAG 推荐默认配置​

  • HNSW 负责快速语义召回
  • BM25 负责关键词/编号召回
  • Rerank 负责精排
  • 最终 top 5 给大模型
json
{
"embedding_model": "你的文本向量模型",
"index_type": "HNSW",
"metric_type": "COSINE",
"index_params": {
"M": 32,
"efConstruction": 200
},
"search_params": {
"efSearch": 128
},
"retrieval": {
"vector_top_k": 30,
"bm25_top_k": 30,
"rerank_top_n": 5
},
"chunk": {
"chunk_size": "500~800 tokens",
"chunk_overlap": "50~150 tokens"
}
}

相关参数配置理解​

  • nprobe 是 IVF 索引里的查询参数,可以理解为查询时探测多少个桶。
    • probe 是“探测”的意思,
参数属于哪里作用一句话
top_k检索返回参数最终返回多少条候选结果
efSearchHNSW 索引查询参数HNSW 查询时搜索多大范围

索引优化​

  • 根据RAG的评测进行调整参数
bash
速度慢 → 降低 efSearch / nprobe / top_k
内存高 → 降低 M 或使用 IVF_PQ
排序不准 → 加 rerank

召回低理解​

召回可以理解为

  • 召回:检索出来的chunk / 检索出来的结果
  • Recall:召回
  • 召回公式:Recall = 找到的正确结果数量 / 所有应该找到的正确结果数量
  • 召回率 = 找回来了多少正确答案
  • 例子:比如你要搜索一个答案,答案目标chunk有10个,却找出来了8个,漏了2个
    • 召回率:8/10 = 80%

在 RAG 里,它主要用来衡量:

用户问一个问题时,检索系统有没有把包含答案的 chunk 找出来 召回低:

  • 知识库里明明有答案,但检索阶段没有把答案相关的 chunk 找出来

召回低优化​

问题优化方法
正确答案排在后面增大 top_k,比如从 5 提到 30
HNSW 搜不到增大 efSearch
IVF 搜不到增大 nprobe
专有名词搜不到加 BM25 / 关键词检索
语义匹配差换更好的 embedding 模型
chunk 不合理调整 chunk_size 和 overlap
无关结果太多加 rerank
过滤太严格检查 metadata filter
新资料搜不到检查索引更新流程