Jah, absoluutselt! RAG süsteem kasutab mõlemat baasi paralleelselt:
Mida kasutatakse:
summary_et – DeepSeek genereeritud eestikeelne kokkuvõtekey_concepts – Märksõnadauthors – Autoridtransport_context – Transpordikonteksti analüüs (DeepSeek JSON)relevance_score – Relevantsusskoor (1-10)title – Artikli pealkiriKus see ilmub:
# 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**...
Mida kasutatakse:
chunks.text – Täpne tekstilõik PDF-ist (pdfplumber ekstraktitud)chunks.page – Lehekülje numberchunks.embedding – bge-small-en-v1.5 vektor (384-dim)chunks.similarity – Cosine similarity query'ga (0.7-0.9)Kus see ilmub:
# 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...
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]..."
Lisa generate_answer.py funktsiooni build_context() lõppu:
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:
python src/generate_answer.py
cat /tmp/rag_context_debug.txt
Peaks näitama:
summary_etchunks.textpython -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.
| 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:
summary_et)key_concepts)transport_context)Need on kriitiline osa RAG vastuse kvaliteedist! 🎯 [^1][^2][^3]