Grupul "Maria Test", 2026-09-01, ambele mesaje au primit raspunsuri inventate:
- "am si eu o factura pe luna august cu eroare in spv la trimitere AUTO SULE"
(cosinus 0,768) — mesajul nu spune CE eroare e; Maria a explicat cum se reface
o factura stearsa si a trimis omul sa verifice drepturile pe CIF in SPV.
- captura cu `<Error errorMessage="CUI cumparator incorect"/>` (0,778) — eroarea
nu exista in niciun document; Maria a inventat o procedura cu "ID de descarcare",
Borderou eFactura si retrimitere manuala.
Cauza: `RANK_STRONG_COSINE=0,70` inseamna "cosinusul singur e destul", dar toate
chunk-urile eFactura seamana intre ele — la 0,7x cosinusul nu mai distinge "e in
documente" de "e despre eFactura". Aceeasi greseala ca la codurile Oracle
(ORA-06550 vs ORA-12541, b7d75f0), doar ca fara cod pe care sa te sprijini.
- RANK_STRONG_COSINE 0,70 -> 0,80: peste atat trec doar potrivirile aproape
textuale, restul cad pe dovada lexicala (termenii rari ai intrebarii chiar in
chunk-uri). Ambele mesaje escaladeaza acum la suport.
- LLM_TEMPERATURE=0 la apelul modelului. Fara el llama.cpp foloseste 0,8 —
creativitate exact acolo unde vrem doar ce scrie in context.
- Cele doua cazuri reale sunt adaugate in ops/calibrate-rank.py: 25/25.
Teste: 99 pass.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4uzvgm7AyJch5WH8QHRhY
85 lines
4.2 KiB
Plaintext
85 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.
|
|
# 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.80
|
|
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).
|