元数据设计要解决什么
每个切片除文本与向量外还要携带元数据。它承担四件事:更新与删除时能精确定位到旧切片,回答时能标注来源与页码,检索时能按租户与密级过滤,出问题时能追溯到具体文档版本。元数据字段设计得早,后期换解析器、换切片策略都不至于推倒重来。
字段
| 字段 | 用途 |
|---|---|
| doc_id / chunk_id | 更新与删除的定位主键,引用定位 |
| source_path / url | 标注来源,点击回原文 |
| title_path / page | 引用到章节与页码 |
| doc_version / updated_at | 增量更新与陈旧内容排查 |
| acl_tags / tenant_id | 检索时权限过滤 |
| lang / doc_type | 按语言与类型过滤或加权 |
切片元数据示例
切片元数据示例
meta = {
"doc_id": "hr-policy-2026",
"chunk_id": "hr-policy-2026#p3-c2",
"source_path": "policies/hr-policy.pdf",
"title_path": "报销制度 > 差旅费",
"page": 3,
"doc_version": "2026-09-01",
"tenant_id": "t-001",
}典型使用场景
- 增量更新:文档改版后按 doc_id 删除旧切片再写入新切片
- 引用标注:答案里的编号回链到文件、章节与页码
- 权限隔离:检索条件里带上租户与密级,避免召回无权内容
- 陈旧排查:按 updated_at 找出长期未更新的文档,提醒业务方核对
- 效果分析:按文档类型统计命中分布,判断哪类资料最常被问到
设计原则
- 定位字段先行:doc_id 与 chunk_id 是更新与引用的基础,缺了后期很难补
- 权限字段入库时就写入,不要等检索时再查外部权限表
- 保持取值可枚举:文档类型、密级用固定枚举,便于过滤与统计
- 版本信息带上时间:只写版本号无法判断新旧,配合生效日期更实用
- 控制字段数量:字段越多写入越慢,只保留确实会被过滤或展示的项
字段与使用方式
| 字段类型 | 典型字段 | 使用方式 |
|---|---|---|
| 标识类 | doc_id、chunk_id | 主键式查找与删除,需建唯一索引 |
| 过滤类 | tenant_id、acl_tags、doc_type | 参与检索过滤,需建标量索引 |
| 展示类 | source_path、title_path、page | 只在回答中展示,可不建索引 |
| 时间类 | doc_version、updated_at | 范围过滤与排序,适合建索引 |
元数据字段在向量库里要建标量索引(如 Qdrant 的 payload index、pgvector 的普通 B-tree 索引),否则带过滤条件的检索会明显变慢。