Skip to content

πŸ”§ Day 4 β€” Data Ingest Pipeline: Supabase Vector Store + Edit Fields ​

Minggu 2 Β· Hari 4 β€” Yellow Day (Integration) Topik: Pipeline ETL untuk RAG, node Edit Fields, setup Supabase (SQL, pgvector), integrasi n8n-Supabase, OpenAI Embeddings


πŸ“‹ Daftar Isi ​

  1. Recap RAG & Embedding
  2. Dua Fase Membangun RAG
  3. Business Challenge Minggu Ini
  4. Data Ingest Pipeline
  5. Setup Supabase
  6. Integrasi n8n + Supabase
  7. Rangkuman & Poin Penting

πŸ”„ Recap RAG & Embedding ​

RAG dalam Satu Diagram ​

User bertanya ──▢ Vectorize pertanyaan ──▢ Cari di Vector DB ──▢ Ambil teks relevan
                   (Embedding Model)         (Similarity Search)       β”‚
                                                                        β–Ό
                                                              Prompt + Konteks ──▢ LLM ──▢ Jawaban

Chunking ​

Chunking = proses memecah dokumen besar menjadi potongan-potongan lebih kecil yang masing-masing akan mendapat vektor sendiri. Prinsip utamanya:

StrategiDeskripsiKapan Digunakan
Simple/DefaultPecah per ~1000 karakter dengan overlapDefault n8n, biasanya cukup
Semantic ChunkingPecah berdasarkan kesamaan maknaData kompleks, topik campur
Fixed SizePecah ukuran tetap (token/karakter)Data terstruktur seragam
Paragraph-basedPecah per paragraf/sectionDokumen dengan struktur jelas

πŸ’‘ Prinsip Emas: "Satu-satunya prinsip sesungguhnya adalah β€” kamu harus mengujinya." Trial and error dengan pengukuran adalah kunci.

Traditional RAG vs Agentic RAG (Recap) ​

  • Traditional RAG: Linear β€” message β†’ vector retrieval β†’ LLM β†’ jawaban
  • Agentic RAG: LLM mengontrol workflow, punya multiple tools (vector search, SQL, API, dll.), bisa iteratif

"RAG is dead" = Red herring. Agentic RAG adalah evolusi natural, bukan pengganti.


πŸ“ Dua Fase Membangun RAG ​

╔══════════════════════════════════════════════════════════════════╗
β•‘                                                                  β•‘
β•‘   FASE 1: DATA INGEST (Hari ini)                                β•‘
β•‘   ──────────────────────────                                     β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β•‘
β•‘   β”‚ Extract  │─▢│ Transform │─▢│  Chunk  │─▢│ Vectorize │──┐   β•‘
β•‘   β”‚ (Google  β”‚  β”‚ (Edit     β”‚  β”‚ (Split  β”‚  β”‚ (OpenAI   β”‚  β”‚   β•‘
β•‘   β”‚  Sheets) β”‚  β”‚  Fields)  β”‚  β”‚  Text)  β”‚  β”‚ Embedding)β”‚  β”‚   β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚   β•‘
β•‘                                                              β”‚   β•‘
β•‘                                              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚   β•‘
β•‘                                              β”‚   Load    β”‚β—€β”€β”˜   β•‘
β•‘                                              β”‚ (Supabase β”‚      β•‘
β•‘                                              β”‚  Vector   β”‚      β•‘
β•‘                                              β”‚  Store)   β”‚      β•‘
β•‘                                              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β•‘
β•‘                                                                  β•‘
β•‘   FASE 2: QUESTION ANSWERING (Besok)                            β•‘
β•‘   ──────────────────────────────────                             β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β•‘
β•‘   β”‚  User    │─▢│ Vectorize │─▢│ Retrieve  │─▢│   LLM    β”‚    β•‘
β•‘   β”‚ Question β”‚  β”‚ Question  β”‚  β”‚ from DB   β”‚  β”‚ + Contextβ”‚    β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β•‘
β•‘                                                                  β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

ETL (Extract, Transform, Load) + Chunking & Vectorizing ​

TahapApa Yang TerjadiTool/Node
ExtractAmbil data dari sumberGoogle Sheets node
TransformUbah format data sesuai kebutuhanEdit Fields (Set) node
ChunkPecah data jadi potongan kecilDefault Document Loader
VectorizeUbah teks menjadi vektorOpenAI Embeddings node
LoadSimpan ke vector databaseSupabase Vector Store node

πŸ’Ό Business Challenge Minggu Ini ​

Skenario ​

Klien memiliki toko online aksesoris komputer dengan 60 produk di Google Sheets. Mereka butuh expert agent yang bisa menjawab pertanyaan detail tentang produk β€” scalable hingga 60.000+ produk.

Data Sumber: Google Sheet ​

ColumnContoh
NameNovaKey Tactile Keyboard
CategoryKeyboard
SKUNK-TK-001
Price129.99
DescriptionPremium mechanical keyboard with...

πŸ”‘ Kunci Pembelajaran: 60 produk hanyalah contoh. Pipeline yang sama bisa menangani 60.000 atau 600.000 produk. Itulah kekuatan RAG.


πŸ”¨ Data Ingest Pipeline ​

Workflow n8n ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Manual        │───▢│ Google       │───▢│ Supabase Vector Store        β”‚
β”‚ Trigger       β”‚    β”‚ Sheets       β”‚    β”‚ (Add documents)              β”‚
β”‚               β”‚    β”‚ (Get Rows)   β”‚    β”‚                              β”‚
β”‚               β”‚    β”‚              β”‚    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚               β”‚    β”‚  60 items    β”‚    β”‚  β”‚ Edit Fieldsβ”‚ ← Sub-node  β”‚
β”‚               β”‚    β”‚              β”‚    β”‚  β”‚ (Transform)β”‚   (Loader)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
                                        β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
                                        β”‚  β”‚ OpenAI     β”‚ ← Sub-node  β”‚
                                        β”‚  β”‚ Embeddings β”‚  (Embedding) β”‚
                                        β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
                                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Node Edit Fields (Transform) ​

Node Edit Fields (dulunya bernama "Set") adalah node krusial untuk data engineering β€” memetakan data dari format input ke format output yang diinginkan.

Konfigurasi Mapping ​

Kita membuat dua field output:

Field 1: content (String, Expression)

Product Name: {{ $json.name }}
Category: {{ $json.Category }}
SKU: {{ $json.SKU }}
Price: ${{ $json.Price }}
Description: {{ $json.Description }}

Field 2: category (String, Expression)

{{ $json.Category }}

Contoh Hasil Transform ​

json
{
  "content": "Product Name: NovaKey Tactile Keyboard\nCategory: Keyboard\nSKU: NK-TK-001\nPrice: $129.99\nDescription: Premium mechanical keyboard with tactile switches...",
  "category": "Keyboard"
}

πŸ’‘ Mengapa format ini? Field content dirancang agar informatif jika diberikan ke LLM sebagai konteks. Field category adalah metadata yang bisa digunakan untuk filtering.


πŸ—„οΈ Setup Supabase ​

Langkah 1: Buat Project ​

  1. Login ke supabase.com
  2. Buat New Project β†’ nama: "rag"
  3. Pilih compute size: Tiny (cukup untuk free tier)
  4. Buat database password β†’ simpan aman di password manager
  5. Pilih region terdekat (atau terdekat ke n8n cloud)
  6. Tunggu beberapa menit hingga setup selesai

Langkah 2: Enable pgvector Extension ​

  1. Navigasi ke Database β†’ Extensions
  2. Cari "vector" β†’ klik Enable extension
  3. Extension pgvector sekarang aktif

Langkah 3: Jalankan SQL Script ​

Buka SQL Editor β†’ paste dan jalankan script berikut:

sql
-- Script ini membuat tabel dan fungsi yang dibutuhkan n8n
-- Bisa di-generate ulang via ChatGPT jika perlu

CREATE TABLE knowledge_base (
  id         BIGSERIAL PRIMARY KEY,
  content    TEXT,
  metadata   JSONB,
  embedding  VECTOR(1536)         -- ← Dimensi harus cocok dengan model!
);

CREATE FUNCTION match_documents(...)
  -- Fungsi untuk similarity search yang kompatibel dengan n8n
  -- Menggunakan 1 - cosine_distance untuk format yang benar

⚠️ KRITIS β€” Dimensi Harus Cocok!

Embedding ModelDimensiCatatan
text-embedding-3-small (β˜…)1536Default choice, murah
text-embedding-3-large~3072Lebih powerful, sedikit mahal
Gemini embeddingVariesCek dokumentasi
Open sourceVariesGratis

Angka 1536 di SQL script harus sama persis dengan dimensi embedding model yang dipilih. Jika salah, akan error "mismatching dimensions".

πŸ’‘ Tips: Script bisa dijalankan berulang kali (akan recreate tabel). Jika ganti model, cukup update angka dimensi dan jalankan ulang.

Langkah 4: Ambil Credentials ​

  1. Project Settings β†’ Data API β†’ copy URL
  2. Project Settings β†’ API Keys β†’ switch ke Legacy keys β†’ copy service_role secret key (yang ditandai orange "secret")

⚠️ n8n belum mendukung format API key baru Supabase, jadi gunakan legacy keys.


πŸ”— Integrasi n8n + Supabase ​

Konfigurasi Supabase Vector Store Node ​

  1. Cari node: "Supabase Vector Store"
  2. Operation: Add documents to vector store
  3. Credentials:
    • Host: URL dari Supabase Data API
    • Service Role Secret: Legacy API key
    • Tekan Save β†’ harus muncul βœ… hijau

Sub-node 1: Embedding Model ​

ParameterNilai
ProviderOpenAI Embeddings
Modeltext-embedding-3-small
Dimensi1536 (otomatis berdasarkan model)

Sub-node 2: Document Loader (Default Data Loader) ​

ParameterNilai
ModeLoad Specific Data
Data (Expression){{ $json.content }}
Text SplitterSimple (default)
Chunk Size1000 karakter (default)
OverlapDefault

Options β†’ Metadata:

Property NameValue (Expression)
category{{ $json.category }}

Parameter Utama Vector Store ​

ParameterNilai
Table Nameknowledge_base

Eksekusi Pipeline ​

Execute Workflow β†’ 60 items loaded β†’ 60 items transformed β†’ 60 documents vectorized β†’ 60 rows in Supabase βœ…

Verifikasi di Supabase ​

Navigasi ke Database β†’ knowledge_base table:

idcontentmetadataembedding
1"Product Name: NovaKey..."[-0.023, 0.847, -0.15, ...]
2"Product Name: ProType..."[0.134, -0.562, 0.33, ...]
........... (1536 angka per row)

Memperbaiki Kesalahan ​

Jika ditemukan typo (misalnya extra dollar sign di description):

  1. Supabase: Select all β†’ Delete 60 rows
  2. n8n: Fix expression di Edit Fields node
  3. Re-run: Execute workflow β†’ 60 rows baru yang benar

πŸ’‘ Keuntungan pipeline: Bisa di-rerun kapan saja dengan cepat. Perbaikan data hanya butuh hitungan detik.


πŸ“Š Rangkuman ​

Alur Lengkap Data Ingest ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  EXTRACT          TRANSFORM         CHUNK+VECTORIZE    LOAD   β”‚
β”‚                                                                β”‚
β”‚  Google Sheets β†’ Edit Fields β†’ Default Loader   β†’ Supabase   β”‚
β”‚  (60 products)   (content +    (simple split       (Vector   β”‚
β”‚                   category)     + OpenAI embed)     Store)   β”‚
β”‚                                                                β”‚
β”‚  Node: Google    Node: Edit    Sub-node dalam     Node:       β”‚
β”‚  Sheets (Get     Fields (Set)  Supabase Vector    Supabase    β”‚
β”‚  Rows)                         Store cluster      Vector Storeβ”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Poin-Poin Utama ​

#KonsepPenjelasan
1Edit Fields nodeNode untuk data transformation/mapping (dulunya "Set")
2Supabase setuppgvector extension + SQL script + dimensi harus cocok
3Legacy API keysn8n belum dukung format baru Supabase
4Node ClusterSupabase Vector Store = cluster (embedding + loader sub-nodes)
5Dimensi 1536text-embedding-3-small β†’ 1536 dimensi β†’ SQL harus match
6Pipeline reusableBisa di-trigger ulang, diubah trigger-nya (schedule, event)

Teknologi Hari Ini ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Teknologi       β”‚ Peran                            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Google Sheets   β”‚ Sumber data produk (Extract)     β”‚
β”‚ n8n             β”‚ Orchestration pipeline ETL       β”‚
β”‚ Edit Fields     β”‚ Data transformation (Transform)  β”‚
β”‚ OpenAI Embed    β”‚ Vectorization (text β†’ 1536 dim)  β”‚
β”‚ Supabase        β”‚ Vector database (Load & Store)   β”‚
β”‚ PostgreSQL      β”‚ Database engine di balik Supabaseβ”‚
β”‚ pgvector        β”‚ Extension untuk vector operations β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ† Pencapaian ​

╔══════════════════════════════════════════════════════════╗
β•‘  βœ… Membangun data ingest pipeline end-to-end          β•‘
β•‘  βœ… Menguasai Edit Fields node (data transformation)   β•‘
β•‘  βœ… Setup Supabase: project, pgvector, SQL script      β•‘
β•‘  βœ… Integrasi n8n ↔ Supabase credentials               β•‘
β•‘  βœ… 60 produk ter-vectorize & tersimpan di Supabase    β•‘
β•‘  βœ… Memahami dimensi embedding & konfigurasi           β•‘
β•‘                                                          β•‘
β•‘  πŸ“Š Progress Kursus: 60% β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘          β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Selanjutnya: Membangun Agentic RAG Question Answering + Voice Agent dengan ElevenLabs β€” proyek akhir Week 2!

Rangkuman kursus Udemy β€” AI Builder: Create Agents, Voice Agents & Automations in n8n