feat(brain): Volltext-Suche zusaetzlich zu Semantic — Default ist jetzt Wortlich
Stefan wollte ne richtige Suche statt nur "klingt aehnlich". Beide Modi sind jetzt verfuegbar, Default ist Volltext: - 📝 Wortlich (Substring, case-insensitive ueber Title + Content + Category + Tags) — neuer Endpoint /memory/search-text. Full-Scan via Qdrant scroll, k=50. Findet "cessna" exakt im Content. Bei kleiner DB (<1000 Eintraege) unkritisch performant. - 🧠 Semantisch (Embedder + score_threshold 0.30) — bestehender /memory/search Endpoint. Findet konzeptuell verwandte Eintraege. Diagnostic UI: Dropdown neben dem Suchfeld zum Modus-Wechsel. Info-Banner zeigt klar welcher Modus aktiv ist. Warum Wortlich Default: bei kleiner DB liefert Semantic gern False Positives mit Score 0.30-0.45 fuer komplett unverwandte Begriffe (z.B. "cessna" matched "Tageslog fuehren" mit 0.43). Wortlich ist deterministisch und vermeidet das Rauschen. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -181,6 +181,23 @@ def memory_pinned():
|
||||
return [MemoryOut.from_point(p) for p in store().list_pinned()]
|
||||
|
||||
|
||||
@app.get("/memory/search-text", response_model=List[MemoryOut])
|
||||
def memory_search_text(
|
||||
q: str,
|
||||
k: int = 50,
|
||||
type: Optional[str] = None,
|
||||
include_pinned: bool = True,
|
||||
):
|
||||
"""Volltext-Substring-Suche (case-insensitive) ueber Title + Content +
|
||||
Category + Tags. Findet exakte Begriffe — z.B. 'cessna' matched 'Cessna 172'.
|
||||
Im Gegensatz zu /memory/search (semantic) keine 'klingt aehnlich'-Treffer."""
|
||||
points = store().search_text(
|
||||
q, k=k, type_filter=type,
|
||||
exclude_pinned=not include_pinned,
|
||||
)
|
||||
return [MemoryOut.from_point(p) for p in points]
|
||||
|
||||
|
||||
@app.get("/memory/search", response_model=List[MemoryOut])
|
||||
def memory_search(
|
||||
q: str,
|
||||
|
||||
Reference in New Issue
Block a user