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.