fix(embedding): kurze Legal-Docs behalten Sektions-Prefix (chunk_text_legal)

chunk_text_legal hatte einen Early-Return fuer text <= chunk_size, der den
[§ X]-Prefix uebersprang -> chunk_text_legal_structured konnte section/article
nicht extrahieren -> article="" -> (a) article_label fiel auf "BDSG" zurueck
(kein §), (b) deterministische Point-ID kollidierte (alle article="" -> gleiche
ID) -> ~die Haelfte kurzer §§ ueberschrieben sich. Fix: Early-Return traegt den
erkannten Sektions-Header als Prefix. Belegt am BDSG-§-Ingest: 44->86 distinkte
§§, §38 sauber "BDSG § 38". Wirkt nur auf KUENFTIGE Ingests (kein Re-Chunk).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-06-22 23:34:11 +02:00
parent f398088fbb
commit 870cdc871e
+7 -1
View File
@@ -483,7 +483,13 @@ def chunk_text_legal(text: str, chunk_size: int, overlap: int) -> List[str]:
Works for both German (DSGVO, BGB, AI Act DE) and English (NIST, SLSA, CRA EN) texts.
"""
if not text or len(text) <= chunk_size:
return [text.strip()] if text and text.strip() else []
body = (text or "").strip()
if not body:
return []
# Kurze Dokumente (ein §/Artikel) trotzdem mit Sektions-Prefix versehen, damit
# chunk_text_legal_structured Section/Artikel extrahieren kann (sonst article="").
hdr = _extract_section_header(body.split("\n", 1)[0])
return [f"[{hdr[:120]}] {body}"] if hdr else [body]
# --- Phase 1: Split into sections by legal headers ---
lines = text.split('\n')