Gedächtnis: nur Relevantes lernen/erinnern (Anti-Selbstbezug + Cache-Stabilität)
Der auto-lernende Mem0-Store sammelte trotz Relevanz-Direktive viel Müll: Fakten ÜBER den Assistenten selbst (Hermes/Lucy), transiente Zustände (Commit-Rückstand, Cronjob-Läufe, Onboarding-/Test-Fragen) und Gesprächs-Meta. Live-Store war zu ~40% solcher Ballast; der niedrige Recall-Schwellwert (0.3) blendete zudem marginale Fakten pro Turn ein und brach damit --cache-reuse. - mem0_service/app.py: custom_instructions verschärft (NIEMALS Fakten über den Assistenten selbst / keine zeitgebundenen Zustände) + deterministischer Post-Extraktions-Guard (_is_junk_fact) löscht Assistenten-Meta/transiente Fakten, die mem0-OSS trotz Direktive extrahiert — unabhängig vom LLM. - hermes/plugins/mc2-memory/__init__.py: RECALL_MIN_SCORE 0.3->0.5 (nur starke Treffer, oft leer -> stabilerer Prompt-Prefix -> --cache-reuse greift), MIN_USER_LEN 12->25 + Trivial-Turn-Skip (Begrüßung/Quittung/Aufwärmen). Alles env-überschreibbar und reversibel. Backend/Frontend unberührt. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -24,6 +24,7 @@ from __future__ import annotations
|
||||
import logging
|
||||
import os
|
||||
import queue
|
||||
import re
|
||||
import threading
|
||||
import time
|
||||
from typing import Any, Dict, List, Optional
|
||||
@@ -37,8 +38,11 @@ log = logging.getLogger(__name__)
|
||||
MC_URL = os.environ.get("MC_URL", "http://127.0.0.1:9001").rstrip("/")
|
||||
MC_TOKEN = os.environ.get("MC_TOKEN", "")
|
||||
RECALL_LIMIT = int(os.environ.get("MC2_MEMORY_RECALL_LIMIT", "5"))
|
||||
RECALL_MIN_SCORE = float(os.environ.get("MC2_MEMORY_RECALL_MIN_SCORE", "0.3"))
|
||||
MIN_USER_LEN = int(os.environ.get("MC2_MEMORY_MIN_USER_LEN", "12")) # zu Kurzes nicht lernen
|
||||
# 0.5 statt 0.3: nur starke Treffer einblenden → weniger Rausch-Fakten UND ein stabilerer
|
||||
# Prompt-Prefix (oft leer), damit --cache-reuse über Turns greift.
|
||||
RECALL_MIN_SCORE = float(os.environ.get("MC2_MEMORY_RECALL_MIN_SCORE", "0.5"))
|
||||
# 25 statt 12: triviale Kurz-Turns (Begrüßung/Quittung) gar nicht erst zum Lernen schicken.
|
||||
MIN_USER_LEN = int(os.environ.get("MC2_MEMORY_MIN_USER_LEN", "25")) # zu Kurzes nicht lernen
|
||||
# Anti-Memory-Poisoning (Stufe 0 Security): aus Turns mit untrusted Bildschirm-/Web-Inhalt NICHT
|
||||
# auto-lernen. Lucys Bildschirm-Sicht prependet diesen Marker an die User-Message (voice.py); auf dem
|
||||
# Schirm sichtbarer Text könnte Injection-Anweisungen tragen, die sonst DAUERHAFT ins Gedächtnis
|
||||
@@ -46,6 +50,20 @@ MIN_USER_LEN = int(os.environ.get("MC2_MEMORY_MIN_USER_LEN", "12")) # zu Kurzes
|
||||
SKIP_UNTRUSTED = os.environ.get("MC2_MEMORY_SKIP_UNTRUSTED", "1") not in ("0", "false", "False", "no")
|
||||
UNTRUSTED_MARKERS = ("[Bildschirm-Sicht",)
|
||||
|
||||
# Triviale Turns, die keinen dauerhaften Fakt tragen (reine Begrüßung/Quittung, Aufwärm-/Test-
|
||||
# Kommandos) → gar nicht erst zum Auto-Lernen schicken. Spart Extraktions-Läufe und verhindert
|
||||
# Müll-Fakten aus Meta-/Ablauf-Turns.
|
||||
_TRIVIAL_TURN_RE = re.compile(
|
||||
r"^\s*(?:(?:hi|hallo|hey|moin|servus|guten\s+(?:morgen|tag|abend)|danke\w*|"
|
||||
r"ok(?:ay)?|alles\s+klar|passt|super|top|cool|nice|ja|nein|jo|jup|jap)[\s.,!?]*)+$"
|
||||
r"|^\s*(?:aufw(?:ä|ae)rmen|/?test)\b",
|
||||
re.IGNORECASE,
|
||||
)
|
||||
|
||||
|
||||
def _is_trivial_turn(text: str) -> bool:
|
||||
return bool(_TRIVIAL_TURN_RE.search(text or ""))
|
||||
|
||||
|
||||
def _headers() -> dict:
|
||||
return {"X-MC-Token": MC_TOKEN} if MC_TOKEN else {}
|
||||
@@ -124,6 +142,9 @@ class MC2MemoryProvider(MemoryProvider):
|
||||
u = (user_content or "").strip()
|
||||
if len(u) < MIN_USER_LEN:
|
||||
return
|
||||
if _is_trivial_turn(u):
|
||||
log.debug("mc2-memory: trivialer Turn (Begrüßung/Quittung/Aufwärmen) — Auto-Lernen übersprungen")
|
||||
return
|
||||
if SKIP_UNTRUSTED and any(m in u for m in UNTRUSTED_MARKERS):
|
||||
log.debug("mc2-memory: Turn mit untrusted Bildschirm-/Web-Inhalt — Auto-Lernen übersprungen")
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user