Khóa học
Thời mà chúng ta hài lòng với mô hình ngôn ngữ lớn chỉ xử lý văn bản đã qua. Giờ đây, chúng ta kỳ vọng các LLM đa phương thức có khả năng hiểu và tương tác với văn bản, hình ảnh và video.
Xin giới thiệu các mô hình thị giác Llama 3.2 11B & 90B, những mô hình đa phương thức mã nguồn mở đầu tiên của Meta AI, có khả năng xử lý cả đầu vào văn bản và hình ảnh.
Trong hướng dẫn thực hành này, tôi sẽ dẫn bạn qua quy trình tạo một trợ lý hỗ trợ khách hàng đa phương thức với Llama 3.2 và Gradio. Kết thúc bài hướng dẫn, bạn sẽ có một ứng dụng web hoàn chỉnh có thể phân tích mô tả văn bản và hình ảnh tải lên để tạo ra các giải pháp hữu ích — giống như một trợ lý xử lý phiếu hỗ trợ!
Nếu bạn cần phần giới thiệu nhanh về Llama 3.2 trước khi bắt đầu, tôi khuyến nghị đọc hướng dẫn Llama 3.2 này.
Thiết lập ban đầu
Trong bản demo thực hành này, chúng ta sẽ sử dụng mô hình Llama3.2-11B-Vision (đa phương thức). Trước khi bắt đầu viết mã, hãy đảm bảo rằng chúng ta có đủ các phụ thuộc cần thiết.
Chúng ta cần một vài thư viện để mọi thứ chạy trơn tru. Quan trọng nhất là:
- Transformers: Thư viện cốt lõi để làm việc với các mô hình như Llama 3.2.
- Torch: Thư viện học sâu cung cấp sức mạnh cho mô hình.
- Gradio: Dùng để xây dựng giao diện người dùng.
Chạy các lệnh sau để cài đặt các phụ thuộc cần thiết:
!pip3 install -U transformers bitsandbytes accelerate peft -q
!pip3 install gradio -q
Tải mô hình và processor của Llama 3.2
Bây giờ, hãy tải mô hình và processor của Llama 3.2. Chúng ta sẽ sử dụng thư viện transformers của Hugging Face để tải mô hình và processor, đảm bảo mô hình chạy trên GPU nếu có, hoặc mặc định là CPU. Với 11B tham số, mô hình hoạt động tốt trên GPU A100 trong Google Colab.
Trong khối mã dưới đây:
- Chúng ta thiết lập các import cần thiết.
- Chúng ta tải cả mô hình và processor với hỗ trợ GPU nếu có. Điều này giúp ứng dụng chạy hiệu quả, đặc biệt khi xử lý lượng dữ liệu lớn.
- Một đoạn mã quan trọng cần chú ý là
tie_weight(), đảm bảo trọng số của lớp nhúng đầu vào và đầu ra là giống nhau. Điều này giúp giảm tiêu thụ bộ nhớ và có thể cải thiện hiệu năng.
import torch
from PIL import Image
import gradio as gr
from transformers import MllamaForConditionalGeneration, AutoProcessor
def load_model():
model_id = "meta-llama/Llama-3.2-11B-Vision-Instruct"
device = "cuda" if torch.cuda.is_available() else "cpu" # Check if GPU is available
model = MllamaForConditionalGeneration.from_pretrained(
model_id,
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
device_map="auto", # Automatically map to available device
offload_folder="offload", # Offload to disk if necessary
)
model.tie_weights() # Tying weights for efficiency
processor = AutoProcessor.from_pretrained(model_id)
print(f"Model loaded on: {device}")
return model, processor
Vì sao chọn Gradio?
Gradio là một thư viện Python gọn nhẹ cho phép chúng ta nhanh chóng xây dựng các ứng dụng máy học với giao diện web. Thay vì viết HTML hay JavaScript phức tạp, chúng ta có thể định nghĩa các thành phần của ứng dụng (như ô nhập văn bản, nút bấm hoặc hình ảnh) trực tiếp trong Python.
Dưới đây là ví dụ về một giao diện Gradio cơ bản:

Gradio có một vài ưu điểm:
- Không rắc rối khi cài đặt: Ứng dụng Gradio được lưu trữ và chia sẻ chỉ với vài dòng mã Python. Tính năng chia sẻ tích hợp cho phép truy cập qua liên kết công khai.
- Giao diện cộng tác: Cho phép demo trực tiếp các mô hình được chia sẻ với cộng sự hoặc công chúng. Nhiều người dùng có thể tương tác đồng thời.
- Hỗ trợ nhiều loại đầu vào và đầu ra: Cung cấp nhiều thành phần nhập/xuất vượt ra ngoài văn bản và hình ảnh.
- Cấu hình tối thiểu cho lưu trữ đám mây: Dễ dàng triển khai trên các nền tảng như Hugging Face Spaces hoặc dịch vụ đám mây khác.
- Tích hợp đa nền tảng: Có thể nhúng giao diện vào ứng dụng web khác, Jupyter Notebook, hoặc bài viết blog.
- Tự động tạo API: Tự động tạo API cho ứng dụng.
- Bảo mật tích hợp: Bao gồm giới hạn kích thước tệp và các biện pháp khác để ngăn chặn lạm dụng độc hại.
Trong bản demo này, Gradio giúp người dùng dễ dàng nhập cả văn bản và hình ảnh và xem kết quả (phân tích văn bản và hình ảnh, trong trường hợp này) theo thời gian thực. Đây là lựa chọn hoàn hảo để trình diễn sức mạnh của các mô hình như Llama 3.2 trong môi trường thân thiện với người dùng.
Xây dựng ứng dụng đa phương thức Llama 3.2
Sau khi đã thiết lập các import và cấu hình mô hình thành công, hãy chuyển sang phần chính của ứng dụng — xử lý đầu vào (văn bản và hình ảnh) và tạo phản hồi.
Sinh văn bản từ văn bản
Chúng ta bắt đầu bằng cách định nghĩa một hàm nhận văn bản người dùng và, tùy chọn, kèm hình ảnh. Hàm này sau đó sử dụng mô hình Llama 3.2 để tạo phản hồi.
def process_ticket(text, image=None):
model, processor = load_model()
try:
if image:
# Resize the image for consistency
image = image.convert("RGB").resize((224, 224))
prompt = f"<|image|><|begin_of_text|>{text}"
# Process both the image and text input
inputs = processor(images=[image], text=prompt, return_tensors="pt").to(model.device)
else:
prompt = f"<|begin_of_text|>{text}"
# Process text-only input
inputs = processor(text=prompt, return_tensors="pt").to(model.device)
# Generate response (restrict token length for faster output)
outputs = model.generate(**inputs, max_new_tokens=200)
# Decode the response from tokens to text
response = processor.decode(outputs[0], skip_special_tokens=True)
return response
except Exception as e:
print(f"Error processing ticket: {e}")
return "An error occurred while processing your request."
Hàm này xử lý hai loại đầu vào trong vòng lặp:
- Chỉ văn bản: Nếu không có hình ảnh, mô hình sẽ tạo phản hồi dựa trên đầu vào văn bản.
- Văn bản + Hình ảnh: Nếu có hình ảnh, mô hình sẽ xử lý cả văn bản và hình ảnh trước khi tạo phản hồi.
Khi đã xác định loại đầu vào, dữ liệu được chuyển tới processor từ thư viện transformers để xử lý. Sau đó, mô hình tạo đầu ra trong phạm vi max_new_tokens.
Tạo giao diện Gradio
Giao diện Gradio gắn kết mọi thứ và cho phép chúng ta chạy kiểm thử trên nền web. Giao diện này cho phép người dùng gửi văn bản và hình ảnh về vấn đề họ gặp phải và xem lời giải do AI tạo ra.
Hãy xem đoạn mã rồi cùng giải thích.
def create_interface():
text_input = gr.Textbox(
label="Describe your issue",
placeholder="Describe the problem you're experiencing",
lines=4,
)
image_input = gr.Image(label="Upload a Screenshot (Optional)", type="pil")
# Output element
output = gr.Textbox(label="Suggested Solution", lines=5)
# Create the Gradio interface
interface = gr.Interface(
fn=process_ticket, # Function to process inputs
inputs=[text_input, image_input], # User inputs (text and image)
outputs=output, # AI-generated output
title="Multimodal Customer Support Assistant",
description="Submit a description of your issue, along with an optional screenshot, and get AI-powered suggestions.",
)
# Launch the interface with debug mode
interface.launch(debug=True)
Trong đoạn mã trên, chúng ta:
- Định nghĩa hai đầu vào:
text_inputcho văn bảnimage_inputcho hình ảnh- Chỉ định một ô đầu ra để hiển thị phản hồi.
- Tạo giao diện, truyền các tham số như:
- Các đầu vào
- Hàm xử lý đầu vào
- Đầu ra do mô hình sinh ra
- Tiêu đề giao diện
- Mô tả (nếu cần)
- Thiết lập giao diện người dùng cơ bản.
- Khởi chạy giao diện với
debug = Trueđể gỡ lỗi. Khi mã đã chạy ổn định, hãy chuyển lại thànhFalse.
Giao diện cuối cùng sẽ trông như sau:

Ứng dụng Gradio trợ lý hỗ trợ khách hàng đa phương thức của chúng ta đã sẵn sàng! Để có phản hồi phù hợp hơn, hãy thử thay đổi tham số max_new_tokens hoặc điều chỉnh prompt một chút.
Các trường hợp sử dụng cho Llama 3.2 và Gradio
Ngoài bản demo chúng ta đã tạo trong hướng dẫn này, còn một vài trường hợp sử dụng khác cần ít công sức triển khai. Bao gồm:
- Giáo dục và dạy kèm: Học viên có thể tải lên các hỗ trợ trực quan như biểu đồ hoặc sơ đồ kèm câu hỏi, và mô hình có thể tạo phản hồi toàn diện kết hợp cả thông tin trực quan và văn bản.
- Sáng tạo nội dung: Cải thiện việc tạo chú thích, bài blog và nội dung mạng xã hội bằng cách sinh văn bản dựa trên hình ảnh.
- Trợ lý ảo bất động sản: Hỗ trợ môi giới và khách hàng bằng cách xử lý hình ảnh bất động sản và trả lời các câu hỏi liên quan. Tạo mô tả tài sản hoặc phân tích chi tiết hình ảnh từ ảnh chụp.
Thực hành tốt nhất khi phát triển với Llama 3.2 và Gradio
Với mỗi trường hợp sử dụng, có một vài mẹo mà mọi nhà phát triển có thể áp dụng khi xây dựng ứng dụng như chúng ta đã làm. Dưới đây là một số thực hành tốt nhất khi làm việc với các mô hình như Llama 3.2.
Xử lý độ trễ
Vì các tác vụ đa phương thức có thể tiêu tốn nhiều tài nguyên, giảm độ trễ là then chốt. Hãy cân nhắc tối ưu mô hình để phản hồi nhanh hơn bằng cách sử dụng bộ nhớ đệm, cắt tỉa mô hình hoặc giới hạn số lượng token được sinh ra.
Xử lý lỗi
Việc triển khai cơ chế xử lý lỗi là quan trọng. Trong trường hợp mô hình không tạo được phản hồi có ý nghĩa (ví dụ: do chất lượng hình ảnh kém), chúng ta có thể cung cấp phản hồi dự phòng hoặc thông báo lỗi. Thậm chí có thể chọn nhận phản hồi từ con người để giúp cải thiện mô hình.
Giám sát hiệu năng
Theo dõi hiệu năng ứng dụng, như thời gian phản hồi và dữ liệu tương tác người dùng, có thể giúp tối ưu giao diện và cải thiện trải nghiệm. Bằng cách ghi nhận thời gian hiệu năng, chúng ta có thể thử tối ưu độ trễ mô hình bằng các thư viện như bits and bytes.
Kết luận
Trong hướng dẫn này, chúng ta đã học cách kết hợp khả năng đa phương thức của Llama 3.2 và giao diện trực quan của Gradio. Từ hỗ trợ khách hàng đến giáo dục và sáng tạo nội dung, các ứng dụng tiềm năng rất đa dạng.
Bằng cách tuân thủ các thực hành tốt nhất như quản lý độ trễ, xử lý lỗi và giám sát hiệu năng, chúng ta có thể đảm bảo các ứng dụng Llama 3.2 và Gradio vững vàng, hiệu quả và thân thiện với người dùng.
Để tìm hiểu thêm, tôi khuyến nghị các bài hướng dẫn sau:
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.
