Section 6/141 menit

6. Prompt Engineering untuk On-Device Models

6. Prompt Engineering untuk On-Device Models

Karakteristik Model On-Device vs Cloud

Model Apple Intelligence yang berjalan on-device lebih kecil dari model cloud seperti GPT-4 atau Claude. Ini memiliki implikasi langsung pada cara menulis prompt:

Aspek Model On-Device Model Cloud Besar
Ukuran konteks Lebih terbatas Lebih besar
Reasoning kompleks Lebih terbatas Lebih kuat
Bahasa alami Sangat baik Sangat baik
Format output ketat Sangat baik (via @Generable) Baik
Kecepatan Sangat cepat (lokal) Lebih lambat (network)
Privasi Sepenuhnya privat Data ke server

Teknik Prompt yang Efektif untuk On-Device

1. Instruksi yang Spesifik dan Singkat

swift
// ❌ Instruksi ambigu dan panjang
let badInstructions = """
Kamu adalah asisten yang sangat cerdas dan berpengalaman dalam berbagai bidang ilmu pengetahuan, 
teknologi, seni, bisnis, dan kehidupan sehari-hari. Kamu selalu berusaha memberikan jawaban 
yang komprehensif, informatif, dan berguna untuk pengguna dari berbagai latar belakang...
"""

// ✓ Instruksi spesifik dan terfokus
let goodInstructions = """
Kamu asisten belanja. Bantu pengguna membandingkan produk dan buat keputusan pembelian.
Respons maksimal 3 kalimat. Selalu sebutkan harga jika relevan.
"""

2. One-Shot dan Few-Shot Examples dalam Prompt

swift
func buildExtractionPrompt(for text: String) -> String {
    // Few-shot: berikan contoh sebelum meminta model mengerjakan task
    return """
    Ekstrak informasi kontak dari teks. Format output sesuai yang diminta.
    
    Contoh input: "Hubungi Budi Santoso di 0812-3456-7890 atau email budi@gmail.com"
    Contoh output yang diharapkan: nama=Budi Santoso, phone=081234567890, email=budi@gmail.com
    
    Sekarang ekstrak dari teks berikut:
    "\(text)"
    """
}

3. Decomposisi Task Kompleks

swift
// ❌ Satu prompt kompleks: model on-device mungkin kesulitan
let complexPrompt = """
Analisis artikel ini, tentukan sentimen, ekstrak semua nama orang dan organisasi yang disebutkan,
buat ringkasan 100 kata, dan berikan rating kredibilitas dari 1-10 beserta alasannya.
"""

// ✓ Decomposisi menjadi beberapa langkah
class ArticleAnalyzer {
    let session = LanguageModelSession()

    func analyze(article: String) async throws -> ArticleAnalysis {
        // Step 1: Sentimen (sederhana, cepat)
        let sentiment = try await session.respond(
            to: "Apa sentimen artikel ini? Jawab satu kata: positif, negatif, atau netral.\n\n\(article)"
        ).content.trimmingCharacters(in: .whitespaces)

        // Step 2: Entitas (terstruktur via @Generable)
        let entities = try await extractEntities(from: article)

        // Step 3: Ringkasan (setelah konteks dibangun dari steps sebelumnya)
        let summary = try await session.respond(
            to: "Buat ringkasan 100 kata dari artikel yang sudah kita bahas."
        ).content

        return ArticleAnalysis(sentiment: sentiment, entities: entities, summary: summary)
    }
}

4. Constraint Output via @Guide

Lebih efektif dari mendeskripsikan format di prompt:

swift
// ❌ Format di prompt — model harus parse instruksi tekstual
let prompt = "Beri rating 1-5 dan alasan singkat. Format: Rating: X\nAlasan: Y"

// ✓ Format via @Generable — constraint di level schema
@Generable
struct Rating {
    @Guide(description: "Rating dari 1 sampai 5")
    var score: Int

    @Guide(description: "Satu kalimat alasan rating")
    var reason: String
}