Teadusartiklite süsteemi kirjeldus.md 8.0 KB

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]​

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]​

  • 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]​

Plussid:

  • Üks baas, lihtsam hooldada.

  • Weaviate on võimsam kui pgvector (HNSW indeks, parem skaleerumine).[github]​

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]​

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]​

  • 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.