Trei probleme legate, gasite testand cu capturi reale. 1. RASPUNSURI GENERICE. Cand raspunsul nu era in documente, modelul primea oricum top-3 chunk-uri si compunea ceva plauzibil — utilizatorul pleca cu impresia ca a primit ajutor. Acum, daca nu avem acoperire, modelul nu mai e intrebat deloc: intrebarea pleaca la suport, cu referinta (M-260831-A1B2) si confirmare onesta — "am trimis" doar daca notificarea chiar a plecat, altfel "am inregistrat, dar nu am putut trimite". Jurnalul se scrie intotdeauna, in ~/.maria-bridge/escalations/, si se vede in dashboard. Daca a fost o captura, imaginea insasi se retrimite la suport (endpoint nou /send-image, limitat la MEDIA_DIR). 2. ORDONARE (rank.py). Un prag pe cosinus nu putea decide "avem raspunsul?": masurat pe indexul viu, intrebarile bune dau 0,600-0,816 si cele straine 0,534-0,685 — intervale care SE SUPRAPUN. Lipseau codurile: ORA-01722, D406, CIF sunt tokeni exacti pe care cautarea semantica ii topeste. Acum se ordoneaza de doua ori — embeddings si BM25 — si se fuzioneaza clasamentele (RRF), iar decizia de acoperire se ia pe dovezi: cosinus mare, sau cosinus de mijloc cu o fractiune din termenii distinctivi gasita chiar in chunk-uri. Fractiunea conteaza: cu un singur termen, "cum imi resetez parola de la Windows" trecea drept acoperita fiindca "parola" apare in documente. Pragurile sunt masurate, nu alese: ops/calibrate-rank.py ruleaza un set de cazuri pe indexul real si matura grila. 15/15 la strong=0.70 weak=0.58 ratio=0.5. 3. DICTIONAR DE ERORI ORACLE. 29 de erori uzuale, scrise pentru utilizatorul din fata aplicatiei: ce inseamna, ce poate incerca singur, cand sa sune. Fara nume de servere, IP-uri sau pasi de administrare — Maria e chatbot pentru clienti. Fisierul din git e SAMANTA: depozitul e oglinda Drive-ului, deci trebuie pus in document_store ca sa nu dispara la sincronizare. Pe drum, doua lucruri gasite in log: - fiecare mesaj din self-chat sosea de DOUA ori, pe @s.whatsapp.net si pe @lid, deci Maria raspundea de doua ori. Dedup pe key.id in punte. - reindexarea reface toate embeddings-urile (~7 s fiecare pe CPU): adaugarea unui document la 170 de chunk-uri insemna 20 de minute. Acum refoloseste vectorii chunk-urilor nemodificate din indexul precedent, fara vreun fisier nou de stare. Textul OCR se logheaza acum INTEGRAL, cu interogarea de cautare si sursele alese cu scorurile lor — fara asta un raspuns gresit nu se poate explica: nu stiai daca a citit prost captura sau a cautat prost in documente. 6 fisiere de test noi/extinse, 68 pass (de la 42). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q4uzvgm7AyJch5WH8QHRhY
74 lines
3.6 KiB
Plaintext
74 lines
3.6 KiB
Plaintext
# Configurarea puntii WhatsApp+RAG a lui Maria.
|
|
#
|
|
# install.sh copiaza acest fisier in ~/.maria-bridge/env cu drepturi 0600.
|
|
# Format KEY=value, fara `export`, fara expandare de variabile.
|
|
|
|
# --- Puntea WhatsApp (whatsapp/index.js) -----------------------------------
|
|
BRIDGE_HOST=127.0.0.1
|
|
BRIDGE_PORT=8099
|
|
# true = raspunde DOAR in chatul cu tine insuti (self-chat). Pune "false" abia
|
|
# dupa ce esti multumit de calitatea raspunsurilor — altfel Maria raspunde la
|
|
# oricine iti scrie pe numarul legat.
|
|
TEST_MODE_SELF_CHAT_ONLY=true
|
|
# Imaginile primite (capturi cu erori) peste aceasta marime sunt refuzate, fara
|
|
# descarcare. O captura de ecran normala are sub 1 MB.
|
|
MAX_MEDIA_MB=8
|
|
|
|
# --- OCR pentru capturile de ecran ------------------------------------------
|
|
# Modelul de raspuns e strict text, deci capturile trec prin tesseract inainte de
|
|
# RAG (vezi rag/ocr.py). Cere: apt-get install tesseract-ocr tesseract-ocr-ron
|
|
OCR_LANGS=ron+eng
|
|
OCR_MAX_CHARS=1500
|
|
OCR_TIMEOUT_S=60
|
|
|
|
# --- Ordonare (rank) si pragul de escaladare ---------------------------------
|
|
# Chunk-urile se ordoneaza de doua ori — semantic (embeddings) si lexical (BM25) —
|
|
# iar clasamentele se fuzioneaza. Vezi rag/rank.py; valorile de mai jos sunt
|
|
# calibrate pe indexul real, nu alese din burta.
|
|
# Peste RANK_STRONG_COSINE raspundem din documente fara alte conditii; sub
|
|
# RANK_WEAK_COSINE escaladam direct; intre ele, raspundem doar daca termenii rari
|
|
# din intrebare (coduri de eroare, in general) chiar apar in chunk-urile gasite.
|
|
RANK_STRONG_COSINE=0.70
|
|
RANK_WEAK_COSINE=0.58
|
|
RANK_RECALL_N=12
|
|
# Ce fractiune din termenii distinctivi ai intrebarii trebuie sa apara in
|
|
# chunk-urile gasite, ca sa salvam un cosinus de mijloc. Un singur termen gasit
|
|
# nu e o dovada — vezi ops/calibrate-rank.py.
|
|
RANK_MIN_RARE_RATIO=0.5
|
|
|
|
# --- Escaladare la suport ----------------------------------------------------
|
|
# Unde pleaca intrebarile la care Maria NU are raspuns in documente. Fara asta ar
|
|
# raspunde generic, ceea ce e mai rau decat sa nu raspunda deloc.
|
|
# JID de WhatsApp: "<numar>@s.whatsapp.net" pentru o persoana,
|
|
# "<id>@g.us" pentru un grup. Numarul se scrie international, fara "+".
|
|
# Gol = escaladarile se scriu doar in ~/.maria-bridge/escalations/, fara notificare.
|
|
SUPPORT_JID=
|
|
|
|
# --- Backend LLM + embeddings -----------------------------------------------
|
|
# Modelul de chat folosit pentru raspunsuri (format compatibil OpenAI
|
|
# /v1/chat/completions). Implicit presupune un tunel/proxy local catre acelasi
|
|
# backend folosit de Echo (LXC 110) — vezi docs/maria-whatsapp-rag-prototype.md.
|
|
LLM_URL=http://127.0.0.1:8091
|
|
# Ollama, pentru embeddings (nomic-embed-text).
|
|
OLLAMA_URL=http://127.0.0.1:11434
|
|
EMBED_MODEL=nomic-embed-text
|
|
TOP_K=3
|
|
MAX_TOKENS=250
|
|
POLL_INTERVAL_S=2
|
|
|
|
# --- Depozit de documente + sincronizare Google Drive -----------------------
|
|
# Tinta rclone pentru dosarul de documente din Drive (pe Windows apare ca
|
|
# D:\GoogleDrive\romfast\document_store). Se aduc doar *.txt, *.md, *.xml.
|
|
# Gol = sincronizare dezactivata; documentele se administreaza doar manual din
|
|
# dashboard. Vezi README.md, "Sincronizare cu Google Drive": autorizarea se face
|
|
# cu `rclone authorize` pe o masina cu browser, tokenul se muta aici — fara cont
|
|
# de serviciu. Exemplu, cu dosarul fixat pe ID:
|
|
# DRIVE_REMOTE=gdrive,root_folder_id=1C4e75zgH1_7ZK-_oBP5ZZBvUPh3iEo1O:
|
|
DRIVE_REMOTE=
|
|
|
|
# --- control -----------------------------------------------------------------
|
|
# Fara dashboard propriu: start/stop/restart, documente, reindexare si
|
|
# sincronizare Drive se fac din dashboard-ul puntii Discord (discord-bridge/),
|
|
# sectiunea "Maria — WhatsApp + RAG" — un singur panou comun, o singura
|
|
# autentificare (DASHBOARD_TOKEN din ~/.claude-discord/env).
|