Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

HGraph MCI 挂件

HGraph 可以选择构建一个 MCI(Maximal Clique Index)挂件,用于带过滤条件的 KNN 搜索。这个挂件把团信息存放在 HGraph 索引内部,并复用 HGraph 的向量存储。它不是 独立索引类型:创建索引时仍然使用 hgraph,不要使用 mci

当主要负载是过滤搜索,并且过滤后只保留较小比例的向量时,可以启用这个功能。搜索 时,HGraph 会比较 Filter::ValidRatio() 和阈值,自动选择普通 HGraph 搜索或 MCI 挂件搜索。

构建配置

MCI 构建参数直接放在 index_param 下,不再使用嵌套对象。满足以下任一条件即 启用挂件:use_mci 为 true,或出现任意 MCI 构建参数。mci_knng_source 用于 选择构团所需 KNN 图的来源:可以从已经构建好的 HGraph bottom graph 派生,也可以 单独构建一张 ODescent 图。

{
  "dtype": "float32",
  "metric_type": "l2",
  "dim": 128,
  "index_param": {
    "base_quantization_type": "fp32",
    "max_degree": 32,
    "ef_construction": 400,
    "mci_mcs": 200,
    "mci_clique_max": 50,
    "mci_alpha": 1.2,
    "mci_knng_source": "odescent"
  }
}

mci_knng_source 默认为 hgraph,保持现有行为不变。设为 odescent 时, MCI 会直接基于已存储向量构建专用 KNN 图。若内部配置了外部 KNN 图文件路径, 外部文件的优先级高于此选项。

参数作用
use_mci设为 true 时使用默认构建参数启用 MCI。
mci_mcs构建团时使用的候选邻居数量。
mci_clique_max全量构建时的最大团大小。
mci_knng_sourceKNN 图来源:hgraph(默认)或 odescent
mci_alpha团构建扩展系数。
mci_incremental_join_ratio_thresholdAdd 时加入已有团的阈值。
mci_incremental_added_mct新节点最多加入的已有团数量。
mci_incremental_clique_max增量创建新团时的最大团大小。

搜索配置

搜索参数放在 hgraph 搜索对象下:

{
    "hgraph": {
      "ef_search": 120,
      "use_mci": true,
      "mci_seed_ratio": 0.1,
      "hgraph_valid_ratio_threshold": 0.2
    }
}

use_mci 在搜索时默认为 true,可以设为 false 来仅对本次查询关闭 MCI。 hgraph_valid_ratio_threshold 是搜索路由阈值:ValidRatio() 低于该阈值时走 MCI, 否则走 HGraph。默认值是 0.05

seed 数量按 ceil(sqrt(当前向量总数) * mci_seed_ratio) 计算,并且至少为 1。 mci_seed_ratio 默认值为 0.1,必须是有限的非负数。最终 seed 数量不会超过 满足过滤条件的点数。

MCI 挂件依赖过滤器提供合理的 ValidRatio()。bitset 和函数过滤器也可以 使用,但自定义 Filter 能给搜索规划提供更准确的选择率信息。

Add、序列化和统计

通过扁平构建参数启用 MCI 后,HGraph::Add() 会在每个新点插入 HGraph 后更新 MCI 挂件。它会先尝试加入合适的已有团;如果没有好的候选团,则为新点创建 一个小的增量团。

注意:MCI 索引不应通过在空索引上不断调用 Add() 从 0 开始构建。增量添加路径适用于 已有初始索引后,再追加少量向量的场景。

团数据会作为 HGraph 索引的一部分序列化。加载 HGraph 索引时,MCI 挂件会自动恢复。

GetStats() 会包含以下 MCI 质量字段:

  • mci_has_index
  • mci_total_nodes
  • mci_covered_nodes
  • mci_total_clique_count
  • mci_total_membership_count
  • mci_avg_membership_per_node
  • mci_avg_clique_size
  • mci_max_clique_size
  • mci_memory_usage

示例

最小构建和过滤搜索流程见 examples/cpp/324_feature_hgraph_mci_companion.cpp