Menguasai Controlled Generation dengan Gemini 1.5: Kepatuhan Skema untuk Developer

SEP 03, 2024
Lewis Liu Group Product Manager Gemini
Terry Koo Research Scientist Google Deepmind

Sebagian besar ketertarikan seputar AI generatif saat ini berfokus pada “apa yang bisa terjadi” — eksperimen dan terobosan potensial dengan model dasar. Namun di Google, kami selalu berkomitmen untuk menyediakan ekosistem AI komprehensif yang membantu Anda mencoba tidak hanya model-model terbaik di kelasnya, tetapi juga mengadopsinya dalam aplikasi praktis.

Sebagai bagian dari perjalanan tersebut, kami memperkenalkan Controlled Generation untuk Gemini 1.5 Pro di Google I/O awal tahun ini, dan kami sangat senang dengan adopsi yang cepat dan masukan positif yang kami terima. Hari ini, kami mengambil langkah maju dengan memperkenalkan Controlled Generation untuk Gemini 1.5 Flash dan menambahkan dukungan “enum”. Ini melengkapi developer dengan alat tangguh untuk menghasilkan respons yang dapat diandalkan serta mengikuti skema yang ditentukan. Selain itu, controlled generation juga secara otomatis diaktifkan dalam mode ANY ketika Anda menggunakan panggilan fungsi pada Gemini 1.5.


Apa yang dimaksud dengan Controlled Generation dan mengapa ini penting?

Ibaratkan controlled generation sebagai penyedia cetak biru untuk output model. Dengan menetapkan skema respons, Anda menentukan format dan struktur respons AI yang tepat. Ketika mengekstraksi entitas dalam format JSON untuk pemrosesan downstream yang mulus atau mengklasifikasikan artikel berita dalam taksonomi Anda sendiri, controlled generation membantu memastikan konsistensi dan mengurangi waktu pasca-pemrosesan yang diperlukan.

Untuk mengintegrasikan AI sepenuhnya ke dalam pengembangan software, ada dua hal yang perlu dilakukan: transisi yang mulus dari tim sains data dan machine learning ke developer aplikasi, dan integrasi output model secara mulus di dalam sistem yang ada. Dengan controlled generation, Anda bisa:

  • Memungkinkan AI untuk menghasilkan data siap pakai dan dapat dibaca oleh mesin sehingga mengurangi waktu yang diperlukan untuk pasca-pemrosesan dan penguraian yang rumit.

  • Menghasilkan output dalam format seperti JSON, menjadikan AI Anda sebagai warga kelas satu dalam ekonomi API. Ini bisa dengan mudah disambungkan ke alur kerja yang sudah ada.

  • Memasukkan prediktabilitas ke dalam output AI, dengan mengantisipasi format dan struktur data yang dihasilkan model AI Anda secara andal.

Mengutip perkataan Chris Curro, principal machine learning engineer di The Estée Lauder Companies — salah satu penguji awal kami — “Kami merancang alur kerja penalaran yang kompleks di atas Gemini 1.5 untuk membangun pengalaman konsumen dan karyawan yang sebelumnya tidak mungkin dilakukan. Sifat controlled generation yang ramah developer memungkinkan tim kami bergerak cepat dan mendorong nilai bisnis.”

Fitur ini dibangun di atas pengembangan terbaru yang dikembangkan oleh tim Google yang disebut controlled decoding. Anda bisa mempelajari lebih lanjut tentang teknik yang mendasarinya dalam makalah ini.

Dalam Gemini API dan Vertex AI API, kami memperkenalkan konsep “skema respons”. Skema respons berfungsi sebagai template, yang menentukan elemen, tipe data, dan struktur keseluruhan output AI. Skema ini dibuat berdasarkan definisi skema OpenAPI 3.0 sehingga Anda selalu tahu bahwa Anda membangun sesuatu berdasarkan standar yang terbuka dan kompatibel. Dengan menyertakan skema respons bersama prompt, Anda menginstruksikan model untuk mematuhi aturan yang ditetapkan, sehingga memberikan hasil yang terprediksi dan terstruktur.


Resep rahasia Google

  • Controlled generation Gemini menambahkan latensi minimal pada panggilan API Anda, bahkan pada panggilan API pertama

  • Gemini mendukung enum sebagai sebuah tipe, dengan lebih banyak tipe lain akan segera menyusul

  • Gemini menerapkan skema yang tidak memerlukan penyimpanan data Anda


Cara memulai

Fitur controlled generation tersedia di Gemini 1.5 Pro dan Gemini 1.5 Flash di Google AI Studio dan Vertex AI.


Contoh: Membangun aplikasi perencanaan makan dengan skema JSON

Bayangkan Anda sedang membuat aplikasi untuk memberikan saran resep untuk berbagai skenario. Resep harus dibuat dalam format terstruktur agar mudah diserap oleh aplikasi dan ditampilkan secara visual kepada pengguna. Contoh berikut ini mengilustrasikan bagaimana controlled generation bisa digunakan untuk membuat serangkaian resep untuk beberapa jenis hidangan.

from vertexai.generative_models import GenerationConfig, GenerativeModel
vertexai.init(project=project_id, location="us-central1")
 
response_schema = {
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "course": {
                "type": "string",
                "enum": [
                    "appetizer",
                    "salad",
                    "soup",
                    "main",
                    "dessert",
                ],
            },
            "name": {
                "type": "string",
            },
            "ingredients": {
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "unit": {
                            "type": "string",
                            "enum": [
                                "count",
                                "cup",
                                "tablespoon",
                                "teaspoon",
                                "pound",
                                "ounce",
                            ],
                        },
                        "amount": {
                            "type": "number",
                        },
                        "name": {
                            "type": "string",
                        },
                    },
                    "required": ["name"],
                },
            },
            "steps": {
                "type": "array",
                "items": {
                    "type": "string",
                },
            },
        },
        "required": ["course", "name"],
    },
}
 
prompt = (
    "Some friends are in town and I want to host them for dinner.  "
    "Can you plan a three-course meal for me?  "
    "I'm not an experienced cook so I need simple recipes."
)
 
model = GenerativeModel("gemini-1.5-pro-001")
 
response = model.generate_content(
    prompt,
    generation_config=GenerationConfig(
        response_mime_type="application/json",
        response_schema=response_schema
    ),
)

Output model ini benar-benar mengonfirmasi skema yang ditetapkan dalam isi permintaan, dan bisa langsung digunakan oleh aplikasi.

[
    {
        "course": "appetizer",
        "name": "Caprese Skewers",
        "ingredients": [
            {
                "name": "cherry tomatoes",
                "amount": 1,
                "unit": "cup"
            },
            {
                "name": "fresh mozzarella balls",
                "amount": 1,
                "unit": "cup"
            },
            {
                "name": "fresh basil leaves",
                "amount": 12,
                "unit": "count"
            },
            {
                "name": "olive oil",
                "amount": 2,
                "unit": "tablespoon"
            },
            {
                "name": "balsamic glaze",
                "amount": 2,
                "unit": "tablespoon"
            },
            {
                "name": "salt",
                "amount": 1,
                "unit": "teaspoon"
            },
            {
                "name": "black pepper",
                "amount": 1,
                "unit": "teaspoon"
            }
        ],
        "steps": [
            "Thread cherry tomatoes, mozzarella balls, and basil leaves onto skewers.",
            "Drizzle with olive oil and balsamic glaze.",
            "Season with salt and pepper to taste."
        ]
    },
    {
        "course": "main",
        "name": "One-Pan Lemon Herb Salmon",
        "ingredients": [
            {
                "name": "salmon fillets",
                "amount": 4,
                "unit": "count"
            },
            {
                "name": "asparagus",
                "amount": 1,
                "unit": "pound"
            },
            {
                "name": "cherry tomatoes",
                "amount": 1,
                "unit": "cup"
            },
            {
                "name": "lemon",
                "amount": 1,
                "unit": "count"
            },
            {
                "name": "dried oregano",
                "amount": 1,
                "unit": "teaspoon"
            },
            {
                "name": "dried thyme",
                "amount": 1,
                "unit": "teaspoon"
            },
            {
                "name": "salt",
                "amount": 1,
                "unit": "teaspoon"
            },
            {
                "name": "black pepper",
                "amount": 1,
                "unit": "teaspoon"
            },
            {
                "name": "olive oil",
                "amount": 2,
                "unit": "tablespoon"
            }
        ],
        "steps": [
            "Preheat oven to 400 degrees F (200 degrees C).",
            "Line a baking sheet with parchment paper.",
            "Place salmon fillets on one side of the baking sheet and spread asparagus and cherry tomatoes on the other side.",
            "Squeeze lemon juice over the salmon and vegetables.",
            "Sprinkle with oregano, thyme, salt, and pepper.",
            "Drizzle with olive oil.",
            "Bake for 15-20 minutes, or until salmon is cooked through and vegetables are tender."
        ]
    },
    {
        "course": "dessert",
        "name": "Fruit Salad with Honey Yogurt",
        "ingredients": [
            {
                "name": "strawberries",
                "amount": 1,
                "unit": "cup"
            },
            {
                "name": "blueberries",
                "amount": 1,
                "unit": "cup"
            },
            {
                "name": "raspberries",
                "amount": 1,
                "unit": "cup"
            },
            {
                "name": "greek yogurt",
                "amount": 1,
                "unit": "cup"
            },
            {
                "name": "honey",
                "amount": 2,
                "unit": "tablespoon"
            }
        ],
        "steps": [
            "In a large bowl, combine strawberries, blueberries, and raspberries.",
            "In a separate bowl, mix together greek yogurt and honey.",
            "Serve fruit salad with a dollop of honey yogurt."
        ]
    }
]

Mengklasifikasikan kondisi produk dengan skema Enum

Untuk membatasi output model dalam serangkaian nilai yang telah ditetapkan sebelumnya, Anda bisa menggunakan “text/x.enum”.

import vertexai
from vertexai.generative_models import GenerationConfig, GenerativeModel
 
vertexai.init(project=project_id, location="us-central1")
model = GenerativeModel("gemini-1.5-flash-001")
 
response_schema = {
     "type": "STRING",
     "enum": ["new in package", "like new", "gently used", "used", "damaged", "soiled"]
}
 
prompt = [
     "Item description: The item is a long winter coat that has many tears all around the seams and is falling apart. It has large questionable stains on it."
]
 
 
response = model.generate_content(
     prompt,
     generation_config=GenerationConfig(
         response_mime_type="text/x.enum", response_schema=response_schema
     ),
)
print(response.candidates[0])

Output model berisi klasifikasi sederhana produk sebagai “rusak”.

content {
  role: "model"
  parts {
    text: "damaged"
  }
}

Batasan

  • Controlled generation mendukung subset skema OpenAPI 3.0.

  • Isi output masih tergantung pada kemampuan model untuk menalar dan mengekstrak. Menggunakan controlled generation akan menerapkan format output, tetapi bukan respons aktual

  • Jika prompt tidak memiliki informasi yang cukup untuk kolom wajib diisi, controlled generation dapat mengeluarkan respons berdasarkan data dari pelatihannya. Mengatur nullable ke True pada kolom dapat mengurangi limitasi ini.


Ringkasan

Dengan controlled generation, Anda sekarang memiliki alat yang kuat untuk menghasilkan respons yang sesuai dengan skema yang ditentukan. Anda bisa menerapkannya pada banyak alur kerja agar lebih andal dan prediktif. Kami berkomitmen untuk menyediakan fitur API yang mudah digunakan bagi developer untuk mengarahkan dan mengontrol perilaku model dengan lebih baik. Controlled Generation hanyalah sebuah awal.

Untuk mulai menggunakan fitur ini, Anda bisa membaca informasi selengkapnya dari halaman dokumentasi Google AI Studio atau Vertex AI.