mirror of
https://github.com/Alkatrazz24/Funk-lab.git
synced 2026-07-11 22:34:41 +02:00
feat(stt-server): grounding RAG — le cerveau répond depuis la doc Funk (#27)
Sans contexte, le modèle (qwen3-8b) hallucinait sur le homelab (« stockage décentralisé », « worker nodes »…) car il ignore tout du cluster réel. Le cerveau interroge désormais la collection funk-docs (la doc admin/ indexée) et injecte les passages pertinents au prompt → il répond à partir de la vraie doc. Coût ~nul : funk-docs et stt-memory partagent le même embedder nomic (:1238, 768 dim) → le vecteur de requête calculé pour le recall mémoire est réutilisé pour la recherche doc (une embed, deux recherches). Dégrade en silence si Qdrant/embed down (réponse sans doc plutôt qu'échec). Module knowledge.py (STT_DOCS_RAG, TOPK=6, MIN_SCORE=0.45). Log /v1/ask expose docs=<n>. Serveur 0.2.1 → 0.3.0. Validé : « c'est quoi le nom des nœuds ? » → avant « worker/master nodes » (inventé) ; après « Kubernetes ; nœuds storage-01, compute-01, compute-02 » (tiré de la doc). Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
767a94b1d0
commit
1db84e9041
7 changed files with 132 additions and 6 deletions
|
|
@ -26,7 +26,10 @@ class Settings:
|
|||
"STT_SYSTEM_PROMPT",
|
||||
"Tu es Hermes, l'assistant vocal du homelab Funk. "
|
||||
"Réponds toujours en français, de façon concise (2-3 phrases maximum), "
|
||||
"sans markdown ni listes.",
|
||||
"sans markdown ni listes. "
|
||||
"Pour toute question sur Funk (cluster, machines, services, configuration), appuie-toi "
|
||||
"EXCLUSIVEMENT sur la documentation fournie ci-dessous ; si l'information ne s'y "
|
||||
"trouve pas, dis-le franchement plutôt que d'inventer.",
|
||||
)
|
||||
max_tokens: int = int(os.getenv("STT_MAX_TOKENS", "200"))
|
||||
temperature: float = float(os.getenv("STT_TEMPERATURE", "0.7"))
|
||||
|
|
@ -51,5 +54,16 @@ class Settings:
|
|||
memory_recall_timeout: float = float(os.getenv("STT_MEMORY_RECALL_TIMEOUT", "4"))
|
||||
memory_store_timeout: float = float(os.getenv("STT_MEMORY_STORE_TIMEOUT", "20"))
|
||||
|
||||
# RAG documentaire : ancre les réponses dans la doc Funk (collection `funk-docs`,
|
||||
# même embedder nomic :1238 que la mémoire → le vecteur de requête est réutilisé).
|
||||
# Sans ça, le modèle répond de connaissances générales (hallucine sur le homelab).
|
||||
docs_rag: bool = os.getenv("STT_DOCS_RAG", "true").lower() == "true"
|
||||
docs_collection: str = os.getenv("STT_DOCS_COLLECTION", "funk-docs")
|
||||
docs_top_k: int = int(os.getenv("STT_DOCS_TOPK", "6"))
|
||||
# nomic étale les scores plus bas → seuil permissif (aligné sur rag-query).
|
||||
docs_min_score: float = float(os.getenv("STT_DOCS_MIN_SCORE", "0.45"))
|
||||
# Sur le chemin de réponse (1 recherche Qdrant, vecteur déjà calculé) → timeout serré.
|
||||
docs_timeout: float = float(os.getenv("STT_DOCS_TIMEOUT", "4"))
|
||||
|
||||
|
||||
settings = Settings()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue