Membawa AI ke produk nyata: integrasi LLM API yang aman dan hemat biaya, arsitektur RAG yang menghubungkan model dengan database, orchestration agent, serta praktik membangun backend AI service

Di episode 1 kalian membaca: di 2026, backend adalah lapisan orkestrasi AI. Episode 23 mewujudkannya. Aplikasi biasa — toko online kita — kini memanggil model untuk fitur sehari-hari: ringkasan ulasan, rekomendasi produk, chatbot customer service. Dan yang menarik: semua ini tetap masalah backend — koneksi, keamanan, biaya, dan ketersediaan.
Mengapa ini penting dipahami? Karena mengintegrasikan AI bukan sekadar memanggil API model. Ada masalah nyata di baliknya: bagaimana menyimpan dan mengirim data user dengan aman, bagaimana mengendalikan biaya token, bagaimana menjawab pertanyaan tentang data produk kita sendiri (RAG), dan bagaimana mengoordinasikan agent yang memakai tool. Episode ini membangun semuanya.
Semua provider besar menawarkan API LLM dengan pola yang sama: kirim pesan, terima respons.
const completion = await client.chat.completions.create({
model: "gpt-4o",
messages: [
{ role: "system", content: "Kamu adalah asisten toko online yang ramah." },
{ role: "user", content: "Rekomendasikan produk untuk keyboard enthusiast." },
],
max_tokens: 200,
})
const reply = completion.choices[0].message.contentKey LLM adalah kredensial paling mahal — jangan pernah di frontend:
Warning
Menempatkan key LLM di frontend (browser) berarti siapa pun bisa mengekstraknya dari JavaScript dan menguras biaya kalian. Backend adalah satu-satunya tempat yang benar untuk key — dan semua request ke model harus melewati autentikasi API kalian (episode 7).
LLM mahal dan lambat dibanding API biasa. Strategi backend:
stream: true) agar user tidak menunggu response penuh.async function askModel(cacheKey: string, messages) {
const cached = await redis.get(`llm:${cacheKey}`)
if (cached) return JSON.parse(cached)
const completion = await client.chat.completions.create({ model: "gpt-4o", messages })
await redis.set(`llm:${cacheKey}`, JSON.stringify(completion), "EX", 3600)
return completion
}Model tidak tahu data toko kita — produk apa yang tersedia, harga, kebijakan pengiriman. RAG menjawabnya: ambil data relevan dari database kita, lalu berikan ke model sebagai konteks.
Dokumen dipotong (chunking) dan diubah menjadi embedding — representasi vektor yang menangkap makna — lalu disimpan di vector database.
import { OpenAIEmbeddings } from "langchain/embeddings"
async function indexProduct(product) {
const chunks = chunkText(`${product.name} ${product.description}`, 512)
for (const chunk of chunks) {
const embedding = await new OpenAIEmbeddings().embedQuery(chunk)
await vectorStore.upsert({
id: `product-${product.id}-${chunk.index}`,
values: embedding,
metadata: { productId: product.id, text: chunk.text },
})
}
}async function answerWithRag(question: string) {
// 1. Embed pertanyaan dan cari dokumen terdekat
const embedding = await new OpenAIEmbeddings().embedQuery(question)
const results = await vectorStore.query({ topK: 5, vector: embedding })
const context = results.matches
.map((m) => m.metadata.text)
.join("\n---\n")
// 2. Berikan konteks ke model, wajib mengutip sumber
const completion = await client.chat.completions.create({
model: "gpt-4o",
messages: [
{
role: "system",
content:
"Jawab hanya berdasarkan konteks yang diberikan. " +
"Jika konteks tidak memuat jawaban, katakan tidak tahu.",
},
{ role: "user", content: `Konteks:\n${context}\n\nPertanyaan: ${question}` },
],
})
return completion.choices[0].message.content
}| Kriteria | RAG | Fine-tuning |
|---|---|---|
| Data berubah | Tinggal re-index | Harus retrain |
| Perlu GPU/kuota | Tidak | Ya |
| Menjawab data spesifik | Ya | Terbatas |
| Biaya awal | Rendah | Tinggi |
RAG unggul untuk data yang sering berubah — katalog, kebijakan, dokumen internal. Fine-tuning cocok untuk gaya/nada, bukan data aktual.
Note
RAG adalah "database baru" bagi backend: kebutuhan retrieval yang cepat memunculkan infrastruktur baru (vector database seperti pgvector, Qdrant, Weaviate). Tapi prinsip backend lama tetap berlaku: index harus sinkron dengan data sumber, retrieval harus hormati otorisasi, dan semuanya butuh observability (episode 11).
Agent melampaui tanya-jawab: ia menjalankan langkah-langkah dengan tool — query database, cek stok, buat order. Backend orchestrate alurnya.
const tools = [
{
name: "check_stock",
description: "Cek ketersediaan stok produk",
parameters: { productId: "integer" },
execute: async ({ productId }) => {
const { rows } = await db.query(
"SELECT stock FROM products WHERE id = $1", [productId])
return rows[0] ?? { stock: 0 }
},
},
{
name: "create_order",
description: "Buat order untuk user yang sudah login",
parameters: { productId: "integer", qty: "integer" },
execute: async ({ productId, qty }) => createOrder(ctx.userId, productId, qty),
},
]
async function runAgent(session) {
const response = await client.responses.create({
model: "gpt-4o",
tools,
input: session.messages,
})
// agent bisa minta memanggil tool → eksekusi → lanjutkan loop
return handleToolCalls(response, tools, session)
}Aturan keamanan agent:
Rancang satu endpoint AI yang lengkap:
POST /v1/ai/support-chat
auth: Bearer token (episode 7)
body: { message: "Apakah keyboard ini bisa dipakai di Mac?" }
Alur:
1. Validasi & rate limit (per akun, episode 20)
2. Retrieval produk via RAG
3. Prompt dengan konteks + riwayat chat
4. LLM → jawaban + kutipan sumber produk
5. Simpan audit (siapa bertanya apa, biaya token)router.post("/v1/ai/support-chat",
requireAuth,
userAiBudget,
async (req, res, next) => {
try {
const answer = await answerWithRag(req.body.message, req.user.userId)
await auditService.log({ actor: req.user.userId, action: "ai.chat", input: req.body.message })
res.json({ data: { answer } })
} catch (err) {
next(err)
}
})Key LLM bocor = biaya tanpa kendali. Backend-only + auth.
Model lambat; tanpa timeout request menggantung. Timeout + streaming + cache.
User bisa retrieve dokumen orang lain lewat pertanyaan. Filter retrieval per user.
Agent yang bisa "hapus akun" tanpa konfirmasi = bencana. Tool berdampak wajib konfirmasi + RBAC.
Tanpa metrik token per user, biaya AI tak terkendali. Pantau token & budget (episode 11).
Episode 23 membawa AI ke produk: integrasi LLM API yang aman dan hemat biaya, arsitektur RAG yang menghubungkan model dengan data kita, orchestration agent dengan tool, dan backend AI service yang teruji dan teraudit.
Inti yang harus dibawa pulang:
Di episode 24 selanjutnya kita akan menjelajahi paradigma API lain: GraphQL & API modern — schema, resolver, dan kapan memilihnya dibanding REST. Sampai jumpa di episode 24!