feat: soglia di sicurezza in qmem_correct con query (correctMinScore default 0.60)

- rifiuta il supersede se lo score del top-1 è sotto soglia (evidenza debole/rumorosa)
- messaggio guida: verifica con qmem_search e riprova con memory_id esplicito
- soglia configurabile in ~/.config/pi-qmem/config.json
This commit is contained in:
Matteo Benedetto
2026-08-16 19:13:38 +02:00
parent bb182dc370
commit 625e569389
+19 -1
View File
@@ -29,12 +29,14 @@ interface MemoryConfig {
url: string;
apiKey: string;
timeoutMs?: number;
correctMinScore?: number;
}
const CONFIG_DEFAULTS: MemoryConfig = {
url: "http://10.8.0.3:8082",
apiKey: "",
timeoutMs: 30_000,
correctMinScore: 0.6,
};
// Retry su errori transitori (429/5xx/timeout): backoff esponenziale + jitter
@@ -343,7 +345,9 @@ export default function qmemExtension(pi: ExtensionAPI) {
"in archivio marcato superseded, mai eliminato). Passa memory_id se lo conosci (dalla risposta di " +
"qmem_search), oppure query per individuare automaticamente il record attivo più rilevante. Il testo " +
"corretto sostituisce quello vecchio nella ricerca semantica. Usalo quando hai evidenza verificata che " +
"una memoria è falsa: contraddizione con fonte autorevole, conferma dell'utente o esito di un'azione.",
"una memoria è falsa: contraddizione con fonte autorevole, conferma dell'utente o esito di un'azione. " +
"Con query: rifiuta se lo score del top-1 è sotto la soglia (correctMinScore, default 0.60) per evitare " +
"di supersedere il record sbagliato — in quel caso verifica e riprova con memory_id esplicito.",
promptGuidelines: [
"qmem_correct: correggi solo con evidenza verificata (fonte autorevole, conferma utente, esito di azione) — mai per semplice dubbio o opinione.",
"qmem_correct: il vecchio record resta in archivio marcato superseded — mai eliminare (tranne duplicati esatti).",
@@ -402,6 +406,20 @@ export default function qmemExtension(pi: ExtensionAPI) {
details: { error: "not_found" },
};
}
// Soglia di sicurezza: rifiuta correzioni su record deboli/rumorosi
const minScore = cfg.correctMinScore ?? 0.6;
if (results[0].score < minScore) {
return {
content: [
{
type: "text",
text: `Correzione rifiutata: il record più rilevante ha score ${results[0].score} < soglia ${minScore} (evidenza debole/rumorosa). ` +
`Verifica il record con qmem_search (include_superseded=true per la lineage) e riprova con memory_id esplicito, oppure abbassa correctMinScore nella config.`,
},
],
details: { error: "low_score", score: results[0].score, min_score: minScore },
};
}
memoryId = results[0].memory_id;
orig = results[0];
} else {