Appearance
4.1.3 文本、向量、关键词索引、元数据之间是什么关系?
先给结论:它们通常不是互相替代,而是在检索阶段分别负责不同类型的信号。
如果你把它们看成“四选一”,往往就会低估真实检索链路的复杂度。
可以先把这四层粗略理解成什么
1. 文本
文本负责回答:
- 这段内容到底说了什么
没有文本,系统后面即使知道“命中了一个向量对象”,也不知道最终该把什么内容送给模型。
2. 向量
向量负责回答:
- 这段内容在语义上和当前问题有多接近
它擅长处理:
- 语义相近
- 表达不同但意思接近
- 关键词不完全重合的情况
3. 关键词索引
关键词索引负责回答:
- 有没有明确命中某些词、术语、编号、实体名
它擅长处理:
- 专有名词
- 规则编号
- 产品型号
- 精确术语
4. metadata
metadata 负责回答:
- 这段内容属不属于当前应该参与比较的范围
- 它该怎么过滤、排序、聚合和治理
它擅长处理:
- 版本
- 状态
- 权限
- 租户
- 来源和业务边界
这四者在检索里通常怎么分工
如果把一次检索链路展开,很多真实系统更像这样:
- 先用 metadata 收边界
- 再用关键词和向量找相关内容
- 最后再把文本拿出来送给模型或后续重排
也就是说:
- 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 负责边界和治理。很多真正稳的检索系统,恰恰是把这几层一起组织好了。