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:
+19
-1
@@ -29,12 +29,14 @@ interface MemoryConfig {
|
|||||||
url: string;
|
url: string;
|
||||||
apiKey: string;
|
apiKey: string;
|
||||||
timeoutMs?: number;
|
timeoutMs?: number;
|
||||||
|
correctMinScore?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
const CONFIG_DEFAULTS: MemoryConfig = {
|
const CONFIG_DEFAULTS: MemoryConfig = {
|
||||||
url: "http://10.8.0.3:8082",
|
url: "http://10.8.0.3:8082",
|
||||||
apiKey: "",
|
apiKey: "",
|
||||||
timeoutMs: 30_000,
|
timeoutMs: 30_000,
|
||||||
|
correctMinScore: 0.6,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Retry su errori transitori (429/5xx/timeout): backoff esponenziale + jitter
|
// 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 " +
|
"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 " +
|
"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 " +
|
"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: [
|
promptGuidelines: [
|
||||||
"qmem_correct: correggi solo con evidenza verificata (fonte autorevole, conferma utente, esito di azione) — mai per semplice dubbio o opinione.",
|
"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).",
|
"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" },
|
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;
|
memoryId = results[0].memory_id;
|
||||||
orig = results[0];
|
orig = results[0];
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user