Chunk Metadata
Chunk Metadata 是附加在每个文档块上的元数据,包括来源、页码、章节标题、创建时间等。它用于过滤、排序和引用。
#type / concept
#status / evergreen
#tech / ai
[!info] related notes
- 所属 MOC: RAG Engineering MOC
- 相关: Document Chunking, Citation Generation
Chunk Metadata
一句话定义
Chunk Metadata 是附加在每个文档块上的元数据。检索时不只看文本相似度,还可以按来源、时间、类型过滤。引用时需要知道内容来自哪个文档的哪一页。
核心原理
元数据字段
chunk_metadata = {
"source": "docs/product-manual.pdf", # 来源文件
"page": 42, # 页码
"chapter": "第三章 退款政策", # 章节
"doc_type": "policy", # 文档类型
"created_at": "2024-01-15", # 创建时间
"author": "客服团队", # 作者
"language": "zh", # 语言
}
带过滤的检索
async def search_with_filter(query_embedding, filters: dict, top_k: int = 10):
"""带元数据过滤的向量搜索"""
# 构建过滤条件
where_clause = " AND ".join([f"metadata->>'{k}' = ?" for k in filters])
where_values = list(filters.values())
results = await db.query(f"""
SELECT *, embedding <=> ? AS distance
FROM documents
WHERE {where_clause}
ORDER BY distance
LIMIT ?
""", [query_embedding] + where_values + [top_k])
return results
常见坑
- 不保留元数据: 丢失来源信息,无法引用
- 元数据不标准: 有的用 source,有的用 file_path
- 不过滤: 检索了所有文档,包括不相关的类型