Doua greseli din grupul "Maria Test", 2026-09-01, pe care 27409fb le-a atenuat dar
nu le-a rezolvat.
1. La o reclamatie vaga Maria cauta, in loc sa intrebe. "Buna . Am si eu o factura
pe luna august cu eroare in spv la trimitere AUTO SULE" nu spune CE eroare e —
n-are ce cauta in documente si n-are ce trimite la suport, fiindca programatorul
ar pune exact aceeasi intrebare. Gardul (triaj.prea_vag) exista, dar cerea text
sub 12 cuvinte; mesajul are 14. Gresea si invers: "nu pot incarca factura in SPV,
imi da eroare de certificat" are 9 cuvinte si ARE raspuns in documente, si era
oprita degeaba. Lungimea nu masoara cat de precis e mesajul.
-> gardul nu mai numara cuvinte si se aplica DUPA cautare, doar cand nu exista
acoperire. O singura data pe fir: daca nici intrebat omul nu spune mai mult,
mesajul pleaca la suport.
2. Textul si captura, trimise una dupa alta, erau tratate ca doua probleme fara
legatura. `este_continuare` rupea firul la ORICE imagine — dar cazul frecvent e
tocmai omul care scrie problema si trimite captura imediat dupa, sau care
raspunde la "trimite-mi o captura". Textul se pierdea, captura se cauta doar pe
OCR-ul ei, se deschideau doua fire si se puteau deschide doua escaladari pentru
aceeasi problema.
-> o captura in primele FIR_IMAGINE_MIN (5) minute continua firul: textul citit
din ea intra in ancora (cu tot cu coduri), cautarea se face pe mesaj +
captura, iar pe o escaladare deschisa pleaca la aceeasi referinta — cu
imaginea, nu doar cu textul citit din ea (_notifica_suport ia si media).
Si, ca urmare a lui (2): RANK_STRONG_COSINE dispare. Interogarea pe un fir e ancora
plus mesajul nou, deci cosinusul urca la fiecare replica fara sa apara vreo dovada
noua — aceeasi captura da 0,778 singura si 0,836 cu mesajul de dinainte, adica peste
0,80 pus ieri. Orice prag fix de sus e trecut de o discutie destul de lunga. Acoperirea
ramane pe dovada lexicala (termenii distinctivi ai intrebarii chiar in chunk-uri),
care e stabila la lungime. Niciun caz cu raspuns in documente nu avea nevoie de
scurtatura.
ops/calibrate-rank.py: 26/26, cu interogarea combinata adaugata la set. Teste: 102 pass.
Verificat end-to-end pe scenariul real (mesaj, apoi captura la 10 secunde): intrebare
de detalii, apoi o singura escaladare care poarta si textul si captura.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4uzvgm7AyJch5WH8QHRhY
84 lines
4.2 KiB
Plaintext
84 lines
4.2 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
|
|
# Grupuri in care Maria raspunde chiar si cu self-chat-only (JID-uri, separate prin
|
|
# virgula). JID-ul unui grup se citeste din punte: curl -s localhost:8099/groups
|
|
# ATENTIE: nu pune un grup in care raspunde si Echo (LXC 110) — puntea lui nu
|
|
# filtreaza `fromMe` in grupuri, deci cei doi boti isi raspund unul altuia la
|
|
# nesfarsit. Vezi docs/chatboti-si-punti.md.
|
|
ALLOWED_GROUP_JIDS=
|
|
|
|
# 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.
|
|
# Sub RANK_WEAK_COSINE escaladam direct; peste, raspundem doar daca termenii rari
|
|
# din intrebare (coduri de eroare, in general) chiar apar in chunk-urile gasite.
|
|
# Nu exista prag „cosinus destul de mare ca sa nu mai verificam" — vezi rag/rank.py.
|
|
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=
|
|
# Numarul spus clientului cand asteapta de peste 30 de minute fara raspuns.
|
|
SUPPORT_PHONE=
|
|
|
|
# --- 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
|
|
# 0 = raspunsul e mereu acelasi si sta in context. Nu urca fara motiv.
|
|
LLM_TEMPERATURE=0
|
|
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).
|