Lewati ke konten utama

Ingesti Data

Ingesti data mempersiapkan dokumen pemerintah mentah untuk retrieval dan penjawaban berbasis sumber. Ingesti memvalidasi input, menyimpan byte mentah, mem-parse atau menjalankan OCR pada konten, mengekstrak metadata, memecah teks menjadi chunk, membuat embedding untuk chunk yang disetujui, membangun teks leksikal, mempersistenkan baris, dan menyediakan status pemrosesan.

Kontrak API Otoritatif

Halaman ini menjelaskan arsitektur ingesti dan keputusan siklus hidup. Untuk field request dan response, kode status, body error, perintah curl, dan contoh TypeScript, gunakan Referensi API Ingesti dan Dokumen. Ringkasan arsitektur di bawah bukan kontrak wire yang lengkap.

Sumber yang didukung​

Model data mengenali lima jenis sumber: JDIH, OpenData, PPID, SatuData, dan upload.

SumberPenanganan saat ini
JDIHDokumen hukum mengikuti jalur parse → fallback OCR → chunk → embed → index.
PPIDDokumen informasi publik mengikuti jalur ingesti yang sama; ekstraksi PDF mengikuti referensi routing di bawah.
uploadFile manual atau integrasi menggunakan API unggah dan batch.
OpenDataEvent terstruktur yang kompatibel dengan kontrak dilewati sebelum parse/chunk/embed/index; pembacaan Open Data saat query menjadi sumber kebenaran ketika diaktifkan.
SatuDataEvent terstruktur yang kompatibel dengan kontrak dilewati sebelum parse/chunk/embed/index; pembacaan Open Data saat query menjadi sumber kebenaran ketika diaktifkan.

Pelewatan sumber terstruktur ini disengaja: membuat embedding dari snapshot portal akan menciptakan salinan pesaing yang usang. Worker mencatat hasil terminal skipped untuk job unggah internal dan memancarkan indexed/skipped di wire (_TERMINAL_INTERNAL_EVENT, src/aceh_rag/kafka/kafka_ingestion.py). Worker Kafka produksi dibuat ulang pada image API yang di-deploy (2cc9a417, audit produksi firstmate 2026-10-07); worker menjalankan kontrak consumer doc.uploaded di partner-events.

Format yang didukung​

Docling Slim adalah batas parser born-digital untuk PDF, DOCX, PPTX, XLSX, CSV, MD, dan HTML. TXT ditangani secara lokal. Gambar dan dokumen hasil pemindaian diarahkan melalui OCR.

Untuk routing PDF ke OCR, lihat orkestrasi model. Untuk ekstraksi tabel native-first dan fallback OCR, lihat ADR-0012.

Titik masuk ingesti​

Tabel di bawah menyebutkan titik masuk arsitektural dan tanggung jawab setiap jalur. Tabel ini sengaja tidak mencantumkan payload, body response, kode status, dan bentuk error yang tepat; semua itu berada dalam Referensi API Ingesti dan Dokumen.

MetodeEndpoint atau seamTanggung jawab arsitektur
Unggah multipart manualPOST /documentsMenerima file pengguna atau integrasi, mempersistenkan byte mentah, membuat pekerjaan ingesti yang statusnya dilacak, dan menjadwalkan pemrosesan per file
Teks inlinePOST /documents/txtMengindeks teks yang disediakan langsung oleh caller tepercaya tanpa merutekannya melalui OCR
Prefix object storage batchPOST /ingestion/batch dengan prefixMenemukan objek di bawah prefix yang dikonfigurasi dan mengantrekan objek korpus yang cocok
Manifest batchPOST /ingestion/batch dengan key eksplisitMengantrekan object key yang dipilih dari object store yang dikonfigurasi
Integrasi APIAPI Ingesti melalui batas FastAPIMemungkinkan integrasi eksternal memasuki jalur validasi, storage, queueing, dan worker yang sama seperti unggahan frontend
Ingesti terjadwalScheduler yang memanggil API atau connector batchMenggunakan kembali API batch/sumber yang sama seperti integrasi lain
Ingesti streamingPemrosesan worker Kafka/DMSMendukung adapter asinkron khusus sumber tanpa melewati aturan validasi dan indexing

Pipeline end-to-end​

Untuk dokumen OCR, setiap halaman di bawah ambang batas atau halaman yang hilang dikecualikan dari pengindeksan. Verdik tingkat dokumen needs_review menggunakan fraksi halaman gagal yang dikonfigurasi, sehingga satu halaman sampul yang lemah tidak otomatis mengarantina pindaian yang sebenarnya masih dapat digunakan; halaman yang hilang selalu memaksa review. GET /documents mengekspos chunk_count, indexed_chunk_count, dan parked_chunk_count sehingga klien dapat membedakan hasil review yang masih dapat diambil sebagian dari dokumen tanpa chunk terindeks.

Validasi​

Validasi berlangsung sebelum penyimpanan, sebelum parsing, dan sebelum pengindeksan.

TahapValidasi
Request unggahAPI key, ekstensi/jenis yang didukung, ukuran file, ukuran batch
Object storageError backend dipetakan ke error domain; pembersihan unggahan sebagian mencegah objek yatim
Pesan workerField wajib: ID dokumen, SHA-256 konten, nama file, jenis sumber, versi sumber
Byte mentahBatas archive-bomb dijalankan sebelum parse/OCR
Teks hasil parseDokumen kosong ditolak
Teks chunkKonten dengan sinyal rendah/sampah diarahkan ke review sebelum embedding
Chunk OCRGerbang ambang batas pada confidence yang dapat dibandingkan lintas versi model (ADR-0005)
RepositoryOrdinal duplikat ditolak; chunk terindeks memerlukan embedding; chunk needs_ocr_review dikecualikan dari retrieval

Ekstraksi dan persistensi metadata​

Model ingesti menyimpan metadata tingkat dokumen dan tingkat chunk.

Baris dokumen berisi judul, jenis sumber, format, versi sumber, timestamp ingesti, status, dan JSON metadata. Baris chunk berisi ID dokumen, ordinal, teks, embedding, teks leksikal, lexical_tsv yang dihasilkan, confidence OCR, status chunk, nomor halaman, jalur bagian, referensi hukum, rentang karakter, dan JSON metadata.

Layanan ingesti saat ini mencatat metadata parser, ambang batas confidence OCR, hash konten, source key, model OCR, keterbandingan confidence, serta field rentang halaman/sumber.

Chunking dan indexing​

Arsitektur menargetkan jendela sekitar 512 token dengan overlap. Layanan menggunakan ukuran chunk yang dapat dikonfigurasi dan mempertahankan rentang karakter. Chunk yang disetujui mendapatkan embedding dan teks leksikal. PostgreSQL menyimpan data indeks vektor HNSW dan vektor full-text search yang dihasilkan. Aturan penghapusan NUL dan konsistensi offset dijelaskan di referensi persistensi metadata berbahasa Inggris.

Desain storage​

StorageData
Object storage OBS / yang kompatibel dengan S3Unggahan mentah, objek korpus batch, artefak terproses di masa depan
PostgreSQL documentsIdentitas dokumen stabil dan metadata sumber
PostgreSQL chunksTeks, embedding, teks leksikal, confidence OCR, metadata sitasi
pgvector HNSWRetrieval semantik atas embedding yang disetujui
PostgreSQL GIN FTSRetrieval leksikal atas teks leksikal yang disetujui
Redis / penyimpanan status queueStatus job di jalur lokal/in-memory, target DCS di produksi
Kafka / DMSEvent pemrosesan dokumen asinkron dalam arsitektur target

Idempotensi dan re-ingesti​

Pesan worker membawa content_sha256, dan identitas dokumen menggunakan jenis sumber, versi sumber, dan source key yang stabil. Untuk ingesti batch, object key lengkap digunakan sebagai source key sehingga file dengan nama dasar yang sama di folder berbeda tetap disimpan sebagai dokumen terpisah. Mengingesti ulang sumber yang sama menggantikan chunk usang secara transaksional.

Konten yang identik byte dideduplikasi berdasarkan checksum kontennya. Sebelum parse/chunk/embed, layanan mencari content_sha256 yang masuk dan mengembalikan dokumen yang sudah ada ketika menemukannya. Karena worker konkuren dapat sama-sama melewatkan lookup check-then-act tersebut, backstop otoritatif membuat deduplikasi deterministik: partial functional unique index pada documents atas content_sha256 dan sourceVersion yang diekstrak (migration 0006_document_content_sha256_dedup) mengubah insert duplikat yang bersaing menjadi hasil deduplikasi yang sama, bukan dokumen kedua atau 500. Index hanya dibuat pada tabel documents AI-engine milik kita, dan sourceVersion yang berbeda adalah re-ingesti yang disengaja dan boleh hidup berdampingan. Lihat src/aceh_rag/postgres_repository.py.

Ketersediaan bagi layanan AI​

Dokumen menjadi tersedia bagi layanan AI hanya setelah setidaknya satu chunk yang disetujui diindeks. Chunk needs_ocr_review dipersistenkan untuk review, tetapi dikecualikan dari retrieval semantik dan leksikal. Permukaan pencarian dan jawaban hanya dapat menggunakan chunk terindeks yang disetujui; field request yang tepat, bentuk sitasi, perilaku status, siklus hidup SSE, dan contoh-contohnya ditentukan dalam Referensi API Query dan Pencarian.

Status operasional​

StatusMakna
queuedUnggah diterima dan menunggu pemrosesan worker
processingWorker telah memulai ingesti
donePemrosesan selesai dan chunk yang disetujui telah dipersistenkan
needs_reviewReview manusia diperlukan, biasanya terkait confidence OCR
failed / permanently_failedPemrosesan gagal dan tidak akan selesai tanpa tindakan operator
retryingWorker akan mencoba lagi setelah kegagalan sementara
skippedPekerjaan duplikat atau yang sudah diproses dilewati