Nexa Intelligence Docs
Pipeline Data

articles

Alur terdistribusi pengisian tabel PostgreSQL articles dan indeks Elasticsearch articles—mulai dari perayapan otonom B1 berbasis Google News, penyimpanan MinIO & auto-discovery target, pembersihan C1, deduplikasi vektor C2, hingga ekstraksi AI SPOK D1.

Pipeline Data: articles (Master Berita Siber)

Pipeline ini bertanggung jawab untuk menghimpun, menyaring, membersihkan, dan memperkaya dokumen berita siber pada tabel PostgreSQL articles (sebagai Single Source of Truth OLTP) dan indeks Elasticsearch articles (sebagai mesin pencarian teks cepat dan agregasi visualisasi intelijen).

Arsitektur Scraping Otonom (Autonomous B1 Engine)

Worker B1 beroperasi secara mandiri (autonomous) menggunakan penyedia berita terpadu Google News (NEWS_PROVIDER=google). B1 mengambil kata kunci aktif langsung dari PostgreSQL, merayap berita nasional/daerah secara agregatif tanpa ketergantungan pesan berkala A1 di antrian Kafka queue-job, dan secara otomatis mendaftarkan domain-domain media baru ke tabel scraping_targets.


1. Ringkasan Arsitektur Alur

[taxonomy_keywords] (PostgreSQL: Kata Kunci Leksikon Aktif)
        │
        ▼ (Autonomous Ticker Loop: scrape_interval / default 1h)
[B1 - Autonomous Google News Scraper]
        │
        ├──────────────────────────────────────┐
        ▼                                      ▼
[MinIO: Raw S3 Storage]              [Auto-Discovery Targets]
(source/news.google.com/*.json)     (PostgreSQL: scraping_targets)
        │
        ▼ Antrian Kafka: queue-raw-data-site
[C1 - HTML Cleaner & Normalizer] ──► Antrian Kafka: queue-normalize-data
        │
        ▼
[C2 - Vector Deduplication] (Qdrant Cosine Similarity < 0.90)
        │
        ▼ (Artikel Unik) ──► Antrian Kafka: queue-ai-inference
[nexa-d1 - AI Worker] (SPOK, NER, Sentimen, Hierarki Polri via AIOS)
        │
        ├────────────────────────────────────┐
        ▼                                    ▼
[PostgreSQL: articles]             [Elasticsearch: articles]
(Master Transaksional)             (Pencarian Cepat & Dashboard)

2. Tahap 1: Pengambilan Berita Otonom & Auto-Discovery (B1)

Worker B1 Scraper Service menjalankan penjadwalan internal (autonomous ticker loop) secara berkala:

  1. Sinkronisasi Kata Kunci Taksonomi Langsung dari Database: B1 mengeksekusi fungsi FetchActiveKeywords ke tabel taxonomy_keywords PostgreSQL untuk mengambil seluruh kata kunci leksikon aktif (L1–L5) lengkap dengan hierarki taksonomi (ancestry path).
  2. Agregasi Feed Google News RSS: Untuk setiap kata kunci aktif, B1 menghubungi endpoint pencarian Google News RSS (https://news.google.com/rss/search?q={keyword}&hl=id&gl=ID&ceid=ID:id).
  3. Penyaringan Lapis 1 (Jendela Waktu & Kuota Kandidat):
    • Hanya memproses berita yang dipublikasikan dalam 24 jam terakhir (dropped_older_24h).
    • Membatasi kuota evaluasi kandidat awal (default: 10 artikel per leksikon) untuk efisiensi komputasi.
  4. Penyaringan Lapis 2 (Fetch Konten Penuh, Dedup, & Guardrail Karakter):
    • Menghubungi URL sumber berita asli untuk mengunduh konten teks lengkap.
    • Memverifikasi riwayat URL menggunakan mekanisme deduplikasi in-memory/Redis.
    • Menerapkan batas maksimal karakter (3.500 karakter); artikel investigasi atau agregasi yang melebihi batas ini dibuang (filtered_too_long) guna menjaga kualitas dan efisiensi inferensi model AI di hilir.
  5. Penyimpanan Dokumen Mentah (MinIO) & Auto-Discovery Media:
    • Seluruh kumpulan artikel yang lolos disimpan ke bucket MinIO sebagai berkas JSON (source/news.google.com/{uuid}.json).
    • Setiap domain media baru yang berhasil dirayap otomatis didaftarkan ke tabel scraping_targets dengan status draf (is_active = false, org_type = 'unassigned') agar dapat dikurasi dan diverifikasi oleh admin melalui antarmuka frontend.
  6. Publikasi Pointer ke Kafka: B1 menerbitkan event pointer berukuran ringan ke antrian queue-raw-data-site yang merujuk pada raw_ref MinIO.

Alur Kerja B1 Autonomous Scraper (Google News Ingestion)

Penjadwalan mandiri, penarikan kata kunci PostgreSQL, agregasi Google News RSS, MinIO storage, auto-discovery target, dan emisi pointer Kafka

01. Autonomous Ticker & Kata Kunci Taksonomi [PostgreSQL]

Penjadwal internal B1 mengambil kata kunci leksikon aktif (L1–L5) langsung dari PostgreSQL tanpa pesan perantara A1 atau queue-job.

02. Agregasi Google News RSS & Filter Lapis 1 [gnews-scrape]

Perayapan feed RSS pencarian Google News per kata kunci. Memfilter berita di luar jendela waktu 24 jam dan membatasi kuota kandidat per leksikon.

03. Fetch Konten Penuh, URL Dedup, & Guardrail Karakter

Mengunduh teks utuh artikel via HTTP, verifikasi deduplikasi URL (Redis/In-Memory), serta membuang artikel yang melebihi batas (> 3.500 karakter).

MinIO Object Storage

Menyimpan berkas JSON mentah per batch keyword (source/news.google.com/{uuid}.json).

Auto-Discovery Scraping Targets

Pendaftaran otomatis domain media baru ke tabel scraping_targets (status is_active = false) untuk kurasi admin.

04. Emisi Pointer Event Hilir [Kafka: queue-raw-data-site]

Memancarkan event pointer berisi ID dokumen, referensi objek MinIO, dan silsilah taksonomi ke C1 Cleaner untuk normalisasi.


3. Tahap 2: Pembersihan Teks & Normalisasi Waktu (C1)

Worker C1 Cleaner mengonsumsi pointer event dari queue-raw-data-site dan mengunduh berkas mentah dari MinIO:

  • Pembersihan DOM & Boilerplate: Membuang elemen iklan, widget media sosial, navigasi, dan tracker JavaScript.
  • Normalisasi Temporal: Mengonversi beragam format tanggal lokal media siber Indonesia ke format standar ISO-8601 UTC.
  • Publikasi ke Hilir: Memancarkan teks berita bersih ke antrian Kafka queue-normalize-data.

Alur Data C1 Processor & Cleaner

Sanitasi DOM HTML, ekstraksi teks bersih, dedup hash Redis, dan emisi normalisasi (+ DLQ)

Inbound Raw Message [queue-raw-data-site]

Diterbitkan oleh b1-scrapper-site-process memuat pointer key MinIO.

c1-processor-cleaner [DOM Sanitizer]

Pembersihan tag HTML/iklan/tracker & normalisasi multi-tipe (berita, lelang, komoditas, sekolah).

queue-normalize-data [Status: Sukses]

Artikel bersih dikonsumsi oleh C2 Dedup & D1 AI Worker.

queue-normalize-data-dlq [Status: Poison / DLQ]

Payload rusak/gagal parsing diisolasi dengan anotasi alasan error.


4. Tahap 3: Deduplikasi Semantik Vektor (C2)

Worker C2 mengubah judul dan pembukaan berita menjadi representasi vektor numerik (embeddings) dan membandingkannya ke koleksi Qdrant Vector DB:

  • Skor Kemiripan $\ge$ 0.90 (Duplikat / Sindikasi Portal): Ditolak dari proses inferensi AI untuk menghemat komputasi GPU/token, lalu dialihkan ke pencatatan klaster tren berita.
  • Skor Kemiripan < 0.90 (Artikel Unik / Baru): Dipancarkan ke antrian Kafka queue-ai-inference untuk dianalisis oleh modul AI kognitif.

Alur C2 Deduplication Worker

Deduplikasi semantik berbasis embedding vector dan pengelompokan cluster berita

01. Ingest Event & Fetch Article Body [Kafka • MinIO Storage]

Mengambil metadata artikel dari Kafka dan menarik konten teks lengkap dari MinIO.

02. Generate Dense Embedding [FastEmbed 384-dim]

Vektorisasi judul dan ringkasan artikel menjadi dense vector embedding 384 dimensi.

03. Qdrant Vector Similarity Search [Threshold: ≥ 0.85]

Query pencarian ANN pada collection Qdrant untuk mendeteksi kesamaan konten berita.

Duplikat / Sindikasi (≥ 0.85)

Tautkan ke cluster ID existing & increment dupe count.

Berita Unik (< 0.85)

Simpan vector ke Qdrant & teruskan ke antrian AI D1.


5. Tahap 4: Ekstraksi Kognitif & Dual-Sink Persistence (D1)

Worker nexa-d1 mengonsumsi event dari queue-ai-inference dan berkolaborasi dengan engine AIOS:

  1. Ekstraksi Sintaksis SPOK: Mengidentifikasi Subjek, Predikat, Objek, dan Keterangan dari kalimat inti berita.
  2. Polri Hierarchy Resolver: Memetakan entitas kepolisian yang disebut ke dalam hierarki resmi: Mabes Polri $\rightarrow$ Polda $\rightarrow$ Polres $\rightarrow$ Polsek.
  3. Sentimen & Skor Risiko: Menentukan sentimen publik (Positif, Netral, Negatif) dan skor urgensi kamtibmas (Level 1–5).
  4. Penyimpanan Ganda (Dual-Sink):
    • PostgreSQL (articles): Menyimpan relasi entitas, ID taksonomi, dan data transaksi relasional.
    • Elasticsearch (articles): Menyediakan pengindeksan teks penuh, pencarian cepat, serta agregasi data analitik pada dashboard pimpinan.

Alur D1 AI Worker (Berita)

Inferensi LLM terdistribusi untuk sentimen, entitas, ringkasan, dan dual-sink

01. Ingestion Task Consumer [Kafka: topic-ai-worker]

Menerima payload artikel bersih pasca-deduplikasi untuk diproses secara batch asinkron.

02. Multi-Task LLM Inference [vLLM • Qwen / Mistral]

Ekstraksi simultan: Sentimen (-1 s/d +1), NER (Tokoh, Organisasi, Lokasi), Ringkasan 3-kalimat, & Relevansi Taksonomi.

MongoDB Document Store

Collection: articles_clean_v2 (dokumen lengkap beranotasi NLP).

Elasticsearch Search Index

Index: news_search_index (indeks pencarian teks penuh & faset).

04. Downstream Event Dispatch [Kafka: topic-aggregation • topic-decision]

Memicu aggregation worker & decision worker untuk kalkulasi tren dan scoring ancaman otomatis.


6. Spesifikasi Payload Transmisi Antar-Worker

Berikut adalah representasi skema payload data yang ditransmisikan pada setiap titik jabat tangan (handshake) antar-komponen:

Payload pointer yang dipancarkan oleh B1 ke Kafka setelah batch artikel tersimpan di MinIO:

{
  "topic": "queue-raw-data-site",
  "source_id": "news.google.com",
  "type": "berita",
  "external_id": "https://nasional.kompas.com/read/2026/10/15/sidak-beras-bulog",
  "keyword": "cadangan beras pemerintah",
  "keyword_id": "c7b76ff8-2641-4a77-9104-e6ca43eb76f7",
  "raw_ref": "source/news.google.com/fb712084-fe65-4f11-bc60-d88448634870.json",
  "trace_id": "a6ceb215372a0415381fcb95"
}

On this page