บทสรุปสำหรับผู้บริหาร

บทความนี้จะพาคุณเรียนรู้การใช้งาน CLIP (Contrastive Language-Image Pre-Training) สำหรับการค้นหาข้ามโมดาลิตี้ (Cross-modal Retrieval) ระหว่างรูปภาพและข้อความ ซึ่งเป็นเทคนิคพื้นฐานที่ใช้ในงาน e-commerce search, content moderation, และ image captioning

สิ่งที่คุณจะได้เรียนรู้:

Multi-modal Embedding คืออะไร?

Multi-modal Embedding คือเทคนิคการแปลงข้อมูลจากหลายโมดาลิตี้ (รูปภาพ, ข้อความ, เสียง) ให้อยู่ในรูปแบบ vector บนปริภูมิเดียวกัน ทำให้คอมพิวเตอร์สามารถเปรียบเทียบและจับคู่ข้อมูลต่างชนิดกันได้

CLIP เป็นโมเดลที่พัฒนาโดย OpenAI ที่สามารถ:

ตารางเปรียบเทียบบริการ Multi-modal API

บริการ ราคา ($/MTok) ความหน่วง (ms) วิธีชำระเงิน รุ่น CLIP ที่รองรับ เหมาะกับทีม
HolySheep AI $0.42 (DeepSeek V3.2) <50ms WeChat/Alipay, บัตร CLIP-ViT, Sentence-CLIP Startup, ทีมเล็ก, ผู้เริ่มต้น
OpenAI $8.00 200-500ms บัตรเครดิตเท่านั้น CLIP (ผ่าน Azure) องค์กรใหญ่
Anthropic $15.00 300-800ms บัตรเครดิตเท่านั้น ไม่รองรับ CLIP โดยตรง ทีม AI research
Google Gemini $2.50 100-300ms บัตรเครดิต Multi-modal embedding ทีม GCP

การติดตั้งและเริ่มต้นใช้งาน

ก่อนเริ่มต้น คุณต้องสมัครบัญชี ที่นี่ เพื่อรับ API key ฟรี พร้อมเครดิตเริ่มต้นสำหรับทดลองใช้งาน

pip install requests pillow numpy scikit-learn

โค้ดตัวอย่างที่ 1: การสร้าง Image Embedding

ตัวอย่างนี้แสดงวิธีแปลงรูปภาพเป็น vector โดยใช้ CLIP ผ่าน HolySheep API:

import requests
import base64
from io import BytesIO
from PIL import Image

def get_image_embedding(image_path: str, api_key: str) -> list:
    """
    สร้าง embedding vector จากรูปภาพโดยใช้ CLIP model
    
    Args:
        image_path: ที่อยู่ไฟล์รูปภาพ
        api_key: API key จาก HolySheep AI
    
    Returns:
        list: embedding vector (512 มิติ)
    """
    # โหลดรูปภาพและแปลงเป็น base64
    with open(image_path, "rb") as img_file:
        image_base64 = base64.b64encode(img_file.read()).decode('utf-8')
    
    # เรียกใช้ CLIP API ผ่าน HolySheep
    url = "https://api.holysheep.ai/v1/embeddings"
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    payload = {
        "model": "clip-vit-b-32",
        "input": image_base64,
        "input_type": "image"
    }
    
    response = requests.post(url, headers=headers, json=payload)
    response.raise_for_status()
    
    result = response.json()
    return result["data"][0]["embedding"]

ตัวอย่างการใช้งาน

api_key = "YOUR_HOLYSHEEP_API_KEY" image_path = "product_image.jpg" embedding = get_image_embedding(image_path, api_key) print(f"Embedding dimension: {len(embedding)}") print(f"Sample values: {embedding[:5]}")

โค้ดตัวอย่างที่ 2: การสร้าง Text Embedding และ Cross-modal Search

ตัวอย่างนี้แสดงการค้นหารูปภาพจากคำค้นหาข้อความ:

import requests
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

def get_text_embedding(text: str, api_key: str) -> list:
    """สร้าง embedding vector จากข้อความ"""
    url = "https://api.holysheep.ai/v1/embeddings"
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    payload = {
        "model": "clip-vit-b-32",
        "input": text,
        "input_type": "text"
    }
    
    response = requests.post(url, headers=headers, json=payload)
    response.raise_for_status()
    
    result = response.json()
    return result["data"][0]["embedding"]

def search_images_by_text(query: str, image_embeddings: list, 
                          image_ids: list, api_key: str, top_k: int = 5) -> list:
    """
    ค้นหารูปภาพที่ match กับคำค้นหามากที่สุด
    
    Args:
        query: คำค้นหา เช่น "red dress for summer"
        image_embeddings: list ของ embedding vectors
        image_ids: list ของ image identifiers
        api_key: API key
        top_k: จำนวนผลลัพธ์ที่ต้องการ
    
    Returns:
        list: รายการ (image_id, similarity_score) ที่ match มากที่สุด
    """
    # สร้าง query embedding
    query_embedding = get_text_embedding(query, api_key)
    query_vector = np.array(query_embedding).reshape(1, -1)
    
    # คำนวณความคล้ายคลึงกับทุกรูปภาพ
    similarities = []
    for img_emb, img_id in zip(image_embeddings, image_ids):
        img_vector = np.array(img_emb).reshape(1, -1)
        sim = cosine_similarity(query_vector, img_vector)[0][0]
        similarities.append((img_id, sim))
    
    # เรียงลำดับตามความคล้ายคลึงและเลือก top_k
    similarities.sort(key=lambda x: x[1], reverse=True)
    return similarities[:top_k]

ตัวอย่างการใช้งาน

api_key = "YOUR_HOLYSHEEP_API_KEY" query = "elegant leather bag for office"

ผลลัพธ์: [(img_042, 0.89), (img_127, 0.85), (img_003, 0.82), ...]

results = search_images_by_text(query, all_embeddings, all_image_ids, api_key) for img_id, score in results: print(f"{img_id}: {score:.4f}")

โค้ดตัวอย่างที่ 3: Batch Processing สำหรับระบบ E-commerce

ตัวอย่างนี้เหมาะสำหรับการประมวลผลรูปภาพสินค้าจำนวนมากในระบบ e-commerce:

import requests
import os
from concurrent.futures import ThreadPoolExecutor
from tqdm import tqdm

def batch_embed_images(image_folder: str, api_key: str, 
                       batch_size: int = 32) -> dict:
    """
    ประมวลผลรูปภาพทั้งหมดในโฟลเดอร์และสร้าง embedding database
    
    Args:
        image_folder: โฟลเดอร์ที่เก็บรูปภาพ
        api_key: API key
        batch_size: จำนวนรูปต่อ request
    
    Returns:
        dict: {image_filename: embedding_vector}
    """
    # อ่านรายชื่อไฟล์ทั้งหมด
    image_files = [f for f in os.listdir(image_folder) 
                   if f.lower().endswith(('.jpg', '.png', '.jpeg'))]
    
    embeddings_db = {}
    url = "https://api.holysheep.ai/v1/embeddings/batch"
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    
    # ประมวลผลเป็น batch
    for i in range(0, len(image_files), batch_size):
        batch_files = image_files[i:i+batch_size]
        batch_images = []
        
        for filename in batch_files:
            filepath = os.path.join(image_folder, filename)
            with open(filepath, "rb") as f:
                img_data = base64.b64encode(f.read()).decode('utf-8')
                batch_images.append({
                    "id": filename,
                    "data": img_data
                })
        
        # ส่ง batch request
        payload = {
            "model": "clip-vit-b-32",
            "inputs": batch_images,
            "input_type": "image"
        }
        
        try:
            response = requests.post(url, headers=headers, json=payload)
            response.raise_for_status()
            results = response.json()
            
            for item in results["data"]:
                embeddings_db[item["id"]] = item["embedding"]
                
            print(f"✓ Processed batch {i//batch_size + 1}/{(len(image_files)-1)//batch_size + 1}")
            
        except requests.exceptions.RequestException as e:
            print(f"✗ Error in batch {i//batch_size + 1}: {e}")
            continue
    
    return embeddings_db

ตัวอย่างการใช้งาน

api_key = "YOUR_HOLYSHEEP_API_KEY" image_folder = "./product_images" embeddings = batch_embed_images(image_folder, api_key) print(f"Total embeddings created: {len(embeddings)}")

ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

ข้อผิดพลาดที่ 1: Authentication Error - Invalid API Key

# ❌ วิธีที่ผิด - ใช้ API key ไม่ถูกต้อง
url = "https://api.holysheep.ai/v1/embeddings"
headers = {
    "Authorization": "Bearer YOUR_HOLYSHEEP_API_KEY",  # ต้องแทนที่ด้วย key จริง
    "Content-Type": "application/json"
}

✅ วิธีที่ถูกต้อง - ตรวจสอบว่าใช้ environment variable

import os api_key = os.environ.get("HOLYSHEEP_API_KEY") if not api_key: raise ValueError("กรุณาตั้งค่า HOLYSHEEP_API_KEY ใน environment variable") headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" }

หรือใช้ .env file

pip install python-dotenv

from dotenv import load_dotenv load_dotenv() api_key = os.getenv("HOLYSHEEP_API_KEY")

ข้อผิดพลาดที่ 2: Image Format Not Supported

# ❌ วิธีที่ผิด - ส่งไฟล์รูปภาพโดยตรงโดยไม่แปลง format
with open("image.webp", "rb") as f:
    image_data = f.read()

payload = {
    "input": image_data,  # ไม่ได้แปลงเป็น base64
    "input_type": "image"
}

✅ วิธีที่ถูกต้อง - แปลงรูปภาพเป็น JPEG ก่อนแล้วค่อย encode

from PIL import Image import base64 from io import BytesIO def prepare_image_for_api(image_path: str) -> str: """แปลงรูปภาพเป็น base64 โดยรับประกันว่าเป็น JPEG หรือ PNG""" img = Image.open(image_path) # แปลง mode ให้เหมาะสม