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.
| 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 |
pgvector süsteem:
Weaviate + DeepSeek süsteem:
Idee: Kasuta mõlemat baasi paralleelselt erinevate otsingutasemete jaoks.^1^2^3^4
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:
Kuidas implementeerida:
raw_documents tabelisse uus veerg weaviate_article_id UUID.article_id pgvector tabelisse.Loo hübriidpäringu skript (src/query_hybrid.py):
# 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)
Idee: Loobud pgvectorist, migreerid kõik praegused chunkid Weaviate'i, kasutad ainult Weaviate'i.^4^6
Plussid:
Miinused:
Kui valid selle: loo Weaviate'is kaks klassi:
ScientificArticle (juba olemas)ArticleChunk (uus):
{
"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
}
Idee: Kopeeri Weaviate'st metaandmed (summary_et, key_concepts, transport_context jne) PostgreSQL'i ja kasuta ainult pgvectorit.^7^8^9
Plussid:
Miinused:
Kui valid selle:
Lisa raw_documents tabelisse JSONB veerud:
ALTER TABLE raw_documents ADD COLUMN metadata JSONB;
Loo skript, mis:
raw_documents rea (file_hash järgi),metadata veergu Weaviate andmetega.| 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 |
Kui DeepSeeki genereeritud metaandmed pole vajalikud iga päring jaoks:
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.