feat(maria): modelul de embedding in cheia de cache si listarea grupurilor WhatsApp
Cheia de refolosire a embeddings-urilor era doar textul chunk-ului. La schimbarea
lui EMBED_MODEL indexul ar fi ramas un amestec de vectori din doua modele, iar
cautarea ar fi dat rezultate aiurea fara nici un mesaj de eroare. Acum fiecare
intrare poarta modelul cu care a fost calculata si se refolosesc doar cele cu
modelul curent; intrarile vechi, fara camp, se recalculeaza o singura data.
Indexul de pe container a fost stampilat manual cu `nomic-embed-text` (singurul
folosit pana acum), deci nu s-au recalculat cele 169 de chunk-uri.
`GET /groups` listeaza grupurile contului cu JID, nume si numar de participanti.
JID-ul unui grup ("120363...@g.us") nu se vede nicaieri in WhatsApp, iar el e
singurul mod de a scrie SUPPORT_JID pentru un grup de suport.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4uzvgm7AyJch5WH8QHRhY
This commit is contained in:
@@ -141,12 +141,22 @@ def _vectori_existenti() -> dict[str, list[float]]:
|
||||
|
||||
Sursa e chiar indexul precedent, nu un al doilea fisier de cache: nu are ce sa
|
||||
se desincronizeze, si daca indexul lipseste se recalculeaza tot, ca inainte.
|
||||
|
||||
Se refolosesc doar intrarile scrise cu modelul curent. Doua modele dau vectori
|
||||
diferiti (adesea si de alta lungime) pentru acelasi text, iar un index amestecat
|
||||
ar strica ordonarea fara nici un mesaj de eroare. Intrarile vechi, dinainte de
|
||||
campul `model`, se trateaza ca necunoscute: se recalculeaza o singura data.
|
||||
"""
|
||||
try:
|
||||
vechi = json.loads(config.INDEX_FILE.read_text(encoding="utf-8"))
|
||||
except (OSError, ValueError):
|
||||
return {}
|
||||
return {e["text"]: e["embedding"] for e in vechi if e.get("text") and e.get("embedding")}
|
||||
model = config.get("EMBED_MODEL")
|
||||
return {
|
||||
e["text"]: e["embedding"]
|
||||
for e in vechi
|
||||
if e.get("text") and e.get("embedding") and e.get("model") == model
|
||||
}
|
||||
|
||||
|
||||
def build() -> dict:
|
||||
@@ -154,6 +164,7 @@ def build() -> dict:
|
||||
warnings: list[str] = []
|
||||
docs = store.documents_for_index()
|
||||
refolosite = _vectori_existenti()
|
||||
model = config.get("EMBED_MODEL")
|
||||
reutilizari = 0
|
||||
for doc in docs:
|
||||
text = store.read_document(doc["name"])
|
||||
@@ -165,7 +176,8 @@ def build() -> dict:
|
||||
vec = embed(chunk)
|
||||
else:
|
||||
reutilizari += 1
|
||||
entries.append({"source": doc["name"], "chunk": i, "text": chunk, "embedding": vec})
|
||||
entries.append({"source": doc["name"], "chunk": i, "text": chunk,
|
||||
"embedding": vec, "model": model})
|
||||
config.STATE_DIR.mkdir(parents=True, exist_ok=True)
|
||||
# Scriere atomica: consumer-ul reciteste fisierul la 30s si ar putea prinde
|
||||
# un JSON pe jumatate scris daca am scrie direct peste el.
|
||||
|
||||
Reference in New Issue
Block a user