**Jah, absoluutselt!** RAG süsteem kasutab **mõlemat baasi** paralleelselt: *** ## Kuidas andmeid kasutatakse (Variant A - kaheastmeline süsteem): ### **1. Weaviate baas** → Artikli taseme metaandmed **Mida kasutatakse**: - ✅ **`summary_et`** – DeepSeek genereeritud eestikeelne kokkuvõte - ✅ **`key_concepts`** – Märksõnad - ✅ **`authors`** – Autorid - ✅ **`transport_context`** – Transpordikonteksti analüüs (DeepSeek JSON) - ✅ **`relevance_score`** – Relevantsusskoor (1-10) - ✅ **`title`** – Artikli pealkiri **Kus see ilmub**: ```python # src/query_hybrid.py, rida ~40 articles = search_weaviate_articles_all(limit=10000) # Loeme KÕIK artiklid Weaviate'st # src/generate_answer.py, rida ~30 context_parts.append("=== ARTICLE SUMMARIES ===\n") for i, art in enumerate(articles[:5], 1): article_text = f"""[Article {i}] {art['title']} Authors: {', '.join(art['authors'][:3])} Keywords: {', '.join(art['key_concepts'][:5])} Summary (Estonian): {art['summary_et'][:350]}... # <-- WEAVIATE'ST! """ ``` **Näide kontekstis LLM'ile**: ``` === ARTICLE SUMMARIES === [Article 1] Association between intersection characteristics and perceived crash risk among school-aged children Authors: Gain Lee Keywords: subjektiivselt tajutud avarii risk, jalakäija, ristmik, kooliealised lapsed, keskkonnaomadused Summary (Estonian): **Põhjalik kokkuvõte artiklist: "Association between intersection characteristics and perceived crash risk among school-aged children"** ### 1. ARTIKLI PEAMISED PUNKTID **Uurimisküsimused ja eesmärgid:** Artikli peaeesmärk on välja selgitada, millised ristmike ümbruse keskkonnaomadused mõjutavad 10–12-aastaste koolilaste **subjektiivselt tajutud avarii riski**... ``` *** ### **2. pgvector (PostgreSQL)** → Chunk taseme täpsed tsitaadid **Mida kasutatakse**: - ✅ **`chunks.text`** – Täpne tekstilõik PDF-ist (pdfplumber ekstraktitud) - ✅ **`chunks.page`** – Lehekülje number - ✅ **`chunks.embedding`** – bge-small-en-v1.5 vektor (384-dim) - ✅ **`chunks.similarity`** – Cosine similarity query'ga (0.7-0.9) **Kus see ilmub**: ```python # src/query_hybrid.py, rida ~100 chunks = search_pgvector_chunks(query, article_ids, limit=top_chunks) # src/generate_answer.py, rida ~50 context_parts.append("\n=== TEXT EXCERPTS FROM SOURCES ===\n") for i, chunk in enumerate(unique_chunks[:15], 1): chunk_text = f"""[Excerpt {i}] ({chunk['filename']}, page {chunk['page']}) {chunk['text'][:280]} # <-- PGVECTOR'IST! """ ``` **Näide kontekstis LLM'ile**: ``` === TEXT EXCERPTS FROM SOURCES === [Excerpt 1] (Association-between-intersection-characteristics-and-p_2016_Accident-Analysi.pdf, page 2) the public is broadly correct (Elvik and Bjørnskau, 2005). However, children's ability to accurately assess crash risk is limited by their cognitive development stage. Research shows that school-aged children (10-12 years) can identify dangerous intersections but their perception... [Excerpt 2] (Association-between-intersection-characteristics-and-p_2016_Accident-Analysi.pdf, page 2) associated with their risk perception. Hypothetically, the patterns of perceived crash risk for school-aged children at intersections should correlate with actual crash statistics, but this requires empirical validation... ``` *** ## Täielik andmevoog (samm-sammult): ``` 1. Kasutaja küsimus: "young driver accident risk" ↓ 2. query_hybrid.py: search_weaviate_articles_all() → Loeb KÕIK 769 artiklit Weaviate'st (title, summary_et, key_concepts, authors, transport_context) ↓ 3. query_hybrid.py: search_articles_by_query() → Arvutab iga artikli summary_et embedding'u (bge-small) → Võrdleb query embedding'uga → Sorteerib similarity järgi → Tagastab TOP 10 artiklit ↓ 4. query_hybrid.py: search_pgvector_chunks() → Võtab TOP 10 artikli UUID'd → Otsib pgvector'ist chunk'e, mis kuuluvad neile artiklitele → Sorteerib similarity järgi → Tagastab TOP 20 chunk'i ↓ 5. generate_answer.py: build_context() → Kombineerib: - Weaviate artiklite metaandmed (summary_et, authors, keywords) - pgvector chunk'ide täpsed tekstid (text, page) → Loob ühtse konteksti string'i (~5000 märki) ↓ 6. generate_answer.py: generate_answer() → Saadab konteksti + query llama.cpp'le → LLM genereerib vastuse, kasutades MÕLEMAT allikat: - Weaviate: üldine kontekst, kokkuvõtted, transpordikontekst - pgvector: täpsed tsitaadid, leheküljed, konkreetsed väited ↓ 7. Vastus kasutajale: "Noorte juhtide avarii risk on märkimisväärselt kõrgem [Article 1] [Excerpt 3]..." ``` *** ## Kontrolli, et Weaviate andmeid kasutatakse: ### Test 1: Vaata konteksti sisu Lisa `generate_answer.py` funktsiooni `build_context()` lõppu: ```python def build_context(...): # ... olemasolev kood final_context = "\n".join(context_parts) # DEBUG: salvesta fail with open("/tmp/rag_context_debug.txt", "w") as f: f.write(final_context) print(f"📝 Kontekst salvestatud: /tmp/rag_context_debug.txt") return final_context ``` Käivita: ```bash python src/generate_answer.py cat /tmp/rag_context_debug.txt ``` Peaks näitama: - **ARTICLE SUMMARIES** sektsioon → Weaviate `summary_et` - **TEXT EXCERPTS** sektsioon → pgvector `chunks.text` *** ### Test 2: Kontrolli, et Weaviate'st tulevad summary_et'd ```bash python -c " from src.query_hybrid import search_weaviate_articles_all articles = search_weaviate_articles_all(limit=5) for art in articles[:3]: print(f\"Title: {art['title']}\") print(f\"Summary: {art['summary_et'][:100]}...\") print(f\"Authors: {art['authors']}\") print('-'*60) " ``` Peaks näitama Weaviate'st tulnud eestikeelseid kokkuvõtteid. *** ## Kokkuvõte: | Allikas | Mida annab | Kuidas kasutatakse | | :-- | :-- | :-- | | **Weaviate** | Artiklite metaandmed (DeepSeek analüüs, kokkuvõtted, märksõnad, transpordikontekst) | Artikli taseme semantiline otsing + LLM konteksti "üldine taust" | | **pgvector** | Täpsed chunk'id PDF-ist (tekst, leheküljed, similarity) | Chunk taseme semantiline otsing + LLM konteksti "täpsed tsitaadid" | | **LLM (unsloth)** | Genereerib vastuse, kombineerides mõlema allika andmeid | Loeb konteksti ja tsiteerib artikleid/lõike numbrite järgi | **Jah, Weaviate andmeid kasutatakse!** Ilma Weaviate'ta ei oleks: - ❌ Eestikeelseid kokkuvõtteid (`summary_et`) - ❌ Märksõnu (`key_concepts`) - ❌ Transpordikonteksti analüüsi (`transport_context`) - ❌ DeepSeek genereeritud metaandmeid Need on **kriitiline osa** RAG vastuse kvaliteedist! 🎯 [^1][^2][^3]