Lewati ke konten utama

Phi 4 Multimodal: Panduan dengan Proyek Demo

Pelajari cara membangun tutor bahasa multimodal menggunakan model Phi-4-multimodal dari Microsoft.
· 12 mnt Baca

Jelajahi bersama AI

Phi-4-multimodal adalah model fondasi multimodal yang ringan yang dikembangkan oleh Microsoft. Ini adalah bagian dari keluarga Phi milik Microsoft yang berisi small language models (SLM).

Dalam tutorial ini, saya akan menjelaskan langkah demi langkah cara menggunakan Phi-4-multimodal untuk membangun sebuah tutor bahasa multimodal yang dapat bekerja dengan teks, gambar, dan audio. Fitur utama aplikasi ini adalah:

  • Pembelajaran berbasis teks: Menyediakan koreksi tata bahasa secara real-time, terjemahan bahasa, restrukturisasi kalimat, dan saran kosakata yang kontekstual.
  • Pembelajaran berbasis gambar: Mengekstrak dan menerjemahkan teks dari gambar serta meringkas konten visual untuk pemahaman yang lebih baik.
  • Pembelajaran berbasis audio: Mengonversi ucapan menjadi teks, mengevaluasi ketepatan pelafalan, dan memungkinkan terjemahan ucapan secara real-time ke berbagai bahasa. 

Mari kita mulai dengan pengenalan singkat model Phi-4-multimodal, lalu kita akan mulai membangun aplikasinya.

Apa itu Phi-4-Multimodal?

Phi-4-multimodal adalah model AI tingkat lanjut yang dirancang untuk pemrosesan teks, visi, dan ucapan. Model ini memungkinkan integrasi berbagai modalitas secara mulus, sehingga ideal untuk aplikasi pembelajaran bahasa. Beberapa kemampuan utamanya meliputi:

  • Pemrosesan teks: Termasuk koreksi tata bahasa, penerjemahan, dan konstruksi kalimat.
  • Pemrosesan visi: Phi 4 dapat melakukan optical character recognition (OCR), peringkasan gambar, dan interaksi multimodal.
  • Pemrosesan ucapan: Dapat melakukan automatic speech recognition (ASR), memberi umpan balik pelafalan, serta terjemahan ucapan ke teks.

Dengan panjang konteks 128K token, model Phi-4 multimodal dioptimalkan untuk penalaran yang efisien dan lingkungan dengan keterbatasan memori, sehingga sangat cocok untuk pembelajaran bahasa berbasis AI secara real-time.

fitur phi-4-multimodal

Langkah 1: Prasyarat

Aplikasi tutor bahasa multimodal yang akan kita bangun adalah alat interaktif bertenaga AI yang dirancang untuk membantu pengguna mempelajari bahasa baru melalui kombinasi interaksi berbasis teks, gambar, dan audio.

Sebelum mulai, pastikan kita telah memasang alat dan pustaka berikut:

  • Python 3.8+
  • torch
  • Transformers
  • PIL
  • Soundfile
  • Gradio

Jalankan perintah berikut untuk memasang dependensi yang diperlukan:

pip install gradio transformers torch soundfile pillow

Kita juga perlu memastikan bahwa FlashAttention2 terpasang untuk kinerja yang lebih baik:

pip install flash-attn --no-build-isolation

Catatan: Proyek ini menggunakan GPU A100 pada notebook Google Colab. Jika Anda menggunakan GPU yang lebih lama (misalnya, NVIDIA V100), Anda mungkin perlu menonaktifkan FlashAttention2 dengan menyetel _attn_implementation="eager" pada langkah inisialisasi model.

Setelah semua dependensi di atas terpasang, jalankan perintah impor berikut:

import gradio as gr
import torch
import requests
import io
import os
import soundfile as sf
from PIL import Image
from transformers import AutoModelForCausalLM, AutoProcessor, GenerationConfig

Langkah 2: Memuat Phi-4-Multimodal

Untuk memanfaatkan kemampuan multimodal Phi-4, pertama kita memuat model dan processornya. Jalur model diatur dari Hugging Face, sementara processor menangani tokenisasi teks, pengubahan ukuran dan normalisasi gambar, serta konversi gelombang audio ke format yang kompatibel dengan model untuk pemrosesan multimodal yang mulus.

# Load model and processor
model_path = "microsoft/Phi-4-multimodal-instruct"
processor = AutoProcessor.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
    model_path, 
    device_map="cuda", 
    torch_dtype="auto", 
    trust_remote_code=True,
    _attn_implementation='flash_attention_2',
).cuda()
generation_config = GenerationConfig.from_pretrained(model_path)

Langkah inisialisasi model menggunakan fungsi 'AutoModelForCausalLM.from_pretrained() untuk memuat model Phi-4 yang telah dilatih sebelumnya untuk causal language modeling (CLM) dan memuat model ke GPU menggunakan device_map="cuda".

Parameter kunci pada langkah ini adalah _attn_implementation='flash_attention_2'`, yang menggunakan FlashAttention2 untuk mekanisme attention yang lebih cepat dan hemat memori, terutama untuk pemrosesan konteks panjang.

Langkah 3: Membangun Fungsionalitas Utama

Sekarang model sudah dimuat, mari kita bangun fungsionalitas utamanya.

1. Membersihkan respons

Aspek penting dari proyek berbasis LLM atau VLM adalah memastikan model menghasilkan respons yang akurat dan relevan. Ini juga mencakup menghapus teks prompt dari keluaran, sehingga pengguna menerima respons yang bersih dan langsung tanpa instruksi awal muncul di bagian awal.

def clean_response(response, instruction_keywords):
    """Removes the prompt text dynamically based on instruction keywords."""
    for keyword in instruction_keywords:
        if response.lower().startswith(keyword.lower()):
            response = response[len(keyword):].strip()
    return response

Kita cukup menggunakan fungsi strip() untuk memangkas teks prompt berdasarkan kata kunci instruksi.

2. Pemrosesan input

Sekarang, mari proses input kita, yang bisa berupa teks, gambar, atau audio, bergantung pada masukan atau skenario pengguna.

def process_input(file, input_type, question):
    user_prompt = "<|user|>"
    assistant_prompt = "<|assistant|>"
    prompt_suffix = "<|end|>"
    
    if input_type == "Image":
	prompt= f'{user_prompt}<|image_1|>{question}{prompt_suffix}{assistant_prompt}'
        image = Image.open(file)
	inputs = processor(text=prompt, images=image, return_tensors='pt').to(model.device)
    elif input_type == "Audio":
 	prompt= f'{user_prompt}<|audio_1|>{question}{prompt_suffix}{assistant_prompt}'
        audio, samplerate = sf.read(file)
        inputs = processor(text=prompt, audios=[(audio, samplerate)], return_tensors='pt').to(model.device)
    elif input_type == "Text":
        prompt = f'{user_prompt}{question} "{file}"{prompt_suffix}{assistant_prompt}'
        inputs = processor(text=prompt, return_tensors='pt').to(model.device)
    else:
        return "Invalid input type"    
    
    generate_ids = model.generate(**inputs, max_new_tokens=1000, generation_config=generation_config)
    response = processor.batch_decode(generate_ids, skip_special_tokens=True)[0]
    return clean_response(response, [question])

Fungsi di atas bertanggung jawab menangani input teks, gambar, dan audio serta menghasilkan respons menggunakan model Phi-4-multimodal. Berikut uraian teknis alur kerja ini:

  1. Pemrosesan input gambar: Jika jenis input adalah "Image", prompt diformat dengan placeholder gambar (<|image_1|>). Gambar kemudian dimuat, dan processor melakukan tokenisasi teks yang menyertainya sembari mengekstraksi fitur visual. Input yang telah diproses dipindahkan ke GPU untuk komputasi yang optimal.
  2. Pemrosesan input audio: Jika jenis input adalah "Audio", prompt disusun dengan placeholder audio (<|audio_1|>). Berkas audio dibaca menggunakan fungsi sf.read(), mengekstraksi gelombang mentah dan laju sampel. Processor kemudian mengenkode audio dan teks, memastikan integrasi yang mulus untuk pemahaman multimodal.
  3. Pemrosesan input teks: Jika jenis input adalah "Text", teks disematkan langsung ke dalam prompt. Processor melakukan tokenisasi dan pengodean input, menyiapkannya untuk diproses lebih lanjut oleh model.

3. Terjemahan dan koreksi tata bahasa

Selanjutnya, kita memproses teks untuk terjemahan dan koreksi tata bahasa menggunakan model Phi-4-multimodal. 

def process_text_translate(text, target_language):
    prompt = f'Translate the following text to {target_language}: "{text}"'
    return process_input(text, "Text", prompt)
def process_text_grammar(text):
    prompt = f'Check the grammar and provide corrections if needed for the following text: "{text}"'
    return process_input(text, "Text", prompt)

Fungsi process_text_translate() secara dinamis membangun prompt terjemahan dengan menentukan bahasa target dan meneruskan teks input serta prompt terstruktur ke fungsi process_input(), lalu mengembalikan teks terjemahan. 

Demikian pula, fungsi process_text_grammar() membangun prompt koreksi tata bahasa, memanggil fungsi process_input() dengan teks dan jenis input, serta mengembalikan versi teks yang telah diperbaiki tata bahasanya. Kedua fungsi ini menyederhanakan pemrosesan bahasa dengan memanfaatkan kemampuan model untuk terjemahan dan koreksi tata bahasa.

Langkah 4: Membangun Demo Multimodal dengan Gradio

Kini, seluruh fungsi logika utama sudah siap. Selanjutnya, kita membangun UI interaktif dengan Gradio.

def gradio_interface():
    with gr.Blocks() as demo:
        gr.Markdown("# Phi 4 Powered - Multimodal Language Tutor")        
        with gr.Tab("Text-Based Learning"):
            text_input = gr.Textbox(label="Enter Text")
            language_input = gr.Textbox(label="Target Language", value="French")
            text_output = gr.Textbox(label="Response")
            text_translate_btn = gr.Button("Translate")
            text_grammar_btn = gr.Button("Check Grammar")
            text_clear_btn = gr.Button("Clear")
            text_translate_btn.click(process_text_translate, inputs=[text_input, language_input], outputs=text_output)
            text_grammar_btn.click(process_text_grammar, inputs=[text_input], outputs=text_output)
            text_clear_btn.click(lambda: ("", "", ""), outputs=[text_input, language_input, text_output])        
        with gr.Tab("Image-Based Learning"):
            image_input = gr.Image(type="filepath", label="Upload Image")
            language_input_image = gr.Textbox(label="Target Language for Translation", value="English")
            image_output = gr.Textbox(label="Response")
            image_clear_btn = gr.Button("Clear")
            image_translate_btn = gr.Button("Translate Text in Image")
            image_summarize_btn = gr.Button("Summarize Image")
            image_translate_btn.click(process_input, inputs=[image_input, gr.Textbox(value="Image", visible=False), gr.Textbox(value="Extract and translate text", visible=False)], outputs=image_output)
            image_summarize_btn.click(process_input, inputs=[image_input, gr.Textbox(value="Image", visible=False), gr.Textbox(value="Summarize this image", visible=False)], outputs=image_output)
            image_clear_btn.click(lambda: (None, "", ""), outputs=[image_input, language_input_image, image_output])
        with gr.Tab("Audio-Based Learning"):
            audio_input = gr.Audio(type="filepath", label="Upload Audio")
            language_input_audio = gr.Textbox(label="Target Language for Translation", value="English")
            transcript_output = gr.Textbox(label="Transcribed Text")
            translated_output = gr.Textbox(label="Translated Text")
            audio_clear_btn = gr.Button("Clear")
            audio_transcribe_btn = gr.Button("Transcribe & Translate")
            audio_transcribe_btn.click(process_input, inputs=[audio_input, gr.Textbox(value="Audio", visible=False), gr.Textbox(value="Transcribe this audio", visible=False)], outputs=transcript_output)
            audio_transcribe_btn.click(process_input, inputs=[audio_input, gr.Textbox(value="Audio", visible=False), language_input_audio], outputs=translated_output)
            audio_clear_btn.click(lambda: (None, "", "", ""), outputs=[audio_input, language_input_audio, transcript_output, translated_output])        
        demo.launch(debug=True)

if __name__ == "__main__":
    gradio_interface()

Kode di atas mengorganisasi antarmuka Gradio ke dalam tiga tab interaktif, yaitu pembelajaran berbasis teks, berbasis gambar, dan berbasis audio, yang masing-masing dirancang untuk fungsionalitas pembelajaran bahasa yang berbeda.

Pengguna dapat memasukkan teks untuk terjemahan atau koreksi tata bahasa, mengunggah gambar untuk ekstraksi teks dan peringkasan, atau menyediakan audio untuk transkripsi ucapan dan terjemahan. 

Setiap fungsi dipicu menggunakan metode click() milik Gradio, yang memanggil fungsi pemrosesan seperti process_text_translate(), process_text_grammar(), dan process_input() seperti dibahas di atas, dengan meneruskan input yang diperlukan dan memperbarui keluaran secara dinamis.

Clear disertakan pada tiap tab untuk mengatur ulang input dan output, memastikan pengalaman pengguna yang lancar. Terakhir, antarmuka dijalankan dengan demo.launch(debug=True) yang memungkinkan pengembang dengan mudah men-debug kesalahan pada aplikasi.

Langkah 5: Menguji Aplikasi

Berikut beberapa eksperimen saya dengan aplikasi ini.

Terjemahan dan pemeriksaan tata bahasa

Untuk tugas terjemahan dan pemeriksaan tata bahasa, saya memberikan teks "Hello world" dan menginstruksikan model untuk menerjemahkannya ke dalam bahasa Prancis serta memverifikasi tata bahasanya (perhatikan tombol yang berbeda untuk terjemahan dan pemeriksaan tata bahasa).

Phi-4-multimodal untuk terjemahan teks

Phi-4-multimodal untuk pemeriksaan dan koreksi tata bahasa

Menerjemahkan teks di dalam gambar

Pada contoh ini, saya memberikan gambar rambu berhenti berbahasa Spanyol yang menginstruksikan pejalan kaki untuk tidak berjalan di jalur tertentu. Model menafsirkan makna rambu dengan akurat dan menghasilkan respons: "Jangan berjalan di rel."

Phi 4 untuk terjemahan teks pada gambar

Transkripsi dan terjemahan audio

Untuk transkripsi audio, saya memberikan berkas audio bahasa Inggris dan menginstruksikan model untuk mentranskripsikan ucapan tersebut serta menerjemahkan transkripsinya ke dalam bahasa Prancis.

Phi 4 multimodal untuk transkripsi dan terjemahan audio

Kesimpulan

Dalam tutorial ini, kita membangun tutor bahasa multimodal menggunakan model Phi-4 multimodal, yang memungkinkan pembelajaran bahasa berbasis teks, gambar, dan audio. Kita memanfaatkan kemampuan visi, ucapan, dan teks tingkat lanjut milik Phi-4 untuk menyediakan terjemahan real-time, koreksi tata bahasa, transkripsi ucapan, dan wawasan pembelajaran berbasis gambar. Proyek ini menunjukkan bagaimana AI multimodal dapat meningkatkan pendidikan bahasa dan aksesibilitas.

Aashi Dutt

Penulis

Aashi Dutt

Saya adalah Google Developers Expert di ML (Gen AI), Kaggle 3x Expert, dan Women Techmakers Ambassador dengan pengalaman lebih dari 3 tahun di bidang teknologi. Saya ikut mendirikan startup health-tech pada 2020 dan sedang menempuh studi magister ilmu komputer di Georgia Tech dengan spesialisasi machine learning.

Topik

Terkait

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

blogs

Tutorial Korelasi di R