Suurepärane küsimus! Sul on kaks paralleelset süsteemi sama eesmärgiga (teadusartiklite analüüs ja RAG), aga erineva tehnoloogiaga. Teeme strateegilise plaani, kuidas neid integreerida. --- ## Olukorra analüüs ## Olemasolevad süsteemid |Aspekt|**Praegune süsteem (pgvector)**|**Weaviate süsteem (DeepSeek)**| |---|---|---| |**Vektorbaas**|PostgreSQL + pgvector|Weaviate| |**Embeddings**|bge-small-en-v1.5 (384-dim, lokaalne)|? (tõenäoliselt DeepSeek/OpenAI API)| |**Teksti ekstrakt**|pdfplumber → structured JSON → chunks|? (tõenäoliselt sarnane või lihtsam)| |**Metaandmed**|raw_documents, processed_documents, chunks (lehekülg, hash, timestamps)|Weaviate properties: title, authors, year, doi, abstract_en, summary_et, key_concepts, methods_used, transport_context, relevance_score| |**Analüüs**|Puudub (ainult tekst + chunkid)|**DeepSeek API genereerib**: kokkuvõtte (summary_et), märksõnad, meetodid, transpordikonteksti, relevantsusskoor| |**Kasutus**|Semantiline otsing chunkide tasemel|Semantiline otsing artiklite tasemel + rikkalikud metaandmed| ## Tugevused ja nõrkused **pgvector süsteem:** - ✅ Täielik kontroll, lokaalne, odav. - ✅ Chunk-taseme granulaarsus (täpne tsiteerimine). - ✅ Kõva seos PDF-failiga (file_hash, lehekülg). - ❌ Puudub artikli-taseme semantiline analüüs (meetodid, järeldused, transpordikontekst). **Weaviate + DeepSeek süsteem:** - ✅ Rikkalikud metaandmed (automaatselt genereeritud kokkuvõtted, märksõnad, transpordikontekst). - ✅ Artikli-taseme otsing (nt "leia artiklid, mis käsitlevad noorte juhtide riski"). - ❌ Ei pruugi olla chunk-taseme täpsust (raske tsiteerida konkreetset lõiku). - ❌ API kulud (DeepSeek), sõltuvus välisest teenusest. --- ## Integratsioonistrateegia: kolm varianti ## Variant A: **Kaheastmeline süsteem (soovitatav)** **Idee**: Kasuta mõlemat baasi paralleelselt erinevate otsingutasemete jaoks.[[weaviate](https://weaviate.io/blog/chunking-strategies-for-rag)]​ text `Kasutaja päring ↓ 1. Weaviate otsing (artikli tase) - Leia 5–10 asjakohasemat artiklit - Kasuta rikkalikke metaandmeid (transport_context, methods_used, key_concepts) ↓ 2. pgvector otsing (chunk tase) - Võta Weaviate'st leitud artiklite file_hash'd - Otsi nende artiklite chunkidest täpsemaid lõike ↓ 3. LLM vastus (unsloth 120B) - Kontekst: Weaviate metaandmed + pgvector chunkid - Genereeri põhjalik vastus` **Eelised**: - Parim mõlemast maailmast: artikli-taseme rikkalikkus + chunk-taseme täpsus.[[galileo](https://galileo.ai/blog/mastering-rag-how-to-select-an-embedding-model)]​ - Saad kasutada DeepSeeki analüüsi kui "filtrit" ja pgvectorit kui "sügavat otsingut". - Weaviate'i kulud on madalamad (ainult artiklite tase, mitte chunkid). **Kuidas implementeerida**: 1. **Lisa Weaviate artikli ID pgvector baasi**: - `raw_documents` tabelisse uus veerg `weaviate_article_id UUID`. - Kui PDF on töödeldud, kontrolli Weaviate'st kas artikkel on olemas (source_file või file_hash järgi). - Kui on, salvesta selle `article_id` pgvector tabelisse. 2. **Loo hübriidpäringu skript** (`src/query_hybrid.py`): python `# 1. Otsi Weaviate'st artikleid weaviate_results = weaviate_client.query.get("ScientificArticle", ["title", "article_id", "summary_et"]) \ .with_near_text({"concepts": [user_query]}) \ .with_limit(10) \ .do() # 2. Võta article_id'd article_ids = [r["article_id"] for r in weaviate_results] # 3. Leia pgvectorist nende artiklite chunkid query_emb = get_embedding(user_query) pg_results = cur.execute(""" SELECT c.id, c.text, c.page, r.filename, r.weaviate_article_id FROM chunks c JOIN raw_documents r ON c.raw_doc_id = r.id WHERE r.weaviate_article_id = ANY(%s) ORDER BY c.embedding <=> %s::vector LIMIT 20 """, (article_ids, query_emb)) # 4. Kombineeri kontekst ja saada unsloth'ile context = { "articles": weaviate_results, # üldised metaandmed "chunks": pg_results, # täpsed tsitaadid } answer = generate_with_unsloth(user_query, context)` --- ## Variant B: **Ühtne Weaviate baas (lihtsam, aga kaotad chunk'id)** **Idee**: Loobud pgvectorist, migreerid kõik praegused chunkid Weaviate'i, kasutad ainult Weaviate'i.[[luminary](https://luminary.blog/techs/05-embedding-selection/)]​ **Plussid**: - Üks baas, lihtsam hooldada. - Weaviate on võimsam kui pgvector (HNSW indeks, parem skaleerumine).[[github](https://github.com/pgvector/pgvector)]​ **Miinused**: - Kaotad PostgreSQL eelised (ACID, relatsionaalsed seosed, tuttav SQL). - Weaviate'i hosting kulukas (kui kasutad pilve) või vajalik ise haldamine (Docker). **Kui valid selle**: loo Weaviate'is kaks klassi: - `ScientificArticle` (juba olemas) - `ArticleChunk` (uus): python `{ "class": "ArticleChunk", "properties": [ {"name": "text", "dataType": ["text"]}, {"name": "page", "dataType": ["int"]}, {"name": "chunk_index", "dataType": ["int"]}, {"name": "article", "dataType": ["ScientificArticle"]}, # cross-reference ], "vectorizer": "text2vec-transformers" # või text2vec-openai }` --- ## Variant C: **PostgreSQL peamine, Weaviate metaandmete allikas** **Idee**: Kopeeri Weaviate'st metaandmed (summary_et, key_concepts, transport_context jne) PostgreSQL'i ja kasuta ainult pgvectorit.[[tigerdata](https://www.tigerdata.com/blog/postgresql-as-a-vector-database-using-pgvector)]​ **Plussid**: - Üks baas (PostgreSQL), lihtne hooldada. - Säilid täielik kontroll ja sõltumatus. **Miinused**: - Kaotad Weaviate'i semantilise otsingu eelised artikli tasemel (nt "leia artiklid transport_context järgi"). - Pead ise tegema DeepSeek API kutsed PostgreSQL'i (nt trigger või cronjob). **Kui valid selle**: 1. Lisa `raw_documents` tabelisse JSONB veerud: sql `ALTER TABLE raw_documents ADD COLUMN metadata JSONB;` 2. Loo skript, mis: - loeb Weaviate'st kõik artiklid, - leiab pgvectorist vastava `raw_documents` rea (file_hash järgi), - uuendab `metadata` veergu Weaviate andmetega. --- ## Soovitatud plaan: Variant A (kaheastmeline) ## Põhjused: - **Parim täpsus**: artikli-taseme metaandmed (Weaviate) + chunk-taseme tsitaadid (pgvector).[[greennode](https://greennode.ai/blog/best-embedding-models-for-rag)]​ - **Paindlikkus**: kasutaja saab valida, kas tahab "laia ülevaadet" (Weaviate) või "süvitsi tsitaate" (pgvector). - **Kulude optimeerimine**: Weaviate ainult artiklitele (~50–200 kirjet), pgvector chunkidele (~1000–5000 kirjet). ## Sammud implementeerimiseks |Samm|Tegevus|Tulemus| |---|---|---| |**1. Skeemi muutmine**|Lisa `raw_documents` tabelisse `weaviate_article_id UUID`|Seos pgvector ↔ Weaviate| |**2. Sync skript**|Loo `src/sync_weaviate.py`: loe Weaviate, matchi `source_file` või `file_hash`, uuenda `weaviate_article_id`|Seosed täidetud| |**3. Hübriidpäringu skript**|Loo `src/query_hybrid.py`: 1) Weaviate artikli otsing, 2) pgvector chunk otsing nende artiklite pealt|Töötav hübriidotsing| |**4. LLM integratsioon**|Lisa unsloth 120B vastuse genereerimine: võta kontekst Weaviate + pgvector, saada llama.cpp'le|Täielik RAG| |**5. Test ja hindamine**|Tee 10–20 testpäringut, kontrolli kas vastused on täpsemad kui ainult ühe baasiga|Valideerimine| --- ## Alternatiiv: kui Weaviate süsteem pole kriitiliselt vajalik Kui DeepSeeki genereeritud metaandmed pole vajalikud iga päring jaoks: - **Kasuta ainult pgvectorit** päringuteks. - **Säilita Weaviate'i** kui "raamatu ülevaade" või "admin dashboard" artiklite metaandmete vaatamiseks. - **Ühenda need UI tasemel**: nt kui kasutaja vaatab pgvectorist leitud chunki, näita talle ka Weaviate'st artikli `summary_et` ja `transport_context`. --- Milline variant sobib sulle paremini? Kui valid **Variandi A**, saame kohe alustada `sync_weaviate.py` ja `query_hybrid.py` skriptide kirjutamisega.