Chuyển đến nội dung chính

Phi 4 Multimodal: Hướng dẫn kèm dự án demo

Tìm hiểu cách xây dựng gia sư ngôn ngữ đa phương thức bằng mô hình Phi-4-multimodal của Microsoft.
· 12 phút đọc

Khám phá cùng AI

Phi-4-multimodal là một mô hình nền tảng đa phương thức gọn nhẹ do Microsoft phát triển. Nó thuộc họ Phi của Microsoft gồm các mô hình đa phương thức và là một phần trong họ mô hình ngôn ngữ nhỏ (SLM) của Microsoft.

Trong hướng dẫn này, tôi sẽ giải thích từng bước cách sử dụng Phi-4-multimodal để xây dựng một gia sư ngôn ngữ đa phương thức có thể làm việc với văn bản, hình ảnh và âm thanh. Các tính năng chính của ứng dụng này gồm:

  • Học dựa trên văn bản: Cung cấp sửa ngữ pháp theo thời gian thực, dịch ngôn ngữ, tái cấu trúc câu và gợi ý từ vựng theo ngữ cảnh.
  • Học dựa trên hình ảnh: Trích xuất và dịch văn bản từ hình ảnh, đồng thời tóm tắt nội dung trực quan để hiểu tốt hơn.
  • Học dựa trên âm thanh: Chuyển giọng nói thành văn bản, đánh giá độ chính xác phát âm và cho phép dịch giọng nói theo thời gian thực sang nhiều ngôn ngữ. 

Trước hết, hãy điểm qua nhanh mô hình Phi-4-multimodal, sau đó chúng ta sẽ bắt đầu xây dựng ứng dụng.

Phi-4-Multimodal là gì?

Phi-4-multimodal là một mô hình AI tiên tiến được thiết kế để xử lý văn bản, thị giác và giọng nói. Nó cho phép tích hợp liền mạch nhiều phương thức, rất phù hợp cho các ứng dụng học ngôn ngữ. Một số năng lực chính bao gồm:

  • Xử lý văn bản: Bao gồm sửa ngữ pháp, dịch và xây dựng câu.
  • Xử lý thị giác: Phi 4 có thể thực hiện nhận dạng ký tự quang học (OCR), tóm tắt hình ảnh và tương tác đa phương thức.
  • Xử lý giọng nói: Có thể thực hiện nhận dạng giọng nói tự động (ASR), kèm phản hồi phát âm và dịch giọng nói sang văn bản.

Với độ dài ngữ cảnh 128K token, Phi-4 multimodal được tối ưu cho lập luận hiệu quả và môi trường hạn chế bộ nhớ, rất phù hợp cho học ngôn ngữ thời gian thực sử dụng AI.

tính năng phi-4-multimodal

Bước 1: Điều kiện tiên quyết

Ứng dụng gia sư ngôn ngữ đa phương thức mà chúng ta sắp xây dựng là một công cụ tương tác dùng AI, hỗ trợ người dùng học ngôn ngữ mới bằng sự kết hợp giữa tương tác văn bản, hình ảnh và âm thanh.

Trước khi bắt đầu, hãy đảm bảo rằng chúng ta đã cài đặt các công cụ và thư viện sau:

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

Chạy các lệnh sau để cài đặt các phụ thuộc cần thiết:

pip install gradio transformers torch soundfile pillow

Chúng ta cũng cần đảm bảo đã cài FlashAttention2 để có hiệu năng tốt hơn:

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

Lưu ý: Dự án này sử dụng GPU A100 trên sổ tay Google Colab. Nếu bạn dùng GPU cũ hơn (ví dụ NVIDIA V100), bạn có thể cần vô hiệu hóa FlashAttention2 bằng cách đặt _attn_implementation="eager" ở bước khởi tạo mô hình.

Sau khi cài đặt xong các phụ thuộc trên, hãy chạy các lệnh import sau:

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

Bước 2: Nạp Phi-4-Multimodal

Để tận dụng khả năng đa phương thức của Phi-4, trước tiên chúng ta nạp cả mô hình và processor của nó. Đường dẫn mô hình được lấy từ Hugging Face, còn processor xử lý việc token hóa văn bản, thay đổi kích thước và chuẩn hóa hình ảnh, cũng như chuyển đổi dạng sóng âm thanh sang định dạng tương thích với mô hình để xử lý đa phương thức trôi chảy.

# 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)

Bước khởi tạo mô hình sử dụng hàm 'AutoModelForCausalLM.from_pretrained() để nạp mô hình Phi-4 đã huấn luyện sẵn cho tác vụ mô hình hóa ngôn ngữ nhân quả (CLM) và nạp mô hình lên GPU bằng device_map="cuda".

Một tham số quan trọng ở bước này là _attn_implementation='flash_attention_2'`, sử dụng FlashAttention2 để có cơ chế attention nhanh hơn và tiết kiệm bộ nhớ hơn, đặc biệt cho xử lý ngữ cảnh dài.

Bước 3: Xây dựng các chức năng chính

Giờ khi đã nạp mô hình, hãy xây dựng các chức năng chính.

1. Làm sạch phản hồi

Một khía cạnh quan trọng của bất kỳ dự án dựa trên LLM hay VLM là đảm bảo mô hình tạo ra phản hồi chính xác và phù hợp. Điều này cũng bao gồm việc loại bỏ phần văn bản nhắc lệnh khỏi đầu ra, đảm bảo người dùng nhận được phản hồi gọn gàng, trực tiếp mà không có phần hướng dẫn ban đầu xuất hiện ở đầu.

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

Chúng ta đơn giản dùng hàm strip() để lược bỏ phần nhắc lệnh dựa trên các từ khóa hướng dẫn.

2. Xử lý đầu vào

Tiếp theo, hãy xử lý đầu vào có thể là văn bản, hình ảnh hoặc âm thanh, tùy theo đầu vào hay kịch bản của người dùng.

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])

Hàm trên chịu trách nhiệm xử lý đầu vào văn bản, hình ảnh và âm thanh, đồng thời tạo phản hồi bằng mô hình Phi-4-multimodal. Dưới đây là phân tích kỹ thuật của quy trình này:

  1. Xử lý đầu vào hình ảnh: Nếu kiểu đầu vào là "Image", prompt được định dạng với một chỗ dành sẵn cho hình ảnh (<|image_1|>). Hình ảnh sau đó được nạp, và processor sẽ token hóa văn bản đi kèm đồng thời trích xuất đặc trưng thị giác. Các đầu vào đã xử lý được chuyển lên GPU để tính toán tối ưu.
  2. Xử lý đầu vào âm thanh: Nếu kiểu đầu vào là "Audio", prompt được cấu trúc với chỗ dành sẵn cho âm thanh (<|audio_1|>). Tệp âm thanh được đọc bằng hàm sf.read(), trích xuất dạng sóng thô và tần số mẫu. Processor sau đó mã hóa cả âm thanh và văn bản, đảm bảo tích hợp liền mạch cho khả năng hiểu đa phương thức.
  3. Xử lý đầu vào văn bản: Nếu kiểu đầu vào là "Text", văn bản được nhúng trực tiếp vào prompt. Processor token hóa và mã hóa đầu vào, chuẩn bị cho bước xử lý tiếp theo của mô hình.

3. Dịch và sửa ngữ pháp

Tiếp theo, chúng ta xử lý văn bản để dịch và sửa ngữ pháp bằng mô hình 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)

Hàm process_text_translate() xây dựng động một prompt dịch bằng cách chỉ định ngôn ngữ đích, sau đó truyền văn bản đầu vào và prompt đã cấu trúc tới hàm process_input(), trả về bản dịch. 

Tương tự, hàm process_text_grammar() tạo prompt kiểm tra ngữ pháp, gọi hàm process_input() với văn bản và kiểu đầu vào, và trả về phiên bản văn bản đã được chỉnh ngữ pháp. Cả hai hàm đều tận dụng khả năng của mô hình cho tác vụ dịch và sửa ngữ pháp để tinh gọn quá trình xử lý ngôn ngữ.

Bước 4: Xây dựng bản demo đa phương thức với Gradio

Giờ chúng ta đã có các hàm logic chính. Tiếp theo, hãy xây dựng giao diện tương tác với 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()

Đoạn mã trên tổ chức giao diện Gradio thành ba tab tương tác, gồm học dựa trên văn bản, học dựa trên hình ảnh và học dựa trên âm thanh, mỗi tab được thiết kế cho các chức năng học ngôn ngữ khác nhau.

Người dùng có thể nhập văn bản để dịch hoặc kiểm tra ngữ pháp, tải hình ảnh để trích xuất văn bản và tóm tắt, hoặc cung cấp âm thanh để phiên âm và dịch. 

Mỗi chức năng được kích hoạt bằng phương thức click() của Gradio, gọi các hàm xử lý như process_text_translate(), process_text_grammar() và process_input() như đã nêu ở trên, bằng cách truyền các đầu vào cần thiết và cập nhật đầu ra động.

Clear được bao gồm ở mỗi tab để đặt lại đầu vào và đầu ra, đảm bảo trải nghiệm mượt mà. Cuối cùng, giao diện được khởi chạy bằng demo.launch(debug=True) giúp nhà phát triển dễ dàng gỡ lỗi mọi lỗi trong ứng dụng.

Bước 5: Kiểm thử ứng dụng

Dưới đây là một vài thử nghiệm của tôi với ứng dụng này.

Dịch và kiểm tra ngữ pháp

Đối với tác vụ dịch và kiểm tra ngữ pháp, tôi cung cấp văn bản "Hello world" và yêu cầu mô hình dịch sang tiếng Pháp và xác minh ngữ pháp (lưu ý các nút khác nhau cho dịch và kiểm tra ngữ pháp).

Phi-4-multimodal cho dịch văn bản

Phi-4-multimodal cho kiểm tra và sửa ngữ pháp

Dịch văn bản trong hình ảnh

Trong ví dụ này, tôi cung cấp một hình ảnh biển báo dừng bằng tiếng Tây Ban Nha yêu cầu người đi bộ không đi vào lối nhất định. Mô hình đã diễn giải chính xác ý nghĩa của biển báo và tạo phản hồi: "Không đi bộ trên đường ray."

Phi 4 cho dịch văn bản trong hình ảnh

Phiên âm và dịch âm thanh

Đối với phiên âm âm thanh, tôi cung cấp một tệp âm thanh tiếng Anh và yêu cầu mô hình phiên âm lời nói rồi dịch bản phiên âm sang tiếng Pháp.

Phi 4 multimodal cho phiên âm và dịch âm thanh

Kết luận

Trong hướng dẫn này, chúng ta đã xây dựng một gia sư ngôn ngữ đa phương thức sử dụng mô hình Phi-4 multimodal, cho phép học ngôn ngữ dựa trên văn bản, hình ảnh và âm thanh. Chúng ta đã khai thác các khả năng thị giác, giọng nói và văn bản tiên tiến của Phi-4 để cung cấp dịch theo thời gian thực, sửa ngữ pháp, phiên âm giọng nói và hiểu biết dựa trên hình ảnh. Dự án này cho thấy AI đa phương thức có thể nâng cao giáo dục ngôn ngữ và khả năng tiếp cận như thế nào.

Aashi Dutt

Tác giả

Aashi Dutt

Tôi là Chuyên gia Google Developers trong lĩnh vực ML (Gen AI), Chuyên gia Kaggle 3x và Đại sứ Women Techmakers với hơn 3 năm kinh nghiệm trong ngành công nghệ. Tôi đồng sáng lập một startup công nghệ y tế vào năm 2020 và hiện đang theo học thạc sĩ khoa học máy tính tại Georgia Tech, chuyên sâu về học máy.

Chủ đề

Liên quan