## 1. Embedding'u mudeli nõuded

Sinu RAG pipeline'i eesmärk on teadusartikleid (PDF) indekseerida ja semantiliselt otsida. Seega nõuded:[[milvus](https://milvus.io/blog/how-to-choose-the-right-embedding-model-for-rag.md)]​

## A. Täpsus (MTEB või sarnane skoor)

- **Mis see on**: MTEB (Massive Text Embedding Benchmark) on standardne benchmark 56 erinevat teksti‑ülesannet hõlmavalt (retrieval, clustering, classification jne). Mudel, mis skoorib MTEB‑l kõrgemalt, tõenäoliselt leiab semantiliselt sarnasemad dokumendid.[[modal](https://modal.com/blog/mteb-leaderboard-article)]​[[youtube](https://www.youtube.com/watch?v=6YrkXr-2cCc)]​
    
- **Praktikas**: bge-small-en-v1.5 (384‑dim) on MTEB‑l **~62–64 punkti** (keskmine kõigi ülesannete üle), mis on väga hea väikese mudeli kohta.[[huggingface](https://huggingface.co/BAAI/bge-small-en-v1.5)]​
    
- **Miks oluline**: kõrgem MTEB = paremad otsingutulemused = täpsemad chunkid LLM‑ile kontekstiks = paremad vastused.[[galileo](https://galileo.ai/blog/mastering-rag-how-to-select-an-embedding-model)]​
    

## B. Domeen (valdkonnasobivus)

- **Teadusartiklid**: üldotstarbelised mudelid (bge, e5, OpenAI) töötavad teadusartiklitega **hästi**, sest MTEB sisaldab arvukalt akadeemilist sisu.[[luminary](https://luminary.blog/techs/05-embedding-selection/)]​
    
- **Kui vajad spetsiifilisust** (nt ainult meditsiin): BioBERT, SciBERT.[[milvus](https://milvus.io/ai-quick-reference/what-factors-should-be-considered-when-selecting-an-embedding-model-for-a-rag-pipeline-such-as-the-models-domain-training-data-embedding-dimensionality-and-semantic-accuracy)]​
    
- **Sinu juhtum** (liikluskäitumine, õnnetused, teede ohutus): üldised mudelid suudavad seda **väga hästi**, sest "accidents", "risk", "behavior" on igapäevane keel (mitte väga kitsa domeeni slang).[[milvus](https://milvus.io/blog/how-to-choose-the-right-embedding-model-for-rag.md)]​
    

## C. Latentsus (kiirus)

- **Mis see on**: aeg, mis kulub ühe embedding'u genereerimiseks (millisekundi vs sekundit).[[pinecone](https://www.pinecone.io/learn/series/rag/embedding-models-rundown/)]​
    
- **Sinu põhjendus**:
    
    - PDF→chunk ekstraktimine on **offline protsess** (kord päevas / nädalas), seega ei vaja millisekundilist kiirust.[[particula](https://particula.tech/blog/embedding-dimensions-rag-vector-search)]​
        
    - Päringute embedding (kasutaja küsimus) peab olema **kiire** (<100 ms), et süsteem tundub vastutav.[[systemoverflow](https://www.systemoverflow.com/learn/ml-embeddings/embedding-quality-evaluation/dimensionality-and-quantization-trade-offs)]​
        
- **bge-small-en-v1.5**: ~20–50 ms ühe päringu jaoks CPU peal, <10 ms GPU peal – praktikas piisav.[[huggingface](https://huggingface.co/Teradata/bge-small-en-v1.5)]​
    

## D. Mälukasutus / ressursid

- **Miks oluline**:[[systemoverflow](https://www.systemoverflow.com/learn/ml-embeddings/embedding-quality-evaluation/dimensionality-and-quantization-trade-offs)]​
    
    - Mudeli suurus mälus (MB): väiksem mudel → kiirem loading ja jooksutamine väiksemal riistvaral.
        
    - Vektori suurus baasis: iga chunk = üks vektor × dimensioonid × andmetüüp (nt 384 × float32 = 1536 byte = ~1.5 KB).[[particula](https://particula.tech/blog/embedding-dimensions-rag-vector-search)]​
        
    - Sinu ~50–200 artikli juhul: ca 1000–5000 chunki × 1.5 KB = **7–15 MB**. Ei ole probleem.[[particula](https://particula.tech/blog/embedding-dimensions-rag-vector-search)]​
        
    - Kui sul oleks miljon chunki: 384‑dim = ~1.4 GB, 768‑dim = ~2.8 GB, 1536‑dim = ~5.6 GB.[[systemoverflow](https://www.systemoverflow.com/learn/ml-embeddings/embedding-quality-evaluation/dimensionality-and-quantization-trade-offs)]​
        
- **Sinu juhtum**: väike korpus (mõned GB PDF‑e) → mälu pole kitsaskoht, seega võid valida **täpsuse, mitte mälu** järgi.[[particula](https://particula.tech/blog/embedding-dimensions-rag-vector-search)]​
    

---

## 2. Dimensiooni kompromissid: 384 vs 768 vs 1024

|Dimensioon|Täpsus (MTEB)|Mälukasutus (1M chunki)|Päringukiirus|Soovitus|
|---|---|---|---|---|
|**384** (bge-small-en-v1.5)|~62–64|~1.4 GB|Kiire (~20–50 ms CPU)|**Väikese/keskmise korpuse jaoks parim valik** [[huggingface](https://huggingface.co/BAAI/bge-small-en-v1.5)]​|
|**768** (bge-base-en-v1.5, BERT-base)|~64–66|~2.8 GB|Mõõdukas (~40–80 ms)|Suurem korpus + vajad +2–3% täpsust [[systemoverflow](https://www.systemoverflow.com/learn/ml-embeddings/embedding-quality-evaluation/dimensionality-and-quantization-trade-offs)]​|
|**1024** (bge-large, E5‑large)|~66–68|~3.7 GB|Aeglasem (~60–120 ms)|Suur korpus (miljonid dokumendid) või väga kitsad domeeni nüansid [[milvus](https://milvus.io/ai-quick-reference/what-factors-should-be-considered-when-selecting-an-embedding-model-for-a-rag-pipeline-such-as-the-models-domain-training-data-embedding-dimensionality-and-semantic-accuracy)]​|
|**1536+** (OpenAI text-embedding-3-large, 3072)|~68–70|5.6–11 GB|Aeglane|Maksimum täpsus, kallis storage, ebaperformantne IVFFlat‑iga pgvectoris [[systemoverflow](https://www.systemoverflow.com/learn/ml-embeddings/embedding-quality-evaluation/dimensionality-and-quantization-trade-offs)]​|

**Peamine järeldus**: liikumine 384→768 annab ~2–4 punkti MTEB‑l, aga maksab 2× mälu ja 1.5–2× aeglusust. Liikumine 768→1024 annab vähem kui 2 punkti juurde, maksab veelgi rohkem.[[systemoverflow](https://www.systemoverflow.com/learn/ml-embeddings/embedding-quality-evaluation/dimensionality-and-quantization-trade-offs)]​

---

## 3. Konkreetne soovitus sinu projektile

## Olukord

- **Korpus**: ~20–200 teadusartiklit (PDF), ingliskeelsed liiklusohutuse/transpordi valdkonnas.
    
- **Kasutus**: lokaalne RAG, päringud eesti ja inglise keeles, vastused genereerib lokaalne LLM (unsloth 120B).
    
- **Riistvara**: lokaalne süsteem (ohmu), postgres + pgvector, ei ole "million‑scale" probleem.
    

## Soovitus: **bge-small-en-v1.5 (384‑dim)**

**Põhjused**:[[zilliz](https://zilliz.com/ai-models/bge-base-en-v1.5)]​

1. **Täpsus**: MTEB skoor ~62–64 on **piisav väikese/keskmise korpuse jaoks**.[[modal](https://modal.com/blog/mteb-leaderboard-article)]​
    
2. **Kiirus**: CPU peal ~20–50 ms päring (ohmu on AMD Zen + ROCm, seega GPU peal veelgi kiirem).[[huggingface](https://huggingface.co/BAAI/bge-small-en-v1.5)]​
    
3. **Mälukasutus**: ~1.4 GB 1M chunki kohta (sinu 1000–5000 chunki = **paar MB**).[[particula](https://particula.tech/blog/embedding-dimensions-rag-vector-search)]​
    
4. **pgvector IVFFlat**: 384‑dim sobib ideaalselt (max 2000 lubatud, aga mida väiksem, seda kiiremini indeks töötab).[[sarahglasmacher](https://www.sarahglasmacher.com/how-to-use-cosine-similarity-in-pgvector/)]​
    
5. **Laialt kasutatud**: hea dokumentatsioon, tööriistade tugi (sentence‑transformers, Weaviate, LangChain).[[docs.lancedb](https://docs.lancedb.com/integrations/embedding/sentence-transformers)]​
    

**Alternatiiv**: kui hiljem korpus kasvab 10 000+ artiklini või märkad, et täpsus ei ole piisav → **bge-base-en-v1.5 (768‑dim)**. Aga testimata pole mõtet üle optimeerida.[[greennode](https://greennode.ai/blog/best-embedding-models-for-rag)]​

---

## 4. Tegevusplaan (samm‑sammult)

|Samm|Tegevus|Tulemus|
|---|---|---|
|**1. Paigalda ja testi bge-small-en-v1.5**|`pip install sentence-transformers`, `src/embed_utils.py` (juba tehtud), testi `get_embedding()`|Toimiv 384‑dim embedding [[huggingface](https://huggingface.co/BAAI/bge-small-en-v1.5)]​|
|**2. Täida chunks.embedding**|`python src/embed_chunks.py` (juba kirjutatud)|Kõik chunkid saavad 384‑dim vektori [[tigerdata](https://www.tigerdata.com/learn/using-pgvector-with-python)]​|
|**3. Testi semantilist otsingut**|Loo `src/query_semantic.py`, tee päring "young driver accident risk"|Top‑5 asjakohasemat chunki tuleb [[sarahglasmacher](https://www.sarahglasmacher.com/how-to-use-cosine-similarity-in-pgvector/)]​|
|**4. Lisa LLM vastus**|Top chunkid → prompt → unsloth 120B (llama.cpp) → vastus|Töötav lokaalne RAG [[neon](https://neon.com/blog/building-a-rag-application-with-llama-3-1-and-pgvector)]​|
|**5. Hinda täpsust**|Tee 10–20 testi‑küsimust, kontrolli kas vastused on head|Kui hästi → **valmis**; kui mitte → kaaluge bge-base (768‑dim) [[galileo](https://galileo.ai/blog/mastering-rag-how-to-select-an-embedding-model)]​|
|**6. (Valikuline) Optimiseeri kiiruse jaoks**|Kui kiirus on probleem, kasuta quantization (int8) või HNSW indeks pgvectoris|Kuni 2× kiirem otsing [[systemoverflow](https://www.systemoverflow.com/learn/ml-embeddings/embedding-quality-evaluation/dimensionality-and-quantization-trade-offs)]​|

---

## 5. Kokkuvõte

|Kriteerium|Sinu nõue|bge-small-en-v1.5 sobivus|
|---|---|---|
|**Täpsus (MTEB)**|Hea semantiline otsing|62–64 (piisav) ✅ [[huggingface](https://huggingface.co/BAAI/bge-small-en-v1.5)]​|
|**Latentsus**|Päring <100 ms|20–50 ms CPU ✅ [[huggingface](https://huggingface.co/BAAI/bge-small-en-v1.5)]​|
|**Mälukasutus**|~1000–5000 chunki|~7–15 MB (väga väike) ✅ [[particula](https://particula.tech/blog/embedding-dimensions-rag-vector-search)]​|
|**Dimensioon pgvector**|<2000 IVFFlat jaoks|384 (ideaalne) ✅ [[sarahglasmacher](https://www.sarahglasmacher.com/how-to-use-cosine-similarity-in-pgvector/)]​|
|**Domeen**|Teadusartiklid (liiklus)|Üldine mudel sobib ✅ [[milvus](https://milvus.io/blog/how-to-choose-the-right-embedding-model-for-rag.md)]​|
|**Kohalikult jooksev**|Ei taha API kulusid|Jah (CPU/GPU) ✅ [[huggingface](https://huggingface.co/BAAI/bge-small-en-v1.5)]​|

**Järeldus**: jätka **bge-small-en-v1.5 (384‑dim)**‑iga. Kui kõik on töökorras ja testid näitavad, et semantiline otsing töötab, saame järgmise sammuna teha `query_semantic.py` + unsloth 120B integratsioon ja sul on **täielik lokaalne RAG süsteem** valmis.[[huggingface](https://huggingface.co/Teradata/bge-small-en-v1.5)]​

Kas jätkame `query_semantic.py` loomisega?