Skip to content

4.1.3 文本、向量、关键词索引、元数据之间是什么关系? ​

先给结论:它们通常不是互相替代,而是在检索阶段分别负责不同类型的信号。

如果你把它们看成“四选一”,往往就会低估真实检索链路的复杂度。

可以先把这四层粗略理解成什么 ​

1. 文本 ​

文本负责回答:

  • 这段内容到底说了什么

没有文本,系统后面即使知道“命中了一个向量对象”,也不知道最终该把什么内容送给模型。

2. 向量 ​

向量负责回答:

  • 这段内容在语义上和当前问题有多接近

它擅长处理:

  • 语义相近
  • 表达不同但意思接近
  • 关键词不完全重合的情况

3. 关键词索引 ​

关键词索引负责回答:

  • 有没有明确命中某些词、术语、编号、实体名

它擅长处理:

  • 专有名词
  • 规则编号
  • 产品型号
  • 精确术语

4. metadata ​

metadata 负责回答:

  • 这段内容属不属于当前应该参与比较的范围
  • 它该怎么过滤、排序、聚合和治理

它擅长处理:

  • 版本
  • 状态
  • 权限
  • 租户
  • 来源和业务边界

这四者在检索里通常怎么分工 ​

如果把一次检索链路展开,很多真实系统更像这样:

  1. 先用 metadata 收边界
  2. 再用关键词和向量找相关内容
  3. 最后再把文本拿出来送给模型或后续重排

也就是说:

  • metadata 更像“先决定哪些对象有资格参与”
  • 向量和关键词更像“在这些对象里决定谁更相关”
  • 文本更像“最终要被系统和模型真正消费的内容”

为什么很多系统会同时用向量和关键词 ​

因为它们擅长的信号不同。

向量更擅长:

  • 语义相似
  • 近义表达
  • 描述方式变化

关键词更擅长:

  • 精确术语
  • 编号
  • 特定实体
  • 罕见关键词

所以很多系统只用一种信号时,经常都会有盲点。

这也是混合检索常见的原因。

一个最小示意 ​

python
indexed_record = {
    "id": "refund-policy-v3#chunk-03",
    "text": "定制类商品不支持无理由退货。",
    "vector": [0.12, -0.03, 0.88, ...],
    "keywords": ["定制类商品", "无理由退货"],
    "metadata": {
        "doc_id": "refund-policy-v3",
        "status": "active",
        "tenant_id": "tenant-a",
        "doc_type": "policy"
    }
}

这个对象里:

  • 文本负责“内容本身”
  • 向量负责“语义检索”
  • 关键词负责“精确命中”
  • metadata 负责“边界控制和治理”

这四层一起,才更接近真实可用的检索对象。

一个更实际的理解方式 ​

如果只用向量,没有关键词,常见问题是:

  • 精确术语命中不稳
  • 规则编号和产品型号容易丢

如果只用关键词,没有向量,常见问题是:

  • 表达变了就找不到
  • 近义说法处理差

如果没有 metadata,常见问题是:

  • 版本混进来
  • 权限边界不稳
  • 多租户内容串边界

所以这几层通常不是替代关系,而是互补关系。

一个常见误区 ​

很多人会觉得:

  • 做了向量检索,就不太需要关键词和 metadata 了

这在真实业务里通常不成立。

因为向量相似度解决的是“语义接近”,但企业系统里常常还需要同时保证:

  • 精确命中
  • 权限正确
  • 版本正确
  • 边界正确

这些都不是单靠向量就能解决的。

一句话总结 ​

文本、向量、关键词索引和 metadata 在检索里通常是分工协作关系。文本负责内容本身,向量负责语义相似,关键词负责精确命中,metadata 负责边界和治理。很多真正稳的检索系统,恰恰是把这几层一起组织好了。