• Home
  • Tips
  • Implementasi RAG pada Chatbot dengan Python dan FastAPI

Implementasi RAG pada Chatbot dengan Python dan FastAPI

Oleh Hiqbal Fauzi
Implementasi RAG pada Chatbot dengan Python dan FastAPI 1

Implementasi RAG pada chatbot memungkinkan Large Language Model atau LLM menjawab berdasarkan dokumen yang disediakan, bukan hanya mengandalkan pengetahuan internal model.

Dalam tutorial ini, kita akan membuat chatbot layanan pelanggan sederhana menggunakan Python, FastAPI, embedding, cosine similarity, dan OpenAI API. Chatbot akan mencari dokumen yang relevan, menyusun jawaban berdasarkan dokumen tersebut, menampilkan sumber, serta mengeskalasi pertanyaan ketika informasi tidak ditemukan.

Contoh ini ditujukan untuk pembelajaran dan proof of concept. Sistem production tetap membutuhkan autentikasi, kontrol akses dokumen, rate limiting, monitoring, evaluasi, dan mekanisme eskalasi yang lebih kuat.

Pembahasan konsep, manfaat, komponen, dan keterbatasan RAG dapat dipelajari lebih dahulu melalui artikel Retrieval-Augmented Generation atau RAG.

Hasil yang Akan Dibuat

Chatbot menggunakan studi kasus layanan pelanggan untuk sebuah aplikasi demo. Pengguna dapat menanyakan:

  • Jumlah anggota pada setiap paket.
  • Waktu berlakunya upgrade dan downgrade.
  • Ketentuan pengembalian dana.
  • Jam layanan tim dukungan.
  • Prosedur ketika informasi tidak tersedia.

Basis pengetahuan disimpan dalam tiga file Markdown. Proses indexing akan membaca dokumen, membaginya menjadi chunk, membuat embedding, lalu menyimpan hasilnya ke file JSON.

Ketika pengguna mengirim pertanyaan, backend akan:

  1. Membuat embedding pertanyaan.
  2. Membandingkannya dengan embedding setiap chunk.
  3. Memilih chunk yang paling relevan.
  4. Menyusun chunk sebagai konteks.
  5. Meminta LLM menjawab berdasarkan konteks.
  6. Mengembalikan jawaban, sumber, dan status eskalasi.

Alur implementasinya adalah:

Arsitektur Chatbot RAG

Implementasi terdiri dari dua proses utama.

1. Proses Indexing

Proses indexing dijalankan ketika basis pengetahuan dibuat atau diperbarui.

Tahapannya meliputi:

  • Membaca file Markdown.
  • Membagi dokumen menjadi chunk.
  • Menambahkan metadata sumber.
  • Membuat embedding setiap chunk.
  • Menyimpan teks, metadata, dan embedding ke data/index.json.

Embedding merupakan representasi numerik dari teks. Kedekatan antarvektor kemudian digunakan untuk mencari bagian dokumen yang memiliki makna serupa dengan pertanyaan.

Pada sistem yang lebih besar, file JSON dapat diganti dengan vector database agar pencarian, filtering metadata, dan pembaruan indeks lebih efisien.

2. Proses Chat

Proses chat dijalankan setiap kali pengguna mengirim pertanyaan.

Backend akan memvalidasi pesan, membuat embedding pertanyaan, menghitung cosine similarity, memilih chunk terbaik, lalu mengirimkan konteks tersebut kepada model generatif.

Apabila tidak ada chunk yang melewati batas skor minimum, backend tidak perlu memanggil model. Sistem dapat langsung menyatakan bahwa informasi belum ditemukan.

Komponen yang Digunakan

Komponen Fungsi
File Markdown Menyimpan basis pengetahuan layanan
Embedding model Mengubah dokumen dan pertanyaan menjadi vektor
NumPy Menghitung cosine similarity
FastAPI Menyediakan endpoint chatbot
LLM Menyusun jawaban berdasarkan hasil retrieval
HTML dan JavaScript Menyediakan antarmuka percakapan

FastAPI dipilih karena mendukung validasi request menggunakan Pydantic dan dapat menghasilkan dokumentasi API secara otomatis. Konsep dasarnya dapat dipelajari melalui artikel FastAPI untuk API modern.

Persiapan Implementasi

Siapkan beberapa kebutuhan berikut:

  • Python 3.10 atau versi lebih baru.
  • Terminal atau command prompt.
  • Text editor atau IDE.
  • API key dari penyedia model.
  • Koneksi internet untuk memanggil API embedding dan generation.

Tutorial ini menggunakan OpenAI API sebagai contoh. Penyedia model dapat diganti selama menyediakan model embedding dan model generatif.

Jangan menyimpan API key langsung di source code. Gunakan environment variable dan hindari mengunggah file .env ke repositori publik.

Langkah Implementasi RAG pada Chatbot

1. Membuat Struktur Proyek

Buat struktur berikut:

File build_index.py menangani pemrosesan dokumen dan embedding. File app.py menjalankan API, retrieval, serta generation. Folder static menyimpan antarmuka chatbot.

Buat direktori proyek dan virtual environment:

Aktifkan virtual environment pada Linux atau macOS:

Pada Windows PowerShell:

Virtual environment membantu memisahkan dependency proyek dari instalasi Python global.

2. Memasang Dependency

Buat file requirements.txt:

Kemudian instal dependency:

Package yang digunakan memiliki fungsi berikut:

  • openai untuk embedding dan generation.
  • fastapi untuk backend API.
  • uvicorn untuk menjalankan aplikasi ASGI.
  • numpy untuk operasi vektor.
  • python-dotenv untuk membaca file .env.

Pada deployment production, gunakan versi dependency yang sudah diuji agar pembaruan package tidak langsung mengubah perilaku aplikasi.

3. Menyiapkan Environment Variable

Buat file .env:

Ganti isi_api_key_kamu dengan API key yang valid.

TOP_K menentukan jumlah maksimum chunk yang diambil. Sementara itu, MIN_SCORE digunakan untuk membuang hasil retrieval yang terlalu lemah.

Nilai skor tidak menjamin bahwa dokumen benar-benar relevan. Nilainya perlu dikalibrasi menggunakan kumpulan pertanyaan yang mewakili penggunaan nyata.

Pada saat tutorial ini diperbarui, gpt-5.6-luna tersedia sebagai model untuk beban kerja berbiaya rendah dan volume tinggi. Ketersediaan model tetap perlu diperiksa pada akun dan dokumentasi penyedia API.

Buat file .gitignore:

File indeks dimasukkan ke .gitignore karena memuat salinan isi dokumen dan embedding. Jangan menganggap file embedding otomatis aman hanya karena isinya berupa angka.

4. Membuat Basis Pengetahuan

Buat direktori yang diperlukan:

Kemudian buat tiga file Markdown.

File knowledge/paket.md

File knowledge/pembayaran.md

File knowledge/dukungan.md

Basis pengetahuan dibuat kecil agar hasil retrieval mudah diperiksa.

Baca Juga:  Hal Utama yang Perlu Dipertimbangkan Sebelum Migrasi VPS

Pada penggunaan nyata, dokumen sebaiknya memiliki:

  • Pemilik dokumen.
  • Nomor versi.
  • Tanggal berlaku.
  • Status publikasi.
  • Kategori produk.
  • Informasi hak akses.
  • Prosedur pembaruan.

Jangan memasukkan password, API key, token, atau data pribadi yang tidak diperlukan.

5. Membuat Skrip Indexing

Buat file build_index.py.

Kode berikut membaca seluruh dokumen Markdown, membaginya menjadi chunk, membuat embedding, dan menyimpan indeks ke file JSON.

Fungsi split_text() memproses paragraf panjang secara terpisah agar setiap chunk tetap berada dalam batas CHUNK_SIZE.

Untuk dokumen production, chunking sebaiknya mempertimbangkan heading, tabel, pasal, daftar, dan batas makna. Pemotongan berdasarkan karakter digunakan di sini agar kode tetap mudah dipahami.

6. Membangun Indeks

Jalankan:

Apabila berhasil, terminal akan menampilkan lokasi indeks dan jumlah chunk:

Jalankan kembali skrip tersebut setiap kali dokumen berubah.

Karena backend memuat indeks ketika aplikasi dimulai, restart aplikasi setelah membangun ulang indeks.

7. Membuat Backend Chatbot

Buat file app.py.

Backend berikut memuat indeks, membuat embedding pertanyaan, melakukan retrieval, menyusun konteks, lalu meminta model menghasilkan jawaban.

Baca Juga:  10 Contoh Judul Blog yang Menarik Beserta Tips Membuatnya

Backend memvalidasi request menggunakan Pydantic. Panjang pesan dibatasi maksimal 1.000 karakter untuk membatasi input pada demo.

Seluruh embedding dokumen dinormalisasi satu kali saat aplikasi dimulai. Cosine similarity kemudian dapat dihitung menggunakan perkalian matriks.

Token [ESCALATE] digunakan agar status eskalasi pada response mengikuti keputusan yang disampaikan model. Untuk production, mekanisme tersebut sebaiknya diganti dengan structured output atau pemeriksaan deterministik yang lebih kuat.

8. Membuat Antarmuka Chatbot

Buat file static/index.html:

Baca Juga:  Cara dan Tips Termudah Mengaktifkan TikTok Shop bagi Pemula

Jawaban ditampilkan menggunakan textContent, bukan innerHTML. Dengan demikian, teks dari model tidak langsung diperlakukan sebagai markup HTML oleh browser.

Antarmuka ini masih berupa demo. Sistem production perlu menambahkan autentikasi, loading indicator, accessibility testing, batas sesi, dan penanganan error yang lebih rinci.

9. Menjalankan Chatbot

Jalankan server:

Buka alamat berikut melalui browser:

Opsi --reload hanya digunakan untuk pengembangan. Gunakan konfigurasi server yang sesuai ketika aplikasi dipasang pada environment production.

Endpoint juga dapat diuji melalui terminal:

Contoh response:

Nilai skor dapat berbeda pada setiap model embedding. Skor tersebut lebih cocok digunakan oleh developer untuk memeriksa retrieval daripada ditampilkan kepada pengguna akhir.

Cara Menguji Chatbot RAG

Jangan hanya menguji pertanyaan yang jawabannya sama persis dengan dokumen. Gunakan beberapa kategori berikut.

1. Pertanyaan dengan Jawaban Langsung

Retriever seharusnya mengambil paket.md dan menjawab maksimal 20 anggota.

2. Pertanyaan dengan Istilah Berbeda

Vector search seharusnya tetap menemukan dokumen yang relevan meskipun kata-katanya berbeda.

3. Pertanyaan yang Tidak Memiliki Jawaban

Basis pengetahuan tidak memiliki data akun. Chatbot harus menolak memberikan angka dan mengeskalasi pertanyaan.

4. Pertanyaan dengan Premis Salah

Chatbot perlu mengoreksi premis menggunakan dokumen, bukan mengikuti angka dari pengguna.

5. Pertanyaan Ambigu

Pertanyaan tersebut dapat merujuk pada pembayaran, upgrade, atau layanan lainnya. Chatbot sebaiknya meminta klarifikasi apabila konteks tidak cukup spesifik.

6. Percobaan Prompt Injection

Tambahkan pertanyaan yang meminta chatbot mengabaikan aturan, mengungkap API key, atau mengikuti instruksi di dalam dokumen.

Dokumen harus tetap diperlakukan sebagai data. Prompt saja tidak cukup menjadi mekanisme keamanan, sehingga credential dan kontrol akses tetap harus dikelola oleh aplikasi.

Batasan Implementasi Demo

Implementasi ini cukup untuk memahami alur end-to-end, tetapi belum siap digunakan langsung untuk pelanggan.

1. Indeks Masih Menggunakan File JSON

Pencarian NumPy sesuai untuk indeks kecil. Ketika jumlah chunk bertambah, gunakan vector database yang mendukung:

  • Indexing yang lebih efisien.
  • Metadata filtering.
  • Pembaruan dan penghapusan dokumen.
  • Persistence dan backup.
  • Pemisahan data antar pengguna.

2. Data Transaksional Harus Diambil dari API

RAG cocok untuk mencari prosedur, dokumentasi, dan informasi yang relatif stabil.

Data berikut sebaiknya diambil melalui database atau API terautentikasi:

  • Saldo akun.
  • Status pembayaran.
  • Status tiket.
  • Stok atau kuota real-time.
  • Identitas pengguna.
  • Perubahan paket yang sedang diproses.

Chatbot dapat menggunakan RAG untuk menjelaskan prosedur dan API untuk mengambil status aktual.

3. Hak Akses Belum Diterapkan

Jangan menggabungkan seluruh dokumen perusahaan ke satu indeks tanpa metadata akses.

Filter hak akses perlu diterapkan sebelum chunk dikirim kepada model. Menyaring sumber setelah jawaban dibuat sudah terlambat karena model mungkin telah menerima informasi yang tidak boleh diakses pengguna.

4. Riwayat Percakapan Belum Digunakan

Contoh ini memperlakukan setiap pertanyaan secara mandiri.

Pada chatbot nyata, pertanyaan lanjutan seperti “bagaimana cara mengajukannya?” memerlukan konteks dari pesan sebelumnya.

Riwayat dapat ditangani dengan:

  • Menulis ulang pertanyaan menjadi kueri mandiri.
  • Mengirim beberapa pesan terakhir.
  • Menyimpan ringkasan percakapan.
  • Menggunakan ID sesi dan batas waktu.

Jangan mengirim seluruh riwayat tanpa batas karena dapat meningkatkan biaya, membawa instruksi lama, dan memuat data pribadi.

5. Evaluasi Belum Diotomatisasi

Buat dataset yang berisi:

  • Pertanyaan dengan jawaban.
  • Pertanyaan tanpa jawaban.
  • Pertanyaan ambigu.
  • Premis salah.
  • Typo dan bahasa tidak baku.
  • Prompt injection.
  • Pertanyaan yang membutuhkan beberapa dokumen.

Pisahkan evaluasi retrieval dan generation. Model tidak dapat menghasilkan jawaban yang benar apabila dokumen yang tepat tidak pernah masuk ke konteks.

Menjalankan Chatbot RAG di Server

Backend FastAPI memerlukan runtime Python, process manager, reverse proxy, HTTPS, penyimpanan indeks, logging, monitoring, dan proses pembaruan dokumen.

Pada trafik rendah, backend dan indeks kecil dapat berjalan dalam satu server. Ketika kebutuhan bertambah, arsitektur dapat dipisahkan menjadi:

  • Web frontend.
  • API chatbot.
  • Worker indexing.
  • Vector database.
  • Cache.
  • Queue.
  • Sistem observability.

Pembahasan infrastrukturnya dapat dipelajari melalui artikel Cloud VPS untuk AI dan machine learning.

Apabila ingin menggunakan model lokal, kamu juga dapat mempelajari panduan Ollama dan Open WebUI.

Butuh lingkungan server yang dapat dikonfigurasi untuk menjalankan backend FastAPI, worker indexing, vector database, cache, dan monitoring? Gunakan Cloud VPS DomaiNesia dan sesuaikan kapasitasnya dengan volume dokumen, jumlah pengguna, serta komponen yang dijalankan.

FAQ Implementasi RAG pada Chatbot

Apakah chatbot RAG harus menggunakan vector database?

Tidak. Demo kecil dapat menggunakan array NumPy atau file lokal. Vector database lebih dibutuhkan ketika jumlah embedding, kebutuhan filtering, dan trafik mulai meningkat.

Apakah RAG sama dengan chatbot?

Tidak. Chatbot merupakan antarmuka percakapan, sedangkan RAG adalah pola untuk mengambil informasi eksternal sebelum model menghasilkan jawaban.

Apakah chatbot RAG dapat mengingat percakapan?

Bisa, tetapi memory perlu ditambahkan secara terpisah. Riwayat percakapan tidak otomatis menjadi bagian dari proses retrieval.

Apakah RAG dapat digunakan untuk mengambil data akun?

RAG dapat mencari dokumen, tetapi saldo, transaksi, dan status akun sebaiknya diambil melalui API atau database yang dilindungi autentikasi.

Apakah implementasi ini siap digunakan untuk pelanggan?

Belum. Contoh ini belum memiliki autentikasi, rate limiting, kontrol akses dokumen, manajemen sesi, vector database, dan evaluasi otomatis.

Kesimpulan

Implementasi RAG pada chatbot terdiri dari dua proses utama. Proses indexing menyiapkan dokumen agar dapat dicari, sedangkan proses chat mengambil konteks yang relevan dan meminta LLM menyusun jawaban berdasarkan konteks tersebut.

Contoh ini menggunakan file Markdown, embedding, cosine similarity, FastAPI, OpenAI API, serta antarmuka web sederhana. Chatbot juga mengembalikan sumber retrieval dan mengeskalasi pertanyaan ketika informasi tidak tersedia.

Kualitas chatbot RAG tidak hanya ditentukan oleh model. Sumber data, chunking, metadata, retrieval, prompt, kontrol akses, evaluasi, dan mekanisme eskalasi menentukan apakah jawaban dapat dipercaya.

Hiqbal Fauzi

As SEO Specialist at DomaiNesia with a bachelor's in animal husbandry, passionate about digital marketing, especially in SEO.


Berlangganan Artikel

Dapatkan artikel, free ebook dan video
terbaru dari DomaiNesia

{{ errors.name }} {{ errors.email }}
Migrasi ke DomaiNesia

Migrasi Hosting ke DomaiNesia Gratis 1 Bulan

Ingin memiliki hosting dengan performa terbaik? Migrasikan hosting Anda ke DomaiNesia. Gratis jasa migrasi dan gratis 1 bulan masa aktif!

Ya, Migrasikan Hosting Saya

Hosting Murah

This will close in 0 seconds