## 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?