Rabbook / rag /metadata.py
Matcry's picture
Deploy snapshot
c76423f
Raw
History Blame Contribute Delete
1.76 kB
import hashlib
from pathlib import Path
def build_document_id(source: str) -> str:
"""
Build a stable identifier for a source document.
"""
return hashlib.sha256(source.encode("utf-8")).hexdigest()[:16]
def enrich_document_metadata(documents):
"""
Normalize file-level metadata before splitting into chunks.
"""
enriched = []
for doc in documents:
source = str(doc.metadata.get("source", "")).strip()
existing_file_name = str(doc.metadata.get("file_name", "")).strip()
existing_file_type = str(doc.metadata.get("file_type", "")).strip()
path = Path(source) if source else None
page = doc.metadata.get("page")
doc.metadata["source"] = source or "unknown"
doc.metadata["file_name"] = existing_file_name or (path.name if path else "unknown")
doc.metadata["file_type"] = existing_file_type or (
path.suffix.lower().lstrip(".") if path else "unknown"
)
doc.metadata["document_id"] = build_document_id(
source or doc.metadata.get("source_url", "") or doc.metadata["file_name"]
)
doc.metadata["page"] = page if page is not None else None
enriched.append(doc)
return enriched
def enrich_chunk_metadata(chunks):
"""
Add chunk-level metadata after splitting so each chunk is traceable.
"""
chunk_counts: dict[str, int] = {}
for chunk in chunks:
document_id = chunk.metadata.get("document_id", "unknown")
chunk_index = chunk_counts.get(document_id, 0)
chunk_counts[document_id] = chunk_index + 1
chunk.metadata["chunk_index"] = chunk_index
chunk.metadata["chunk_id"] = f"{document_id}-chunk-{chunk_index}"
return chunks