Files
Loki/internal/loki/chat_memory_test.go
T
MichaelandClaude Fable 5 3edd356f34 Mémoire : recherche par couverture multi-mots et rareté des termes
Un mot fréquent noyait les bonnes pages : la recherche ne comptait que
les occurrences. Elle pondère maintenant chaque terme par sa rareté dans
la mémoire et favorise les pages qui couvrent plusieurs mots de la
requête.

Repris de l'amont AJEAN v0.11.7, avec ses tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7fwdmmVbvLHznF9v1npzN
2026-08-30 15:47:10 +02:00

51 lines
1.8 KiB
Go

package loki
import (
"strings"
"testing"
)
// Reproduit le bug rapporté : une petite page dont le NOM et le TITRE contiennent
// « copine » ne remontait pas pour la requête « copine Nathan », noyée par de
// grosses pages qui répètent « Nathan » des dizaines de fois. Le classement doit
// mettre en tête la page qui matche le PLUS de termes distincts (couverture),
// puis pondérer par la rareté.
func TestMemSearchCoverageBeatsFrequency(t *testing.T) {
testHome(t)
// Deux pages « bruyantes » bourrées de « Nathan », sans « copine ».
if err := MemAdd("business-nathan.md", "# Business Nathan\n"+strings.Repeat("Nathan veut un business. ", 40)); err != nil {
t.Fatal(err)
}
if err := MemAdd("guide-ajean.md", "# Guide AJEAN\n"+strings.Repeat("projet de Nathan. ", 30)); err != nil {
t.Fatal(err)
}
// La petite page cible : matche les DEUX termes de la requête.
if err := MemAdd("profil-copine-nathan.md", "# Profil : Copine de Nathan\n- Prénom : Bao\n"); err != nil {
t.Fatal(err)
}
hits := MemSearch("copine Nathan", 8)
if len(hits) == 0 {
t.Fatal("aucun résultat pour « copine Nathan »")
}
if hits[0].File != "profil-copine-nathan.md" {
var names []string
for _, h := range hits {
names = append(names, h.File)
}
t.Fatalf("la page copine devrait être 1re (matche les 2 termes), obtenu ordre : %v", names)
}
}
// Une requête mono-terme rare doit privilégier un match dans le nom/titre.
func TestMemSearchNameTitleBoost(t *testing.T) {
testHome(t)
_ = MemAdd("notes-diverses.md", "# Notes\nUn jour Bao est passée dire bonjour, puis repartie.\n")
_ = MemAdd("profil-copine.md", "# Profil : Copine\n- Prénom : Bao\n")
hits := MemSearch("copine", 8)
if len(hits) == 0 || hits[0].File != "profil-copine.md" {
t.Fatalf("la page dont le nom/titre porte « copine » devrait être 1re, obtenu : %+v", hits)
}
}