Isolamento RESTRICTED
I livelli di sensibilità, e come i contenuti RESTRICTED vengono filtrati in due uscite indipendenti prima che possano mai raggiungere un prompt LLM.
Alcuni contenuti non devono mai lasciare il dominio — note sui rating del consiglio, verbali
del comitato esecutivo. RAGSpine modella questo con un livello di sensibilità su ogni chunk, e garantisce
che il contenuto RESTRICTED venga rimosso in due uscite indipendenti prima che possa raggiungere un
prompt.
Garanzia. Il contenuto con sensibilità RESTRICTED viene filtrato in due uscite — retrieval/link e
retrieval/rerank — quindi non può mai entrare in un prompt LLM. Entrambi i filtri devono rimanere; uno solo dei due è
insufficiente.
Livelli di sensibilità
La sensibilità è una colonna di tipo stringa su ogni chunk (retrieval/chunking/chunk_store.py,
con valore predefinito INTERNAL). La classificazione è deterministica e guidata dalla configurazione
(common/sensitivity.py, classify_sensitivity + SensitivityPolicy):
restricted_filename_patterns → RESTRICTED.restricted_keyword → RESTRICTED.escalate_unknown_to_restricted è attivo → RESTRICTED.default_level della policy (INTERNAL per impostazione predefinita).Questo è un approccio fail-safe basato sui segnali: un documento non etichettato ma portatore di segnali viene elevato a
RESTRICTED. Una regola generalizzata "tutto ciò che è sconosciuto → RESTRICTED" nasconderebbe i report ordinari e romperebbe
il recupero, quindi è un interruttore strict opzionale, disattivato per impostazione predefinita. La policy viene caricata dalla
sezione di configurazione [sensitivity] — nessuna parola specifica dell'azienda è codificata a livello di codice.
Due uscite, non una
Il canale narrativo tocca il contenuto RESTRICTED in due punti che conducono verso un LLM,
e ciascuno filtra in modo indipendente.
L'adapter che collega il recupero all'agent (retrieval/link/narrative_link.py).
L'agent inserisce il testo degli snippet recuperati nel prompt di sintesi dell'LLM, quindi
l'adapter scarta ogni chunk RESTRICTED all'uscita, prima che gli snippet vengano restituiti:
return [
_to_snippet(r)
for r in results
if str(r.chunk.sensitivity).upper() != RESTRICTED_SENSITIVITY
]La corrispondenza è insensibile alle maiuscole/minuscole. Senza questo filtro, il testo di uno snippet RESTRICTED
finirebbe direttamente nel prompt di sintesi.
Il reranker listwise (retrieval/rerank/listwise_rerank.py). Il reranking invia il testo dei
candidati a un giudice LLM, quindi i candidati RESTRICTED non vengono mai inseriti nel
prompt del giudice:
- Solo il sottoinsieme non-RESTRICTED viene inviato al giudice.
- I chunk
RESTRICTEDvengono mantenuti fermi nella loro posizione RRF originale. - Se ogni candidato è
RESTRICTED, il giudice non viene chiamato affatto e il risultato degrada al puro ordine RRF.
Questa è la "strategia B": mantiene la qualità del reranking per il sottoinsieme non sensibile,
garantendo al contempo che zero testo RESTRICTED raggiunga il giudice (un test congelato lo vincola).
Perché sono necessarie entrambe
Le due uscite proteggono due superfici diverse rivolte verso l'LLM: il prompt del giudice di reranking e il prompt di sintesi. Un chunk potrebbe sopravvivere a un percorso ed essere comunque diretto verso l'altro.
Difesa in profondità: il filtro di reranking protegge il giudice; il filtro di link protegge la sintesi. Entrambi
gli invarianti sono elencati in retrieval/CLAUDE.md come "entrambi devono rimanere", e l'escalation
fail-safe del classificatore a monte è la prima linea — se un documento RESTRICTED fosse etichettato erroneamente come INTERNAL durante
l'ingestione, entrambi i filtri di uscita lo lascerebbero passare. Un'etichettatura errata equivale a una fuga di informazioni; il classificatore
deterministico la previene.
La protezione più precoce dell'agent: entità fuori ambito
Separatamente, il gate di sicurezza deterministico rifiuta le domande su entità fuori ambito / concorrenti
prima che qualsiasi canale, tool, retriever o chiamata LLM venga eseguita (agent/agent.py:
CLARIFY_OUT_OF_SCOPE_ENTITY risponde per primo). Il gate è intenzionalmente
mai sostituibile: rideriva l'ambito concorrente/esterno dalla domanda grezza e
maschera gli alias corrispondenti con spazi di uguale lunghezza, quindi sostituire un parser di intenti
diverso (anche basato su LLM) non può aggirarlo. Il sistema non emette mai un numero dell'azienda di riferimento
in risposta a una domanda su un'entità esterna.
Provenienza
Ogni fatto e ogni risposta porta con sé un id del documento sorgente più un locator — un lignaggio che viaggia end-to-end e non viene mai perso.
Short-circuit FAQ
Una cache di domande e risposte verificate da esperti di dominio che bypassa l'LLM — protetta da esclusioni conservative, perché si trova a monte della protezione di prevenzione delle risposte inventate.