Tutorial Groq API: Inferensi LLM Super Cepat untuk Aplikasi AI
Introduction
Groq telah menjadi salah satu platform inferensi AI paling populer berkat kecepatan luar biasa yang ditawarkan oleh chip Language Processing Unit (LPU) milik mereka. Jika Anda pernah merasa frustrasi dengan latensi tinggi saat memanggil API model bahasa besar, Groq hadir sebagai solusi dengan kecepatan inferensi yang jauh melampaui GPU tradisional.
Dalam tutorial ini, kita akan mempelajari cara menggunakan Groq API secara menyeluruh mulai dari setup awal, penggunaan dasar untuk chat completion, hingga fitur-fitur lanjutan seperti streaming, tool use (function calling), vision model, dan integrasi dengan framework populer seperti LangChain dan LlamaIndex. Semua contoh kode dalam tutorial ini bisa langsung Anda jalankan di environment lokal.
Groq menyediakan akses ke berbagai model open-source populer termasuk Llama, Mixtral, dan Gemma dengan kecepatan output yang bisa mencapai ratusan token per detik. Yang menarik, Groq API menggunakan format yang kompatibel dengan OpenAI API, sehingga migrasi dari OpenAI ke Groq sangat mudah dilakukan.
Instalasi dan Setup
Mendapatkan API Key
Langkah pertama adalah mendaftar dan mendapatkan API key dari Groq:
Instalasi Library
Groq menyediakan Python SDK resmi yang bisa diinstal via pip:
pip install groq
Untuk proyek yang lebih lengkap, instal juga dependensi tambahan:
pip install groq python-dotenv httpx Pillow
Konfigurasi Environment
Buat file .env untuk menyimpan API key:
GROQAPIKEY=gskyourapikeyhere
Verifikasi instalasi dengan script sederhana:
import os
from dotenv import loaddotenv
from groq import Groq
loaddotenv()
client = Groq(apikey=os.environ.get("GROQAPIKEY"))
Test koneksi
models = client.models.list()
for model in models.data:
print(f"Model: {model.id}")
Jika berhasil, Anda akan melihat daftar model yang tersedia di Groq.
Basic Usage
Chat Completion Sederhana
Penggunaan paling dasar dari Groq API adalah chat completion:
from groq import Groq
client = Groq()
chatcompletion = client.chat.completions.create(
messages=[
{
"role": "system",
"content": "Kamu adalah asisten AI yang membantu dan ramah."
},
{
"role": "user",
"content": "Jelaskan apa itu machine learning dalam 3 kalimat."
}
],
model="llama-3.3-70b-versatile",
temperature=0.7,
maxtokens=1024,
)
print(chatcompletion.choices[0].message.content)
Model yang Tersedia
Groq menyediakan beberapa model populer. Berikut rekomendasi penggunaan:
# Model untuk tugas umum dan reasoning
MODELGENERAL = "llama-3.3-70b-versatile"
Model cepat untuk tugas sederhana
MODELFAST = "llama-3.1-8b-instant"
Model Mixtral untuk tugas multilingual
MODELMULTILINGUAL = "mixtral-8x7b-32768"
Model dengan context window besar
MODELLONGCONTEXT = "llama-3.3-70b-versatile" # 128K context
Model vision untuk gambar
MODELVISION = "llama-3.2-90b-vision-preview"
Mengatur Parameter
Anda bisa mengontrol output model dengan berbagai parameter:
response = client.chat.completions.create(
messages=[
{"role": "user", "content": "Tulis puisi pendek tentang koding."}
],
model="llama-3.3-70b-versatile",
temperature=0.9, # Kreativitas (0.0 - 2.0)
maxtokens=512, # Maksimum token output
topp=0.9, # Nucleus sampling
frequencypenalty=0.5, # Penalti pengulangan kata
presencepenalty=0.3, # Penalti topik yang sudah disebutkan
stop=["---"], # Stop sequence
)
Multi-turn Conversation
Untuk percakapan multi-turn, kirim seluruh riwayat percakapan:
conversationhistory = [
{"role": "system", "content": "Kamu adalah tutor Python yang sabar."}
]
def chat(user
message):
conversationhistory.append({
"role": "user",
"content": usermessage
})
response = client.chat.completions.create(
messages=conversationhistory,
model="llama-3.3-70b-versatile",
temperature=0.7,
maxtokens=1024,
)
assistantmessage = response.choices[0].message.content
conversationhistory.append({
"role": "assistant",
"content": assistantmessage
})
return assistantmessage
Contoh percakapan
print(chat("Apa itu list comprehension di Python?"))
print(chat("Beri contoh dengan filtering."))
print(chat("Bagaimana performanya dibanding for loop biasa?"))
Streaming Response
Basic Streaming
Streaming sangat berguna untuk UX yang lebih baik di aplikasi chat:
stream = client.chat.completions.create(
messages=[
{"role": "user", "content": "Jelaskan arsitektur Transformer secara detail."}
],
model="llama-3.3-70b-versatile",
temperature=0.7,
maxtokens=2048,
stream=True,
)
for chunk in stream:
content = chunk.choices[0].delta.content
if content:
print(content, end="", flush=True)
print()
Streaming dengan Metadata
Anda bisa mengumpulkan metadata selama streaming:
def streamwithstats(messages, model="llama-3.3-70b-versatile"):
stream = client.chat.completions.create(
messages=messages,
model=model,
stream=True,
max
tokens=2048,
)
fullresponse = ""
prompttokens = 0
completiontokens = 0
for chunk in stream:
if chunk.choices[0].delta.content:
content = chunk.choices[0].delta.content
fullresponse += content
print(content, end="", flush=True)
if hasattr(chunk, 'xgroq') and chunk.xgroq:
if hasattr(chunk.xgroq, 'usage') and chunk.xgroq.usage:
prompttokens = chunk.xgroq.usage.prompttokens
completiontokens = chunk.xgroq.usage.completiontokens
print(f"\n\nToken usage - Prompt: {prompttokens}, "
f"Completion: {completiontokens}")
return fullresponse
result = streamwithstats([
{"role": "user", "content": "Apa keunggulan Groq dibanding GPU untuk inferensi?"}
])
Async Support
Penggunaan Async Client
Untuk aplikasi yang membutuhkan concurrency tinggi:
import asyncio
from groq import AsyncGroq
async def asyncchat(prompt):
client = AsyncGroq()
response = await client.chat.completions.create(
messages=[{"role": "user", "content": prompt}],
model="llama-3.1-8b-instant",
maxtokens=512,
)
return response.choices[0].message.content
async def batchprocess(prompts):
tasks = [asyncchat(prompt) for prompt in prompts]
results = await asyncio.gather(*tasks)
return results
Proses beberapa prompt secara paralel
prompts = [
"Apa itu Docker?",
"Apa itu Kubernetes?",
"Apa itu CI/CD?",
"Apa itu microservices?",
]
results = asyncio.run(batchprocess(prompts))
for prompt, result in zip(prompts, results):
print(f"Q: {prompt}")
print(f"A: {result[:100]}...")
print()
Async Streaming
async def asyncstream(prompt):
client = AsyncGroq()
stream = await client.chat.completions.create(
messages=[{"role": "user", "content": prompt}],
model="llama-3.3-70b-versatile",
stream=True,
max
tokens=1024,
)
fullresponse = ""
async for chunk in stream:
content = chunk.choices[0].delta.content
if content:
fullresponse += content
print(content, end="", flush=True)
print()
return fullresponse
asyncio.run(asyncstream("Jelaskan konsep RAG dalam AI."))
Tool Use (Function Calling)
Mendefinisikan Tools
Groq mendukung function calling yang kompatibel dengan format OpenAI:
import json
tools = [
{
"type": "function",
"function": {
"name": "getweather",
"description": "Mendapatkan informasi cuaca untuk suatu lokasi",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Nama kota, misal: Jakarta, Surabaya"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "Unit temperatur"
}
},
"required": ["location"]
}
}
},
{
"type": "function",
"function": {
"name": "searchproducts",
"description": "Mencari produk berdasarkan query",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Kata kunci pencarian"
},
"maxprice": {
"type": "number",
"description": "Harga maksimum"
},
"category": {
"type": "string",
"description": "Kategori produk"
}
},
"required": ["query"]
}
}
}
]
Menggunakan Tools dalam Chat
def getweather(location, unit="celsius"):
# Simulasi data cuaca
weatherdata = {
"Jakarta": {"temp": 32, "condition": "Cerah berawan"},
"Bandung": {"temp": 24, "condition": "Hujan ringan"},
"Surabaya": {"temp": 34, "condition": "Cerah"},
}
data = weatherdata.get(location, {"temp": 28, "condition": "Tidak diketahui"})
return json.dumps({
"location": location,
"temperature": data["temp"],
"unit": unit,
"condition": data["condition"]
})
def searchproducts(query, maxprice=None, category=None):
return json.dumps({
"products": [
{"name": f"{query} Premium", "price": 150000, "stock": 25},
{"name": f"{query} Standard", "price": 75000, "stock": 100},
]
})
Mapping fungsi
availablefunctions = {
"getweather": getweather,
"searchproducts": searchproducts,
}
def chatwithtools(usermessage):
messages = [{"role": "user", "content": usermessage}]
response = client.chat.completions.create(
messages=messages,
model="llama-3.3-70b-versatile",
tools=tools,
toolchoice="auto",
maxtokens=1024,
)
responsemessage = response.choices[0].message
if responsemessage.toolcalls:
messages.append(responsemessage)
for toolcall in responsemessage.toolcalls:
functionname = toolcall.function.name
functionargs = json.loads(toolcall.function.arguments)
functionresponse = availablefunctionsfunctionname
messages.append({
"role": "tool",
"toolcallid": toolcall.id,
"name": functionname,
"content": functionresponse,
})
secondresponse = client.chat.completions.create(
messages=messages,
model="llama-3.3-70b-versatile",
maxtokens=1024,
)
return secondresponse.choices[0].message.content
return responsemessage.content
Test
print(chatwithtools("Bagaimana cuaca di Jakarta hari ini?"))
print(chatwithtools("Carikan laptop dengan harga di bawah 10 juta"))
Vision (Multimodal)
Analisis Gambar
Groq mendukung model vision untuk menganalisis gambar:
import base64
import httpx
def encodeimagefromurl(imageurl):
response = httpx.get(imageurl)
return base64.b64encode(response.content).decode("utf-8")
def encodeimagefromfile(filepath):
with open(filepath, "rb") as f:
return base64.b64encode(f.read()).decode("utf-8")
Analisis gambar dari URL
def analyzeimage(imageurl, question="Deskripsikan gambar ini secara detail."):
response = client.chat.completions.create(
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": question},
{
"type": "imageurl",
"imageurl": {
"url": imageurl,
},
},
],
}
],
model="llama-3.2-90b-vision-preview",
maxtokens=1024,
)
return response.choices[0].message.content
Analisis gambar dari file lokal
def analyzelocalimage(filepath, question="Apa yang kamu lihat di gambar ini?"):
base64image = encodeimagefromfile(filepath)
response = client.chat.completions.create(
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": question},
{
"type": "imageurl",
"imageurl": {
"url": f"data:image/png;base64,{base64image}",
},
},
],
}
],
model="llama-3.2-90b-vision-preview",
maxtokens=1024,
)
return response.choices[0].message.content
JSON Mode
Structured Output
Gunakan JSON mode untuk mendapatkan output terstruktur:
import json
def extractentities(text):
response = client.chat.completions.create(
messages=[
{
"role": "system",
"content": "Ekstrak entitas dari teks dan kembalikan dalam format JSON "
"dengan key: persons (array), locations (array), "
"organizations (array), dates (array)."
},
{"role": "user", "content": text}
],
model="llama-3.3-70b-versatile",
temperature=0,
maxtokens=1024,
responseformat={"type": "jsonobject"},
)
return json.loads(response.choices[0].message.content)
text = """
Pada tanggal 15 Januari 2026, CEO Google Sundar Pichai mengumumkan
pembukaan kantor baru di Jakarta. Menteri Komunikasi Indonesia
menyambut baik investasi ini.
"""
entities = extractentities(text)
print(json.dumps(entities, indent=2, ensureascii=False))
Structured Data Extraction
def analyzesentimentbatch(reviews):
response = client.chat.completions.create(
messages=[
{
"role": "system",
"content": (
"Analisis sentimen dari setiap review. "
"Kembalikan JSON dengan key 'results' berisi array of objects "
"dengan fields: review
index (int), sentiment (positive/negative/neutral), "
"confidence (0.0-1.0), keyphrases (array of string)."
)
},
{
"role": "user",
"content": json.dumps(reviews, ensureascii=False)
}
],
model="llama-3.3-70b-versatile",
temperature=0,
responseformat={"type": "jsonobject"},
maxtokens=2048,
)
return json.loads(response.choices[0].message.content)
reviews = [
"Produk sangat bagus, pengiriman cepat!",
"Kualitas mengecewakan, tidak sesuai deskripsi.",
"Biasa saja, sesuai harganya.",
]
results = analyzesentimentbatch(reviews)
print(json.dumps(results, indent=2, ensureascii=False))
Advanced Usage
Rate Limiting dan Retry
Implementasi retry logic yang robust:
import time
from groq import Groq, RateLimitError, APIError
def robustcompletion(messages, model="llama-3.3-70b-versatile",
maxretries=3, kwargs):
client = Groq()
for attempt in range(maxretries):
try:
response = client.chat.completions.create(
messages=messages,
model=model,
kwargs
)
return response
except RateLimitError as e:
if attempt < maxretries - 1:
waittime = (2 attempt) + 1
print(f"Rate limited. Menunggu {waittime} detik...")
time.sleep(waittime)
else:
raise
except APIError as e:
if attempt < maxretries - 1:
print(f"API error: {e}. Retry {attempt + 1}/{maxretries}")
time.sleep(1)
else:
raise
return None
Text Chunking untuk Dokumen Panjang
def processlongdocument(document, chunksize=4000, overlap=200):
chunks = []
start = 0
while start < len(document):
end = start + chunksize
chunk = document[start:end]
chunks.append(chunk)
start = end - overlap
summaries = []
for i, chunk in enumerate(chunks):
response = client.chat.completions.create(
messages=[
{
"role": "system",
"content": "Ringkas bagian dokumen berikut secara padat."
},
{"role": "user", "content": chunk}
],
model="llama-3.1-8b-instant",
temperature=0.3,
maxtokens=512,
)
summaries.append(response.choices[0].message.content)
print(f"Chunk {i+1}/{len(chunks)} diproses.")
# Gabungkan semua ringkasan
combined = "\n\n".join(summaries)
finalresponse = client.chat.completions.create(
messages=[
{
"role": "system",
"content": "Gabungkan ringkasan-ringkasan berikut menjadi "
"satu ringkasan yang koheren dan komprehensif."
},
{"role": "user", "content": combined}
],
model="llama-3.3-70b-versatile",
temperature=0.3,
maxtokens=1024,
)
return finalresponse.choices[0].message.content
Integrasi dengan LangChain
from langchaingroq import ChatGroq
from langchaincore.messages import HumanMessage, SystemMessage
from langchaincore.outputparsers import StrOutputParser
from langchaincore.prompts import ChatPromptTemplate
Inisialisasi model
llm = ChatGroq(
model="llama-3.3-70b-versatile",
temperature=0.7,
maxtokens=1024,
)
Chain sederhana
prompt = ChatPromptTemplate.frommessages([
("system", "Kamu adalah ahli {topic} yang menjelaskan konsep secara sederhana."),
("human", "{question}")
])
chain = prompt | llm | StrOutputParser()
result = chain.invoke({
"topic": "machine learning",
"question": "Apa perbedaan supervised dan unsupervised learning?"
})
print(result)
Integrasi dengan LlamaIndex
from llamaindex.llms.groq import Groq as GroqLLM
from llama
index.core.llms import ChatMessage
llm = GroqLLM(model="llama-3.3-70b-versatile", apikey=os.environ["GROQAPIKEY"])
messages = [
ChatMessage(role="system", content="Kamu adalah asisten yang ahli dalam coding."),
ChatMessage(role="user", content="Tulis fungsi Python untuk binary search."),
]
response = llm.chat(messages)
print(response.message.content)
Membangun Aplikasi: AI Chatbot dengan FastAPI
Berikut contoh lengkap membangun chatbot API menggunakan Groq dan FastAPI:
from fastapi import FastAPI, HTTPException
from fastapi.responses import StreamingResponse
from pydantic import BaseModel
from groq import Groq
import json
app = FastAPI(title="Groq Chatbot API")
client = Groq()
class ChatRequest(BaseModel):
message: str
model: str = "llama-3.3-70b-versatile"
systemprompt: str = "Kamu adalah asisten AI yang membantu."
stream: bool = False
history: list[dict] = []
@app.post("/chat")
async def chat(request: ChatRequest):
messages = [{"role": "system", "content": request.systemprompt}]
messages.extend(request.history)
messages.append({"role": "user", "content": request.message})
if request.stream:
async def generate():
stream = client.chat.completions.create(
messages=messages,
model=request.model,
stream=True,
maxtokens=2048,
)
for chunk in stream:
content = chunk.choices[0].delta.content
if content:
yield f"data: {json.dumps({'content': content})}\n\n"
yield "data: [DONE]\n\n"
return StreamingResponse(generate(), mediatype="text/event-stream")
response = client.chat.completions.create(
messages=messages,
model=request.model,
maxtokens=2048,
)
return {
"response": response.choices[0].message.content,
"usage": {
"prompttokens": response.usage.prompttokens,
"completiontokens": response.usage.completiontokens,
"totaltokens": response.usage.totaltokens,
}
}
@app.get("/models")
async def listmodels():
models = client.models.list()
return {"models": [m.id for m in models.data]}
Jalankan server:
pip install fastapi uvicorn
uvicorn main:app --reload --port 8000
Best Practices
1. Pilih Model yang Tepat
Gunakan model sesuai kebutuhan untuk menghemat biaya dan meningkatkan kecepatan:
- Tugas sederhana (klasifikasi, ekstraksi, QA singkat):
llama-3.1-8b-instant - Tugas kompleks (reasoning, analisis, penulisan):
llama-3.3-70b-versatile - Tugas multilingual:
mixtral-8x7b-32768 - Analisis gambar:
llama-3.2-90b-vision-preview
2. Optimasi Prompt
# Buruk - terlalu panjang dan ambigu
badprompt = "Tolong bantu saya menganalisis data penjualan ini dan berikan insight yang berguna tentang apa yang bisa diperbaiki..."
Baik - spesifik dan terstruktur
goodprompt = """Analisis data penjualan berikut:
- Identifikasi 3 produk dengan performa terbaik
- Identifikasi 3 produk dengan penurunan terbesar
- Saran perbaikan untuk setiap produk yang menurun
Format output: JSON dengan key topproducts, decliningproducts, recommendations"""
3. Kelola Rate Limits
Groq memiliki rate limit berdasarkan tier. Strategi pengelolaan:
import time
from collections import deque
class RateLimiter:
def init(self, maxrequestsperminute=30):
self.maxrpm = maxrequestsperminute
self.requests = deque()
def waitifneeded(self):
now = time.time()
# Hapus request yang lebih dari 1 menit lalu
while self.requests and self.requests[0] < now - 60:
self.requests.popleft()
if len(self.requests) >= self.maxrpm:
sleeptime = 60 - (now - self.requests[0])
if sleeptime > 0:
print(f"Rate limit mendekati. Menunggu {sleeptime:.1f} detik...")
time.sleep(sleeptime)
self.requests.append(time.time())
limiter = RateLimiter(maxrequestsperminute=30)
def safecompletion(messages, kwargs):
limiter.waitifneeded()
return client.chat.completions.create(messages=messages, kwargs)
4. Caching untuk Efisiensi
import hashlib
import json
class SimpleCache:
def init(self):
self.cache = {}
def makekey(self, messages, model, temperature):
content = json.dumps({"messages": messages, "model": model,
"temperature": temperature}, sortkeys=True)
return hashlib.md5(content.encode()).hexdigest()
def getorcreate(self, messages, model="llama-3.3-70b-versatile",
temperature=0, kwargs):
key = self.makekey(messages, model, temperature)
if key in self.cache:
print("Cache hit!")
return self.cache[key]
response = client.chat.completions.create(
messages=messages,
model=model,
temperature=temperature,
kwargs
)
result = response.choices[0].message.content
self.cache[key] = result
return result
cache = SimpleCache()
5. Error Handling yang Baik
from groq import (
Groq,
APIError,
AuthenticationError,
RateLimitError,
BadRequestError,
)
def safechat(messages, model="llama-3.3-70b-versatile"):
try:
response = client.chat.completions.create(
messages=messages,
model=model,
maxtokens=1024,
)
return {
"success": True,
"content": response.choices[0].message.content,
"usage": response.usage,
}
except AuthenticationError:
return {"success": False, "error": "API key tidak valid."}
except RateLimitError:
return {"success": False, "error": "Rate limit tercapai. Coba lagi nanti."}
except BadRequestError as e:
return {"success": False, "error": f"Request tidak valid: {e}"}
except APIError as e:
return {"success": False, "error": f"API error: {e}"}
Perbandingan Groq dengan Provider Lain
| Fitur | Groq | OpenAI | Anthropic |
|-------|------|--------|-----------|
| Kecepatan Inferensi | Sangat cepat (LPU) | Standar (GPU) | Standar (GPU) |
| Model | Open-source (Llama, Mixtral) | GPT-4, GPT-4o | Claude |
| Harga | Kompetitif | Premium | Premium |
| Context Window | Hingga 128K | Hingga 128K | Hingga 200K |
| Function Calling | Ya | Ya | Ya |
| Vision | Ya (Llama Vision) | Ya (GPT-4o) | Ya (Claude) |
| Streaming | Ya | Ya | Ya |
| JSON Mode | Ya | Ya | Ya |
Conclusion
Groq API menawarkan solusi inferensi LLM yang sangat cepat dengan API yang mudah digunakan dan kompatibel dengan format OpenAI. Keunggulan utama Groq ada pada:
Dengan tutorial ini, Anda sudah memiliki fondasi yang kuat untuk membangun aplikasi AI menggunakan Groq API. Mulai dari penggunaan dasar hingga integrasi dengan framework populer dan best practices untuk produksi.
Langkah selanjutnya yang bisa Anda eksplorasi:
- Implementasi RAG (Retrieval-Augmented Generation) menggunakan Groq
- Membangun multi-agent system dengan Groq sebagai backbone
- Optimasi cost dengan model routing berdasarkan kompleksitas task
- Monitoring dan observability untuk aplikasi Groq di produksi