fix: qualité codage — anti-hallucination LLM + négation regex + veto calibration

- Prompt DAS_EXTRACTION : ajout consignes anti-hallucination (zero invention,
  pas d'inférence de comorbidités, exiger citation exacte du texte)
- Prompt CODING_CIM10 : ajout consignes conditionnel et négation
- diagnostic_extraction.py : détection de négation avant les patterns regex DAS
  (bloque "pas d'embolie", "absence de sepsis", "sans signe d'IRC", etc.)
- veto_engine.py : VETO-03 conditionnel cherche maintenant PRÈS du concept
  (40 chars), "si" isolé ne déclenche plus de faux positif, ajout cues
  (possible, risque de, aspect de, à confirmer, à rechercher)
- veto_engine.py : négation enrichie (ne retrouve pas, sans signe/argument,
  écarté, infirmé, pas mis en évidence)

Batch analysis: VETO-02 63% from LLM hallucinations, VETO-03 63% false positives

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
dom
2026-03-07 23:59:02 +01:00
parent a371626f40
commit 214a5d1914
3 changed files with 69 additions and 4 deletions

View File

@@ -256,9 +256,29 @@ def _find_diagnostics_associes(
text_norm = normalize_text(text_lower)
# Patterns de négation pour filtrer les faux positifs regex
_NEG_PATTERNS = (
r"pas\s+d[e']?\s*",
r"(?:absence|aucun[e]?)\s+d[e']?\s*",
r"(?:sans|ni)\s+",
r"(?:elimine[er]?|exclut?|ecarte[er]?)\s+",
r"ne\s+retrouv\w+\s+pas\s+d[e']?\s*",
r"ne\s+montr\w+\s+pas\s+d[e']?\s*",
r"pas\s+(?:mis\s+en\s+evidence|objective?|retrouve)",
r"infirm\w+\s+",
r"sans\s+(?:signe|argument|evidence)\s+d[e']?\s*",
)
_neg_rx = re.compile("|".join(_NEG_PATTERNS), re.IGNORECASE)
# Patterns DAS
for pat, label, code in _DAS_PATTERNS:
if re.search(pat, text_norm) and code not in existing_codes:
m = re.search(pat, text_norm)
if m and code not in existing_codes:
# Vérifier que le match n'est pas précédé d'une négation (40 chars avant)
start = max(0, m.start() - 40)
context_before = text_norm[start:m.start()]
if _neg_rx.search(context_before):
continue
das.append(Diagnostic(texte=label, cim10_suggestion=code, source="regex"))
existing_codes.add(code)