AI, LLMs, RAG, Multimodal

Vượt Ngoài Văn Bản: Xây dựng Hệ thống RAG Đa phương tiện cho Hình ảnh và Bảng biểu

Tìm hiểu cách tăng cường Retrieval Augmented Generation (RAG) với khả năng thị giác sử dụng cả giải pháp dựa trên API và giải pháp cục bộ.

Hệ thống RAG của bạn có đang gặp khó khăn với thông tin hình ảnh phong phú ẩn chứa trong hình ảnh và bảng biểu trong tài liệu không? Các phương pháp truyền thống chỉ dựa trên văn bản thường làm mất đi ngữ cảnh quan trọng. Bài viết này đi sâu vào thế giới RAG đa phương tiện, chỉ cho bạn cách xây dựng...…
Vượt Ngoài Văn Bản: Xây dựng Hệ thống RAG Đa phương tiện cho Hình ảnh và Bảng biểu
<a href="http://www.youtube.com/@engineerprompt">Prompt Engineering</a> Prompt Engineering Follow

Hệ thống RAG của bạn có đang gặp khó khăn với thông tin hình ảnh phong phú ẩn chứa trong hình ảnh và bảng biểu trong tài liệu không? Các phương pháp truyền thống chỉ dựa trên văn bản thường làm mất đi ngữ cảnh quan trọng. Bài viết này đi sâu vào thế giới RAG đa phương tiện, chỉ cho bạn cách xây dựng các hệ thống có thể hiểu và truy xuất thông tin trực tiếp từ hình ảnh. Dù bạn thích tận dụng các API mạnh mẽ như Embed-v4 của Cohere hay chạy mô hình cục bộ bằng các công cụ như ColPali, bạn sẽ học được các quy trình làm việc thực tế để khai thác những hiểu biết sâu sắc hơn từ dữ liệu của mình.

Điểm Mù của RAG Truyền thống

Hầu hết các hệ thống Retrieval Augmented Generation (RAG) ngày nay chỉ hoạt động trên văn bản. Chúng thường phân đoạn tài liệu, tạo embedding văn bản và truy xuất các đoạn văn bản liên quan để bổ sung cho phản hồi của một mô hình ngôn ngữ lớn (LLM). Nhưng điều gì xảy ra khi thông tin quan trọng được trình bày trực quan – trong biểu đồ, sơ đồ, ảnh hoặc bảng?

Cách giải quyết phổ biến bao gồm trích xuất các yếu tố hình ảnh này, sử dụng mô hình ngôn ngữ-thị giác (VLM) để tạo mô tả văn bản (chú thích), và sau đó embedding các mô tả này. Mặc dù hoạt động được, phương pháp này có những nhược điểm đáng kể:

  • Mất Ngữ cảnh: Một chú thích văn bản thường chỉ là phiên bản mô phỏng nhạt nhòa của hình ảnh hoặc bảng gốc, làm mất đi các chi tiết tinh tế, mối quan hệ không gian và mật độ thông tin.
  • Phụ thuộc vào Chất lượng Chú thích: Độ chính xác của thông tin truy xuất phụ thuộc hoàn toàn vào chất lượng của chú thích do VLM tạo ra và prompt được sử dụng để tạo ra nó.

Vấn đề: Việc chuyển đổi hình ảnh và bảng biểu thành văn bản cho RAG có thể dẫn đến mất mát thông tin và phụ thuộc vào các mô tả có thể không hoàn hảo.

Hướng tới Xử lý Thị giác Trực tiếp

Điều gì sẽ xảy ra nếu chúng ta có thể bỏ qua bước chuyển đổi văn bản và lập chỉ mục thông tin hình ảnh trực tiếp? Các phương pháp như Poli đã khám phá điều này bằng cách mã hóa các mảng vá hình ảnh (image patches) sử dụng bộ mã hóa thị giác (vision encoders). Tuy nhiên, những phương pháp này thường tạo ra các embedding phức tạp, đa cấp, đòi hỏi bộ nhớ đáng kể và không tương thích với hầu hết các cơ sở dữ liệu vector tiêu chuẩn.

Chào đón một thế hệ mô hình embedding đa phương tiện mới.

Embed-v4 của Cohere: Tìm kiếm Đa phương tiện Hiện đại nhất

Gần đây, Cohere đã phát hành Embed-v4, một mô hình embedding đa phương tiện mạnh mẽ được thiết kế để tăng cường khả năng tìm kiếm trên văn bản và hình ảnh. Các benchmark của họ cho thấy hiệu suất tiên tiến nhất trên các tác vụ truy xuất dựa trên thị giác, vượt qua các phương pháp trước đó.

Một ưu điểm chính là Embed-v4 tạo ra các embedding kích thước cố định, làm cho chúng tương thích trực tiếp với các kho lưu trữ vector phổ biến.

Quy trình làm việc: Vision RAG với Embed-v4

Dưới đây là quy trình làm việc điển hình sử dụng Embed-v4 của Cohere cho RAG dựa trên thị giác:

  1. Embedding Hình ảnh: Xử lý từng trang/hình ảnh trong tài liệu của bạn bằng mô hình Embed-v4 (input_type='image_document') để tạo embedding hình ảnh.
  2. Lưu trữ Vector: Lưu trữ các embedding hình ảnh này trong cơ sở dữ liệu vector bạn đã chọn.
  3. Embedding Truy vấn: Khi người dùng gửi một truy vấn (văn bản hoặc hình ảnh), hãy embedding nó bằng cùng mô hình Embed-v4 (input_type='search_query' hoặc 'image_query').
  4. Truy xuất: Thực hiện tìm kiếm tương đồng trong kho lưu trữ vector để tìm các embedding hình ảnh liên quan nhất dựa trên embedding truy vấn.
  5. Tạo sinh: Chuyển truy vấn gốc của người dùng và (các) hình ảnh được truy xuất đến một LLM đa phương tiện có khả năng (như Google Gemini).
  6. Tổng hợp Câu trả lời: LLM đa phương tiện phân tích cả truy vấn và ngữ cảnh hình ảnh của (các) hình ảnh để tạo ra câu trả lời cuối cùng.

(Tổng quan triển khai này được lấy cảm hứng từ một bài đăng của Nils Reimers, VP of AI Search tại Cohere.)

Chi phí và Hiệu suất: Lượng tử hóa Embedding (Embedding Quantization)

Embedding đa phương tiện có thể có kích thước lớn. Embed-v4 của Cohere cung cấp sự linh hoạt với các chiều (ví dụ: 1024). Để quản lý chi phí lưu trữ và tính toán, bạn có thể áp dụng lượng tử hóa embedding.

Tương tự như việc lượng tử hóa trọng số của LLM, bạn có thể giảm độ chính xác của các vector embedding (ví dụ: từ float 32-bit xuống số nguyên 8-bit hoặc 4-bit). Các nghiên cứu cho thấy lượng tử hóa có thể giảm đáng kể chi phí trong khi vẫn bảo toàn phần lớn hiệu suất truy xuất.

Mẹo: Khám phá các kỹ thuật lượng tử hóa embedding để tối ưu hóa chi phí và tốc độ. Xem video liên quan về lượng tử hóa embedding này để biết thêm chi tiết.

Hướng dẫn Triển khai 1: Dựa trên API (Cohere Embed-v4 & Gemini)

Phương pháp này sử dụng API của Cohere để embedding/truy xuất và API Gemini của Google để tạo sinh.

Các bước:

  1. Cài đặt Thư viện: pip install cohere google-generativeai python-dotenv Pillow
  2. Lấy API Keys:
  3. Khởi tạo Clients: Thiết lập Cohere và Gemini clients với API keys của bạn.
  4. Chuẩn bị Hình ảnh:
    • Chuyển đổi tài liệu (như PDF) thành hình ảnh (một hình ảnh cho mỗi trang/phần liên quan).
    • Đảm bảo hình ảnh ở định dạng phù hợp (ví dụ: PNG, JPG) và cân nhắc thay đổi kích thước nếu cần thiết (mặc dù giảm kích thước quá mức có thể làm giảm chất lượng).
  5. Tải Dữ liệu: Thu thập các tệp hình ảnh của bạn (ví dụ: infographics, bảng biểu đã quét).
  6. Tạo & Lưu trữ Image Embeddings:

    import cohere
    import numpy as np
    from PIL import Image
    import os
    
    # Initialize Cohere client (ensure COHERE_API_KEY is set as env var)
    co = cohere.Client(os.environ.get("COHERE_API_KEY"))
    
    image_folder = 'path/to/your/images'
    image_files = [os.path.join(image_folder, f) for f in os.listdir(image_folder) if f.endswith(('.png', '.jpg', '.jpeg'))]
    
    image_embeddings = []
    for img_path in image_files:
        img = Image.open(img_path)
        response = co.embed(
            images=[img],
            model='embed-multilingual-v3.0', # Or the specific Embed-v4 model name
            input_type='image_document'
        )
        image_embeddings.append(response.embeddings[0])
    
    # Store embeddings (e.g., in a NumPy array or vector DB)
    image_embeddings_np = np.array(image_embeddings)
    # In production, use a proper vector store (ChromaDB, Pinecone, etc.)
  7. Triển khai Tìm kiếm/Truy xuất:

    def search_images(query_text, embeddings_np, image_filenames):
        response = co.embed(
            texts=[query_text],
            model='embed-multilingual-v3.0', # Use the same model
            input_type='search_query'
        )
        query_embedding = np.array(response.embeddings[0])
    
        # Calculate similarity (e.g., dot product for normalized embeddings)
        similarities = np.dot(embeddings_np, query_embedding)
    
        # Get top result
        top_index = np.argmax(similarities)
        return image_filenames[top_index], similarities[top_index]
  8. Tùy chọn: Sắp xếp lại (Re-ranking): Truy xuất N hình ảnh hàng đầu và sử dụng một bộ sắp xếp lại (có thể dựa trên thị giác) để cải thiện lựa chọn cuối cùng.
  9. Tạo Câu trả lời với Gemini:

    import google.generativeai as genai
    from PIL import Image
    
    # Configure Gemini Client (ensure GOOGLE_API_KEY is set)
    genai.configure(api_key=os.environ.get("GOOGLE_API_KEY"))
    generation_model = genai.GenerativeModel('gemini-1.5-flash-preview') # Or another multimodal model
    
    user_query = "What is the net profit of Nike?"
    retrieved_image_path, score = search_images(user_query, image_embeddings_np, image_files)
    
    print(f"Retrieved: {retrieved_image_path} with score {score:.4f}")
    
    # Pass image and query to Gemini
    retrieved_image = Image.open(retrieved_image_path)
    response = generation_model.generate_content([user_query, retrieved_image])
    
    print("\nAnswer:")
    print(response.text)

Kết quả Ví dụ (Phương pháp API):

  • Truy vấn: "What is the net profit of Nike?"
    • Truy xuất: Xác định chính xác infographic của Nike.
    • Tạo sinh: Gemini phân tích hình ảnh và trích xuất câu trả lời: "Dựa trên hình ảnh trực quan hóa báo cáo thu nhập Q3 Năm Tài chính 2025 của Nike được cung cấp, lợi nhuận ròng của Nike kết thúc vào tháng 2 năm 2025 là 1,8 tỷ đô la."
  • Truy vấn: "What would be the net profit of Tesla without interest?"
    • Truy xuất: Truy xuất infographic của Tesla.
    • Tạo sinh: Gemini xác định các con số lợi nhuận và lãi suất từ hình ảnh, thực hiện phép tính và cung cấp kết quả, thể hiện khả năng suy luận trên dữ liệu hình ảnh.

Hướng dẫn Triển khai 2: Mô hình Cục bộ (ColPali & Gemini)

Phương pháp này giữ việc embedding và truy xuất cục bộ bằng cách sử dụng một mô hình như ColPali, giảm sự phụ thuộc vào các API bên ngoài cho phần đó. Việc tạo sinh vẫn sử dụng Gemini ở đây, nhưng có thể được thay thế bằng một VLM cục bộ.

Các bước:

  1. Cài đặt Thư viện: pip install vector-retrieval transformers torch (Lưu ý: vector-retrieval hoặc các thư viện tương tự xử lý việc lập chỉ mục/tìm kiếm ColBERT/ColPali. Bạn cũng có thể cần poppler-utils để chuyển đổi PDF: sudo apt-get install poppler-utils trên Debian/Ubuntu).
  2. Hugging Face Token (Tùy chọn): Có thể cần thiết để tải xuống các mô hình từ Hugging Face Hub.
  3. Tải Mô hình ColPali & Chỉ mục:

    from vector_retrieval.models import ColPali # Example import
    from vector_retrieval.indexing import Indexer # Example import
    
    # Load the model
    model_name = 'google/colpali-mathvista-flan' # Example ColPali model
    retriever = ColPali(model_name)
    
    # Point to your image folder and create/load an index
    image_folder = 'path/to/your/images'
    index_path = 'path/to/save/index'
    indexer = Indexer(retriever)
    indexer.index_documents(corpus_path=image_folder, index_path=index_path)
    # In subsequent runs, load the index: retriever.load_index(index_path)
  4. Thực hiện Tìm kiếm:
    def search_local(query_text, retriever, k=1):
        results = retriever.search(query_text, k=k)
        # Results format depends on the library, typically includes doc IDs (filenames) and scores
        return results
  5. Tạo sinh (Tương tự phương pháp API):
    • Truy xuất (các) đường dẫn hình ảnh hàng đầu từ kết quả tìm kiếm cục bộ.
    • Tải hình ảnh.
    • Chuyển hình ảnh và truy vấn gốc đến LLM đa phương tiện bạn đã chọn (Gemini API hoặc VLM cục bộ).

Kết quả Ví dụ (Phương pháp Cục bộ):

Sử dụng cùng các truy vấn (lợi nhuận Nike, các thương vụ mua lại của Google, lợi nhuận Tesla không tính lãi), bộ truy xuất ColPali cục bộ đã xác định và xếp hạng thành công infographic chính xác ở vị trí cao nhất. Hình ảnh được truy xuất này sau đó được chuyển đến mô hình tạo sinh (Gemini trong ví dụ này) để tổng hợp câu trả lời cuối cùng, mang lại kết quả tương tự như phương pháp API.

Kết luận: Nhìn thấy là Tin tưởng đối với RAG

RAG dựa trên thị giác, sử dụng lập chỉ mục và truy xuất hình ảnh trực tiếp, tăng cường đáng kể khả năng trích xuất thông tin từ các tài liệu trực quan phong phú so với các giải pháp thay thế dựa trên chú thích văn bản. Cho dù bạn chọn sức mạnh và sự đơn giản của các API như Cohere Embed-v4 hay ưu tiên kiểm soát cục bộ với các mô hình như ColPali, khả năng đa phương tiện đại diện cho một bước tiến lớn.

Khi tìm kiếm doanh nghiệp và truy xuất thông tin tiếp tục phát triển, việc tích hợp hiểu biết thị giác trực tiếp vào các quy trình RAG sẽ rất quan trọng để khai thác toàn bộ giá trị của các nguồn dữ liệu đa dạng.

Tài nguyên & Đọc thêm

  • Cohere Embed-v4: Bài đăng Blog
  • Example Colab Notebook (Phương pháp API): Google Colab
  • Bài đăng của Nils Reimers (Nguồn cảm hứng): X.com
  • Video liên quan (Lượng tử hóa Embedding): YouTube
  • Video liên quan (Truy xuất Ngữ cảnh): YouTube