Section 3/141 menit

3. Teori: Constrained Decoding dan @Generable Internals

3. Teori: Constrained Decoding dan @Generable Internals

Bagaimana @Generable Bekerja di Tingkat Bawah

Ketika Anda menulis @Generable, macro Swift menghasilkan conformance ke protokol Generable. Di runtime, framework menggunakan informasi ini untuk membangun JSON Schema yang dikirim bersama prompt:

swift
@Generable struct ProductInfo {     Macro menghasilkan schema:
    var name: String           →    {
    var price: Double"type": "object",
    var inStock: Bool          →      "properties": {
}                              →        "name": {"type": "string"},
                               →        "price": {"type": "number"},
                               →        "inStock": {"type": "boolean"}
                               →      },
                               →      "required": ["name", "price", "inStock"]
                               →    }

Schema ini dikirim ke model bersama prompt. Model kemudian menghasilkan token dengan constrained decoding — pada setiap langkah, hanya token yang valid secara JSON Schema yang diizinkan. Hasilnya dijamin sesuai struktur.

Mengapa Enum Lebih Efisien dari String

swift
// ❌ Tidak optimal: model harus "menebak" string yang tepat
@Generable
struct Analysis {
    @Guide(description: "Kategori: technology, finance, health, entertainment, sports, atau other")
    var category: String  // Model bisa menghasilkan nilai yang tidak terduga
}

// ✓ Optimal: constrained ke nilai yang valid — lebih cepat dan lebih akurat
@Generable
enum Category: String {
    case technology, finance, health, entertainment, sports, other
}

@Generable
struct Analysis {
    @Guide(description: "Kategori konten")
    var category: Category  // Hanya token yang valid secara enum yang dihasilkan
}

Enum mengurangi token search space secara drastis. Model tidak perlu menghasilkan karakter demi karakter untuk string arbitrer — hanya memilih dari set terbatas yang sudah diketahui.

@Guide dan Kualitas Output

@Guide bukan sekadar dokumentasi — ia secara langsung mempengaruhi kualitas output karena dikirim ke model sebagai bagian dari schema description:

swift
// ❌ @Guide yang buruk: terlalu umum, tidak memberikan constraint yang jelas
@Generable
struct UserProfile {
    @Guide(description: "Nama")
    var name: String

    @Guide(description: "Umur")
    var age: Int
}

// ✓ @Guide yang baik: spesifik, memberikan constraint dan format yang jelas
@Generable
struct UserProfile {
    @Guide(description: "Nama lengkap pengguna, huruf kapital di awal setiap kata")
    var name: String

    @Guide(description: "Umur dalam tahun, antara 0 sampai 120")
    var age: Int

    @Guide(description: "Kode negara ISO 3166-1 alpha-2 dua huruf, contoh: ID, US, JP")
    var countryCode: String

    @Guide(description: "Daftar minat maksimal 5 item, lowercase, tanpa spasi (gunakan dash), contoh: machine-learning, ios-dev")
    var interests: [String]
}