Tutorial Lengkap NVIDIA NIM: Deploy Model AI dengan Performa Maksimal

# Tutorial Lengkap NVIDIA NIM (NVIDIA Inference Microservices) untuk Developer Indonesia **Penulis: Ruby Abdullah** **Tanggal: 27 September 2026** ## 1. Pendahuluan NVIDIA NIM (NVIDIA Inference Mic...

By Ruby Abdullah · · tutorial
NVIDIA NIMAI DeploymentLLM InferenceDockerGPU

Tutorial Lengkap NVIDIA NIM (NVIDIA Inference Microservices) untuk Developer Indonesia

Penulis: Ruby Abdullah Tanggal: 27 September 2026

1. Pendahuluan

NVIDIA NIM (NVIDIA Inference Microservices) adalah platform inferensi AI yang dikembangkan oleh NVIDIA untuk mempermudah deployment model-model AI dalam skala produksi. NIM menyediakan container microservice yang sudah dioptimasi untuk menjalankan model-model AI populer seperti Llama 3.1, Mistral, Gemma, dan banyak lagi, dengan performa inferensi yang sangat tinggi berkat optimasi GPU langsung dari NVIDIA.

Mengapa NVIDIA NIM Penting?

Dalam ekosistem AI saat ini, salah satu tantangan terbesar bukan lagi melatih model, melainkan men-deploy model tersebut ke produksi dengan efisien. NVIDIA NIM hadir untuk menjawab tantangan ini dengan beberapa keunggulan utama:

  • Kecepatan Inferensi Terdepan: NIM menggunakan TensorRT-LLM sebagai backend inferensi, yang memberikan throughput hingga 3-5x lebih cepat dibandingkan framework inferensi standar seperti vLLM atau text-generation-inference pada hardware yang sama.
  • Optimasi GPU Native: Karena dikembangkan langsung oleh NVIDIA, NIM memanfaatkan setiap fitur hardware GPU NVIDIA secara maksimal, termasuk Tensor Cores, FP8 quantization pada GPU Hopper (H100), dan multi-GPU inference dengan NVLink.
  • Kompatibilitas OpenAI API: NIM menggunakan format API yang kompatibel dengan OpenAI API, sehingga migrasi dari OpenAI ke NIM sangat mudah. Anda cukup mengganti base URL dan API key tanpa mengubah kode aplikasi.
  • Dukungan Model Populer: NIM mendukung ratusan model dari berbagai penyedia, termasuk Meta Llama 3.1 (8B, 70B, 405B), Mistral, Google Gemma, Microsoft Phi, dan model-model khusus untuk embedding, vision, serta speech.
  • Fleksibilitas Deployment: Anda bisa menggunakan NIM melalui cloud API gratis di build.nvidia.com untuk prototyping, atau men-deploy container NIM di infrastruktur sendiri (on-premise atau cloud) untuk produksi.
  • NIM vs Alternatif Lain

    | Fitur | NVIDIA NIM | vLLM | Ollama | OpenAI API |

    |-------|-----------|------|--------|------------|

    | Kecepatan Inferensi | Sangat Tinggi (TensorRT-LLM) | Tinggi | Sedang | Tinggi |

    | Self-Hosted | Ya | Ya | Ya | Tidak |

    | Cloud API Gratis | Ya (build.nvidia.com) | Tidak | Tidak | Tidak (berbayar) |

    | OpenAI Compatible | Ya | Ya | Ya | Ya (native) |

    | Multi-GPU Support | Excellent | Baik | Terbatas | N/A |

    | Enterprise Support | Ya (NVIDIA AI Enterprise) | Community | Community | Ya |

    | Optimasi FP8/INT4 | Built-in | Plugin | Terbatas | N/A |

    2. Prasyarat dan Setup

    2.1 Membuat Akun NVIDIA NGC

    Langkah pertama adalah membuat akun di NVIDIA NGC (NVIDIA GPU Cloud), yang merupakan portal utama untuk mengakses semua layanan NVIDIA AI.

  • Kunjungi https://build.nvidia.com
  • Klik Sign In atau Create Account
  • Anda bisa mendaftar menggunakan email atau akun Google/GitHub
  • Setelah login, Anda akan mendapatkan akses ke dashboard NIM
  • 2.2 Mendapatkan API Key

    Setelah memiliki akun, Anda perlu mendapatkan API key untuk mengakses NIM endpoints:

  • Masuk ke https://build.nvidia.com
  • Pilih salah satu model (misalnya Llama 3.1 8B Instruct)
  • Klik tab "API" pada halaman model
  • Klik tombol "Get API Key" atau "Generate Key"
  • Salin API key yang dihasilkan (format: nvapi-xxxxxxxxxxxx)
  • Simpan API key ini dengan aman, karena tidak akan ditampilkan lagi
  • Anda juga bisa mengelola API key melalui NGC dashboard di https://org.ngc.nvidia.com.

    2.3 Instalasi Python SDK

    Untuk menggunakan NIM dari Python, Anda memerlukan beberapa package. Karena NIM kompatibel dengan OpenAI API, Anda bisa menggunakan OpenAI Python SDK:

    # Instalasi OpenAI SDK (kompatibel dengan NIM)
    

    pip install openai

    Instalasi LangChain NVIDIA integration (opsional, untuk workflow LangChain)

    pip install langchain-nvidia-ai-endpoints

    Instalasi requests untuk HTTP calls langsung (opsional)

    pip install requests

    Instalasi httpx untuk async calls (opsional)

    pip install httpx

    2.4 Konfigurasi Environment Variable

    Simpan API key sebagai environment variable agar tidak ter-expose di kode:

    # Linux/Mac
    

    export NVIDIAAPIKEY="nvapi-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    Windows (PowerShell)

    $env:NVIDIAAPIKEY = "nvapi-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    Atau simpan di file .env

    echo 'NVIDIAAPIKEY=nvapi-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' >> .env

    3. Penggunaan Dasar: Cloud API

    NVIDIA menyediakan akses gratis ke NIM endpoints melalui build.nvidia.com. Ini sangat cocok untuk prototyping, testing, dan pengembangan awal sebelum beralih ke deployment self-hosted.

    3.1 Text Generation dengan cURL

    Contoh paling sederhana adalah melakukan text generation menggunakan cURL. NIM menggunakan format yang identik dengan OpenAI Chat Completions API:

    # Text generation dengan Llama 3.1 8B Instruct
    

    curl -s https://integrate.api.nvidia.com/v1/chat/completions \

    -H "Content-Type: application/json" \

    -H "Authorization: Bearer $NVIDIAAPIKEY" \

    -d '{

    "model": "meta/llama-3.1-8b-instruct",

    "messages": [

    {

    "role": "system",

    "content": "Kamu adalah asisten AI yang membantu developer Indonesia. Jawab dalam Bahasa Indonesia yang jelas dan teknis."

    },

    {

    "role": "user",

    "content": "Jelaskan perbedaan antara REST API dan GraphQL secara singkat."

    }

    ],

    "temperature": 0.7,

    "maxtokens": 1024

    }'

    3.2 Text Generation dengan Python (OpenAI SDK)

    Karena NIM kompatibel dengan OpenAI API, Anda bisa langsung menggunakan library openai di Python:

    import os
    

    from openai import OpenAI

    Inisialisasi client dengan base URL NIM

    client = OpenAI(

    baseurl="https://integrate.api.nvidia.com/v1",

    apikey=os.environ.get("NVIDIAAPIKEY")

    )

    Chat completion - contoh chatbot Bahasa Indonesia

    response = client.chat.completions.create(

    model="meta/llama-3.1-8b-instruct",

    messages=[

    {

    "role": "system",

    "content": "Kamu adalah asisten AI untuk developer Indonesia. "

    "Berikan jawaban yang praktis dan mudah dipahami."

    },

    {

    "role": "user",

    "content": "Bagaimana cara membuat REST API sederhana dengan FastAPI?"

    }

    ],

    temperature=0.7,

    maxtokens=1024

    )

    print(response.choices[0].message.content)

    3.3 Embedding Generation

    NIM juga menyediakan model embedding untuk keperluan semantic search, RAG (Retrieval-Augmented Generation), dan clustering teks:

    import os
    

    from openai import OpenAI

    client = OpenAI(

    baseurl="https://integrate.api.nvidia.com/v1",

    apikey=os.environ.get("NVIDIAAPIKEY")

    )

    Generate embeddings untuk teks Bahasa Indonesia

    texts = [

    "Cara memasak rendang yang enak dan autentik",

    "Resep gulai kambing khas Padang",

    "Tutorial pemrograman Python untuk pemula",

    "Panduan deployment aplikasi ke cloud server"

    ]

    response = client.embeddings.create(

    model="nvidia/nv-embedqa-e5-v5",

    input=texts,

    encodingformat="float"

    )

    Menampilkan dimensi embedding dan beberapa nilai pertama

    for i, embeddingdata in enumerate(response.data):

    vector = embeddingdata.embedding

    print(f"Teks: '{texts[i][:50]}...'")

    print(f" Dimensi: {len(vector)}")

    print(f" 5 nilai pertama: {vector[:5]}")

    print()

    Menghitung similarity antara dua teks

    import numpy as np

    def cosinesimilarity(veca, vecb):

    a = np.array(veca)

    b = np.array(vecb)

    return np.dot(a, b) / (np.linalg.norm(a) np.linalg.norm(b))

    Bandingkan similarity teks kuliner vs teks programming

    simkuliner = cosinesimilarity(

    response.data[0].embedding,

    response.data[1].embedding

    )

    simbeda = cosinesimilarity(

    response.data[0].embedding,

    response.data[2].embedding

    )

    print(f"Similarity rendang vs gulai: {simkuliner:.4f}")

    print(f"Similarity rendang vs Python: {simbeda:.4f}")

    3.4 Vision Model (Multimodal)

    NIM mendukung model vision yang bisa memproses gambar bersamaan dengan teks. Ini sangat berguna untuk analisis gambar, OCR, dan visual question answering:

    import os
    

    import base64

    from openai import OpenAI

    client = OpenAI(

    baseurl="https://integrate.api.nvidia.com/v1",

    apikey=os.environ.get("NVIDIAAPIKEY")

    )

    Encode gambar lokal ke base64

    def encodeimage(imagepath):

    with open(imagepath, "rb") as f:

    return base64.b64encode(f.read()).decode("utf-8")

    Contoh 1: Analisis gambar dari URL

    response = client.chat.completions.create(

    model="meta/llama-3.2-90b-vision-instruct",

    messages=[

    {

    "role": "user",

    "content": [

    {

    "type": "text",

    "text": "Jelaskan apa yang ada di gambar ini dalam Bahasa Indonesia."

    },

    {

    "type": "imageurl",

    "imageurl": {

    "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/1200px-Cat03.jpg"

    }

    }

    ]

    }

    ],

    maxtokens=512

    )

    print("Deskripsi gambar:")

    print(response.choices[0].message.content)

    Contoh 2: Analisis gambar dari file lokal

    imagebase64 = encodeimage("screenshot.png")

    response = client.chat.completions.create(

    model="meta/llama-3.2-90b-vision-instruct",

    messages=[

    {

    "role": "user",

    "content": [

    {"type": "text", "text": "Apa yang tertulis di gambar ini?"},

    {

    "type": "imageurl",

    "imageurl": {

    "url": f"data:image/png;base64,{imagebase64}"

    }

    }

    ]

    }

    ],

    maxtokens=512

    )

    3.5 Format Request dan Response

    NIM mengikuti format OpenAI API secara ketat. Berikut struktur lengkap request dan response:

    Request Body:
    {
    

    "model": "meta/llama-3.1-8b-instruct",

    "messages": [

    {"role": "system", "content": "System prompt di sini"},

    {"role": "user", "content": "Pertanyaan user"},

    {"role": "assistant", "content": "Jawaban sebelumnya (untuk multi-turn)"},

    {"role": "user", "content": "Pertanyaan lanjutan"}

    ],

    "temperature": 0.7,

    "maxtokens": 1024,

    "topp": 0.9,

    "stream": false,

    "stop": ["\n\n"],

    "frequencypenalty": 0.0,

    "presencepenalty": 0.0

    }

    Response Body:
    {
    

    "id": "chatcmpl-xxxxxxxx",

    "object": "chat.completion",

    "created": 1727388000,

    "model": "meta/llama-3.1-8b-instruct",

    "choices": [

    {

    "index": 0,

    "message": {

    "role": "assistant",

    "content": "Jawaban dari model..."

    },

    "finishreason": "stop"

    }

    ],

    "usage": {

    "prompttokens": 45,

    "completiontokens": 128,

    "totaltokens": 173

    }

    }

    4. Penggunaan Lanjutan: Self-Hosted dengan Docker

    Untuk penggunaan produksi dengan volume tinggi, kontrol penuh atas data, atau kebutuhan latensi rendah, Anda bisa men-deploy NIM container di infrastruktur sendiri.

    4.1 Prasyarat Self-Hosted

    Sebelum memulai deployment self-hosted, pastikan Anda memiliki:

    • GPU NVIDIA: Minimal GPU dengan VRAM yang cukup untuk model yang dipilih (misalnya, Llama 3.1 8B membutuhkan minimal 1x GPU 24GB seperti RTX 4090 atau A10G)
    • NVIDIA Driver: Versi 535.129.03 atau lebih baru
    • Docker: Versi 24.0 atau lebih baru
    • NVIDIA Container Toolkit: Untuk mengaktifkan akses GPU di dalam container Docker
    • NGC API Key: Untuk mengunduh container dari NGC registry

    4.2 Instalasi NVIDIA Container Toolkit

    # Tambahkan repository NVIDIA Container Toolkit
    

    curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \

    sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

    curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \

    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \

    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

    Instalasi toolkit

    sudo apt-get update

    sudo apt-get install -y nvidia-container-toolkit

    Konfigurasi Docker runtime

    sudo nvidia-ctk runtime configure --runtime=docker

    sudo systemctl restart docker

    Verifikasi instalasi

    docker run --rm --gpus all nvidia/cuda:12.3.1-base-ubuntu22.04 nvidia-smi

    4.3 Login ke NGC Registry

    # Login ke NGC container registry
    

    echo "$NGCAPIKEY" | docker login nvcr.io --username '$oauthtoken' --password-stdin

    4.4 Deploy NIM Container

    Berikut cara men-deploy NIM container untuk model Llama 3.1 8B Instruct:

    # Set environment variables
    

    export NGCAPIKEY="nvapi-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    export LOCALNIMCACHE="$HOME/.cache/nim"

    mkdir -p "$LOCALNIMCACHE"

    Deploy NIM container untuk Llama 3.1 8B Instruct

    docker run -d \

    --name nim-llama31-8b \

    --gpus all \

    --shm-size=16g \

    -e NGCAPIKEY="$NGCAPIKEY" \

    -v "$LOCALNIMCACHE:/opt/nim/.cache" \

    -p 8000:8000 \

    nvcr.io/nim/meta/llama-3.1-8b-instruct:latest

    Tunggu container siap (biasanya 2-5 menit untuk download dan load model)

    Cek status container

    docker logs -f nim-llama31-8b

    4.5 Verifikasi Deployment

    Setelah container berjalan, verifikasi bahwa NIM endpoint sudah siap:

    # Health check
    

    curl -s http://localhost:8000/v1/health/ready

    Lihat model yang tersedia

    curl -s http://localhost:8000/v1/models | python3 -m json.tool

    Test inferensi

    curl -s http://localhost:8000/v1/chat/completions \

    -H "Content-Type: application/json" \

    -d '{

    "model": "meta/llama-3.1-8b-instruct",

    "messages": [

    {"role": "user", "content": "Halo! Siapa kamu?"}

    ],

    "maxtokens": 256

    }'

    4.6 Konfigurasi GPU dan Model

    Anda bisa mengatur konfigurasi GPU secara spesifik untuk optimasi performa:

    # Deploy dengan GPU tertentu (misalnya hanya GPU 0 dan 1)
    

    docker run -d \

    --name nim-llama31-70b \

    --gpus '"device=0,1"' \

    --shm-size=32g \

    -e NGCAPIKEY="$NGCAPIKEY" \

    -e NIMMAXMODELLEN=8192 \

    -e NIMTENSORPARALLELSIZE=2 \

    -v "$LOCALNIMCACHE:/opt/nim/.cache" \

    -p 8000:8000 \

    nvcr.io/nim/meta/llama-3.1-70b-instruct:latest

    Parameter penting yang bisa dikonfigurasi:

    | Environment Variable | Deskripsi | Default |

    |---------------------|-----------|---------|

    | NIMMAXMODELLEN | Panjang konteks maksimal | Model default |

    | NIMTENSORPARALLELSIZE | Jumlah GPU untuk tensor parallelism | 1 |

    | NIMMAXBATCHSIZE | Ukuran batch maksimal | Auto |

    | NIMGPUMEMORYUTILIZATION | Persentase VRAM yang digunakan | 0.9 |

    | NIMLOGLEVEL | Level logging (DEBUG, INFO, WARNING) | INFO |

    4.7 Docker Compose untuk Multi-Model Deployment

    Untuk menjalankan beberapa model sekaligus, gunakan Docker Compose:

    # docker-compose.yml
    

    version: '3.8'

    services:

    nim-llama-8b:

    image: nvcr.io/nim/meta/llama-3.1-8b-instruct:latest

    containername: nim-llama-8b

    runtime: nvidia

    environment:

    • NGCAPIKEY=${NGCAPIKEY}
    • NIMMAXMODELLEN=4096
    • NVIDIAVISIBLEDEVICES=0
    volumes:

    • nim-cache:/opt/nim/.cache
    ports:

    • "8001:8000"
    shm
    size: '16g'

    deploy:

    resources:

    reservations:

    devices:

    • driver: nvidia
    count: 1

    capabilities: [gpu]

    nim-embedding:

    image: nvcr.io/nim/nvidia/nv-embedqa-e5-v5:latest

    containername: nim-embedding

    runtime: nvidia

    environment:

    • NGCAPIKEY=${NGCAPIKEY}
    • NVIDIAVISIBLEDEVICES=1
    volumes:

    • nim-cache:/opt/nim/.cache
    ports:

    • "8002:8000"
    shm
    size: '8g'

    deploy:

    resources:

    reservations:

    devices:

    • driver: nvidia
    count: 1

    capabilities: [gpu]

    nginx-lb:

    image: nginx:alpine

    containername: nim-loadbalancer

    ports:

    • "80:80"
    volumes:

    • ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends
    on:

    • nim-llama-8b
    • nim-embedding

    volumes:

    nim-cache:

    4.8 Monitoring dan Health Checks

    NIM menyediakan endpoint monitoring built-in yang bisa diintegrasikan dengan Prometheus dan Grafana:

    # Health check endpoint
    

    curl http://localhost:8000/v1/health/ready

    Response: {"status": "ready"}

    Metrics endpoint (format Prometheus)

    curl http://localhost:8000/metrics

    Contoh script monitoring sederhana

    #!/bin/bash

    while true; do

    STATUS=$(curl -s -o /dev/null -w "%{httpcode}" http://localhost:8000/v1/health/ready)

    if [ "$STATUS" != "200" ]; then

    echo "[$(date)] WARNING: NIM tidak merespons (HTTP $STATUS)"

    # Kirim notifikasi ke Telegram atau Slack

    else

    echo "[$(date)] OK: NIM berjalan normal"

    fi

    sleep 30

    done

    5. Integrasi dengan Python

    5.1 Menggunakan OpenAI Python SDK

    Cara paling mudah mengintegrasikan NIM ke aplikasi Python adalah menggunakan OpenAI SDK, karena NIM sepenuhnya kompatibel:

    import os
    

    from openai import OpenAI

    Untuk cloud API (build.nvidia.com)

    cloudclient = OpenAI(

    baseurl="https://integrate.api.nvidia.com/v1",

    apikey=os.environ.get("NVIDIAAPIKEY")

    )

    Untuk self-hosted NIM

    localclient = OpenAI(

    baseurl="http://localhost:8000/v1",

    apikey="not-used" # Self-hosted tidak memerlukan API key

    )

    def chatwithnim(client, usermessage, systemprompt=None):

    """Fungsi helper untuk chat dengan NIM."""

    messages = []

    if systemprompt:

    messages.append({"role": "system", "content": systemprompt})

    messages.append({"role": "user", "content": usermessage})

    response = client.chat.completions.create(

    model="meta/llama-3.1-8b-instruct",

    messages=messages,

    temperature=0.7,

    maxtokens=1024

    )

    return response.choices[0].message.content

    Contoh penggunaan: Chatbot customer service Bahasa Indonesia

    systemprompt = """Kamu adalah asisten customer service untuk toko online Indonesia.

    Jawab pertanyaan pelanggan dengan sopan, ramah, dan profesional dalam Bahasa Indonesia.

    Jika ditanya tentang status pesanan, minta nomor pesanan mereka."""

    jawaban = chatwithnim(

    cloudclient,

    "Saya mau tanya, pesanan saya sudah sampai mana ya?",

    systemprompt

    )

    print(jawaban)

    5.2 Streaming Responses

    Untuk pengalaman pengguna yang lebih baik, gunakan streaming agar response ditampilkan secara bertahap:

    import os
    

    from openai import OpenAI

    client = OpenAI(

    baseurl="https://integrate.api.nvidia.com/v1",

    apikey=os.environ.get("NVIDIAAPIKEY")

    )

    def streamchat(usermessage):

    """Stream response dari NIM untuk UX yang lebih responsif."""

    stream = client.chat.completions.create(

    model="meta/llama-3.1-8b-instruct",

    messages=[

    {

    "role": "system",

    "content": "Kamu adalah penulis teknis yang ahli dalam teknologi AI."

    },

    {"role": "user", "content": usermessage}

    ],

    temperature=0.7,

    maxtokens=2048,

    stream=True # Aktifkan streaming

    )

    fullresponse = ""

    for chunk in stream:

    if chunk.choices[0].delta.content is not None:

    content = chunk.choices[0].delta.content

    print(content, end="", flush=True)

    fullresponse += content

    print() # Newline setelah streaming selesai

    return fullresponse

    Contoh: Generate artikel teknis

    response = streamchat(

    "Tulis penjelasan singkat tentang bagaimana transformer bekerja "

    "untuk audience developer Indonesia yang baru belajar AI."

    )

    5.3 Menggunakan LangChain NVIDIA AI Endpoints

    Jika Anda sudah menggunakan LangChain, ada integrasi khusus untuk NVIDIA NIM:

    import os
    

    from langchainnvidiaaiendpoints import ChatNVIDIA, NVIDIAEmbeddings

    from langchaincore.messages import HumanMessage, SystemMessage

    Inisialisasi chat model

    llm = ChatNVIDIA(

    model="meta/llama-3.1-8b-instruct",

    nvidiaapikey=os.environ.get("NVIDIAAPIKEY"),

    temperature=0.7,

    maxtokens=1024

    )

    Chat sederhana

    messages = [

    SystemMessage(content="Kamu adalah asisten coding untuk developer Indonesia."),

    HumanMessage(content="Buatkan contoh fungsi Python untuk validasi NIK (KTP).")

    ]

    response = llm.invoke(messages)

    print(response.content)

    Inisialisasi embedding model

    embeddings = NVIDIAEmbeddings(

    model="nvidia/nv-embedqa-e5-v5",

    nvidiaapikey=os.environ.get("NVIDIAAPIKEY")

    )

    Generate embeddings

    texts = [

    "Panduan penggunaan e-commerce di Indonesia",

    "Tutorial membuat website dengan Django",

    "Resep masakan tradisional Nusantara"

    ]

    vectors = embeddings.embeddocuments(texts)

    print(f"Jumlah vectors: {len(vectors)}")

    print(f"Dimensi per vector: {len(vectors[0])}")

    Contoh: RAG pipeline sederhana dengan NVIDIA NIM

    from langchaincore.prompts import ChatPromptTemplate

    from langchaincore.outputparsers import StrOutputParser

    Template prompt untuk RAG

    ragprompt = ChatPromptTemplate.frommessages([

    ("system", """Kamu adalah asisten yang menjawab pertanyaan berdasarkan konteks yang diberikan.

    Jawab HANYA berdasarkan informasi dalam konteks. Jika konteks tidak memuat jawaban, katakan 'Maaf, informasi tidak tersedia.'

    Konteks:

    {context}"""),

    ("user", "{question}")

    ])

    Chain

    chain = ragprompt | llm | StrOutputParser()

    Jalankan chain

    result = chain.invoke({

    "context": "PT RUBYTHALIB DATA KONSULTA adalah perusahaan konsultan AI yang berlokasi di SCBD, Jakarta Selatan. Perusahaan ini menyediakan layanan konsultasi AI, pelatihan, dan pengembangan solusi AI custom.",

    "question": "Di mana lokasi PT RUBYTHALIB DATA KONSULTA?"

    })

    print(result)

    5.4 Function Calling / Tool Use

    NIM mendukung function calling yang memungkinkan model memanggil fungsi eksternal:

    import os
    

    import json

    from openai import OpenAI

    client = OpenAI(

    baseurl="https://integrate.api.nvidia.com/v1",

    apikey=os.environ.get("NVIDIAAPIKEY")

    )

    Definisikan tools/functions

    tools = [

    {

    "type": "function",

    "function": {

    "name": "cekcuaca",

    "description": "Mengecek kondisi cuaca di suatu kota di Indonesia",

    "parameters": {

    "type": "object",

    "properties": {

    "kota": {

    "type": "string",

    "description": "Nama kota, misalnya Jakarta, Surabaya, Bandung"

    },

    "satuan": {

    "type": "string",

    "enum": ["celsius", "fahrenheit"],

    "description": "Satuan suhu"

    }

    },

    "required": ["kota"]

    }

    }

    },

    {

    "type": "function",

    "function": {

    "name": "konversimatauang",

    "description": "Konversi mata uang dari IDR ke mata uang lain",

    "parameters": {

    "type": "object",

    "properties": {

    "jumlah": {

    "type": "number",

    "description": "Jumlah uang dalam Rupiah (IDR)"

    },

    "matauangtujuan": {

    "type": "string",

    "description": "Kode mata uang tujuan (USD, EUR, SGD, dll)"

    }

    },

    "required": ["jumlah", "matauangtujuan"]

    }

    }

    }

    ]

    Simulasi fungsi

    def cekcuaca(kota, satuan="celsius"):

    # Dalam produksi, ini akan memanggil API cuaca sungguhan

    datacuaca = {

    "Jakarta": {"suhu": 32, "kondisi": "Cerah berawan"},

    "Bandung": {"suhu": 24, "kondisi": "Hujan ringan"},

    "Surabaya": {"suhu": 34, "kondisi": "Cerah"},

    }

    return json.dumps(datacuaca.get(kota, {"suhu": 28, "kondisi": "Data tidak tersedia"}))

    def konversimatauang(jumlah, matauangtujuan):

    kurs = {"USD": 15500, "EUR": 17000, "SGD": 11500}

    rate = kurs.get(matauangtujuan, 15000)

    hasil = jumlah / rate

    return json.dumps({"hasil": round(hasil, 2), "matauang": matauangtujuan})

    Kirim request dengan tools

    response = client.chat.completions.create(

    model="meta/llama-3.1-8b-instruct",

    messages=[

    {"role": "user", "content": "Berapa cuaca di Jakarta hari ini?"}

    ],

    tools=tools,

    toolchoice="auto"

    )

    Proses tool calls

    message = response.choices[0].message

    if message.toolcalls:

    for toolcall in message.toolcalls:

    functionname = toolcall.function.name

    arguments = json.loads(toolcall.function.arguments)

    # Eksekusi fungsi yang diminta

    if functionname == "cekcuaca":

    result = cekcuaca(arguments)

    elif functionname == "konversimatauang":

    result = konversimatauang(arguments)

    print(f"Function: {functionname}")

    print(f"Arguments: {arguments}")

    print(f"Result: {result}")

    5.5 Batch Processing

    Untuk memproses banyak request secara efisien, gunakan async atau batch processing:

    import os
    

    import asyncio

    from openai import AsyncOpenAI

    client = AsyncOpenAI(

    baseurl="https://integrate.api.nvidia.com/v1",

    apikey=os.environ.get("NVIDIAAPIKEY")

    )

    async def processsingle(prompt, index):

    """Proses satu prompt dan kembalikan hasilnya."""

    try:

    response = await client.chat.completions.create(

    model="meta/llama-3.1-8b-instruct",

    messages=[

    {

    "role": "system",

    "content": "Kamu adalah penerjemah profesional Indonesia-Inggris."

    },

    {"role": "user", "content": f"Terjemahkan ke Bahasa Inggris: {prompt}"}

    ],

    temperature=0.3,

    maxtokens=512

    )

    return {

    "index": index,

    "input": prompt,

    "output": response.choices[0].message.content,

    "tokens": response.usage.totaltokens

    }

    except Exception as e:

    return {"index": index, "input": prompt, "error": str(e)}

    async def batchtranslate(texts, maxconcurrent=5):

    """Batch processing dengan concurrency limit."""

    semaphore = asyncio.Semaphore(maxconcurrent)

    async def limitedprocess(prompt, index):

    async with semaphore:

    return await processsingle(prompt, index)

    tasks = [limitedprocess(text, i) for i, text in enumerate(texts)]

    results = await asyncio.gather(tasks)

    return sorted(results, key=lambda x: x["index"])

    Contoh: Batch translate teks Bahasa Indonesia

    textstotranslate = [

    "Selamat pagi, apa kabar?",

    "Saya sedang belajar pemrograman Python.",

    "Indonesia adalah negara kepulauan terbesar di dunia.",

    "Teknologi kecerdasan buatan semakin berkembang pesat.",

    "Jakarta merupakan ibu kota Indonesia yang padat penduduk.",

    "Kami menyediakan layanan konsultasi AI untuk perusahaan.",

    "Rendang adalah makanan terenak di dunia menurut CNN.",

    "Startup teknologi di Indonesia tumbuh dengan sangat cepat."

    ]

    Jalankan batch processing

    results = asyncio.run(batchtranslate(textstotranslate))

    for r in results:

    if "error" in r:

    print(f"[ERROR] {r['input']}: {r['error']}")

    else:

    print(f"ID: {r['input']}")

    print(f"EN: {r['output']}")

    print(f"Tokens: {r['tokens']}")

    print()

    6. Best Practices

    6.1 Pemilihan Model yang Tepat

    Memilih model yang sesuai dengan kebutuhan sangat penting untuk mengoptimalkan biaya dan performa:

    | Use Case | Model Rekomendasi | Alasan |

    |----------|------------------|--------|

    | Chatbot umum | Llama 3.1 8B Instruct | Cepat, ringan, cukup untuk percakapan umum |

    | Analisis dokumen kompleks | Llama 3.1 70B Instruct | Pemahaman konteks lebih baik |

    | Code generation | Llama 3.1 8B/70B Instruct | Baik untuk coding tasks |

    | Embedding / Search | NV-EmbedQA-E5-v5 | Dioptimasi untuk retrieval |

    | Analisis gambar | Llama 3.2 90B Vision | Multimodal capabilities |

    | Task sederhana (klasifikasi, ekstraksi) | Llama 3.1 8B | Hemat resource |

    Prinsip utama: Mulai dengan model terkecil yang memenuhi kebutuhan, lalu upgrade jika kualitas output tidak memadai.

    6.2 Optimasi Latency dan Throughput

    # 1. Gunakan maxtokens yang tepat (jangan terlalu besar)
    

    response = client.chat.completions.create(

    model="meta/llama-3.1-8b-instruct",

    messages=[{"role": "user", "content": "Jawab dalam 1 kalimat: Apa itu AI?"}],

    maxtokens=100 # Sesuaikan dengan ekspektasi panjang jawaban

    )

    2. Gunakan temperature rendah untuk task deterministik

    response = client.chat.completions.create(

    model="meta/llama-3.1-8b-instruct",

    messages=[{"role": "user", "content": "Ekstrak nama dan email dari teks ini: ..."}],

    temperature=0.1, # Rendah untuk konsistensi

    maxtokens=256

    )

    3. Gunakan stop sequences untuk menghentikan generasi lebih awal

    response = client.chat.completions.create(

    model="meta/llama-3.1-8b-instruct",

    messages=[{"role": "user", "content": "Berikan 3 poin utama tentang AI:"}],

    stop=["\n4.", "\n\n\n"], # Berhenti setelah 3 poin

    maxtokens=512

    )

    6.3 Caching Strategies

    Implementasikan caching untuk mengurangi panggilan API yang redundan:

    import hashlib
    

    import json

    import os

    from functools import lrucache

    Simple in-memory cache

    class NIMCache:

    def init(self, cachedir="./nimcache"):

    self.cachedir = cachedir

    os.makedirs(cachedir, existok=True)

    def getcachekey(self, model, messages, temperature):

    """Generate cache key dari parameter request."""

    content = json.dumps({

    "model": model,

    "messages": messages,

    "temperature": temperature

    }, sortkeys=True)

    return hashlib.sha256(content.encode()).hexdigest()

    def get(self, model, messages, temperature):

    """Ambil response dari cache jika ada."""

    key = self.getcachekey(model, messages, temperature)

    cachefile = os.path.join(self.cachedir, f"{key}.json")

    if os.path.exists(cachefile):

    with open(cachefile, "r") as f:

    return json.load(f)

    return None

    def set(self, model, messages, temperature, response):

    """Simpan response ke cache."""

    key = self.getcachekey(model, messages, temperature)

    cachefile = os.path.join(self.cachedir, f"{key}.json")

    with open(cachefile, "w") as f:

    json.dump(response, f)

    cache = NIMCache()

    def cachedchat(client, model, messages, temperature=0.7, maxtokens=1024):

    """Chat dengan caching untuk menghindari request duplikat."""

    # Cek cache (hanya untuk temperature rendah / deterministik)

    if temperature < 0.3:

    cached = cache.get(model, messages, temperature)

    if cached:

    print("[CACHE HIT]")

    return cached

    response = client.chat.completions.create(

    model=model,

    messages=messages,

    temperature=temperature,

    maxtokens=maxtokens

    )

    result = response.choices[0].message.content

    if temperature < 0.3:

    cache.set(model, messages, temperature, result)

    return result

    6.4 Error Handling dan Retry

    Implementasi error handling yang robust untuk aplikasi produksi:

    import time
    

    import os

    from openai import OpenAI, APIError, RateLimitError, APIConnectionError

    client = OpenAI(

    baseurl="https://integrate.api.nvidia.com/v1",

    apikey=os.environ.get("NVIDIAAPIKEY")

    )

    def chatwithretry(messages, maxretries=3, initialdelay=1.0):

    """

    Kirim request ke NIM dengan retry mechanism.

    Artikel Terkait

    Tutorial Docker untuk Data Science & ML: Containerisasi Model

    Tutorial 15: Docker untuk Data Science dan Machine Learning Daftar Isi Pendahuluan Prasyarat Dasar-Dasar Docker untuk In...

    RAGFlow: Bikin RAG Engine yang Ngerti Dokumen Beneran, Lengkap dengan Sitasi

    RAGFlow: Bikin RAG Engine yang Ngerti Dokumen Beneran, Lengkap dengan Sitasi Halo temen-temen, balik lagi sama aku. Kala...

    Tutorial SkyPilot: Menjalankan Workload ML di Cloud Mana Saja

    SkyPilot: Menjalankan Beban Kerja ML dan AI di Cloud Apa Pun Melatih dan menyajikan model machine learning sering kali b...

    Tutorial Text Generation Inference (TGI): Serving LLM untuk Produksi

    Menyajikan LLM di Produksi dengan Text Generation Inference (TGI) Text Generation Inference (TGI) adalah toolkit buatan ...