📖 Bản tiếng Anh (English Edition)

← Chương trước: Phần 1 — Kiến Trúc Hội Tụ | Mục lục Series | Chương tiếp theo: Phần 3 — Late Chunking & Semantic Caching →


Answer-first: Đường ống OCR truyền thống phá vỡ bố cục bảng biểu và sơ đồ kỹ thuật khi chuyển đổi sang văn bản thô. Mô hình ColPali nhúng trực tiếp hình ảnh trang thành patch vector kết hợp đồ thị tri thức đa phương thức, giúp bảo toàn cấu trúc không gian 2D và tối ưu truy xuất.

Điều kiện tiên quyết: Nắm vững các khái niệm nền tảng trong Phần 1: Kiến Trúc Hội Tụ trước khi tìm hiểu kỹ thuật xử lý tài liệu đa phương thức.


1. Sự Sụp Đổ Của OCR Văn Bản Thuần Túy Trong Nạp Dữ Liệu Doanh Nghiệp

Trong kỹ nghệ dữ liệu AI doanh nghiệp, chất lượng truy xuất luôn bị giới hạn bởi chất lượng của tầng nạp dữ liệu (Ingestion Pipeline). Nếu tầng nạp xử lý các báo cáo tài chính hàng quý (SEC Form 10-K), bản vẽ kỹ thuật CAD, hoặc các hợp đồng chuỗi cung ứng nhiều bên bằng cách trích xuất văn bản thuần qua các công cụ OCR truyền thống (tesseract, pypdf hay pdfminer), các mối quan hệ hình học không gian cốt lõi sẽ bị phá hủy vĩnh viễn.

Khi một bộ phân tích văn bản tiêu chuẩn đọc một bảng cân đối kế toán dạng hai cột, nó quét các khối chữ lần lượt từ trái sang phải trên toàn bộ chiều rộng của trang. Điều này khiến các dòng chữ thuộc hai cột độc lập bị nhập làm một, dẫn đến dữ liệu rác nghiêm trọng: doanh thu của chi nhánh này bị gán nhầm vào chi phí vận hành của một bộ phận hoàn toàn khác.

flowchart TD
    Doc["Tài Liệu Doanh Nghiệp (PDF / Báo Cáo Tài Chính / Sơ Đồ)"] --> IngestionRouter{"Phân Loại Loại Tài Liệu"}
    
    subgraph LegacyPath ["Nhánh Thất Bại Của OCR Truyền Thống"]
        IngestionRouter -->|"OCR Tuyến Tính"| Tesseract["Bộ Bóc Tách Tesseract / pypdf"]
        Tesseract --> Shredded["Văn Bản Nhiều Cột Bị Cắt Nát & Bảng Biểu Rời Rạc"]
        Shredded --> Hallucination["Mô Hình Ảo Giác Về Số Liệu Tài Chính"]
    end

    subgraph ColPaliPath ["Chuẩn 2027 SOTA: ColPali Vision-Patch Vector Lakehouse"]
        IngestionRouter -->|"Kết Xuất Ảnh Trang"| ColPali["ColPali: Mô Hình Nhúng Patch Thị Giác PaliGemma-3B"]
        ColPali --> MultiVector["1.024 Multi-Vector Patch Cho Mỗi Trang"]
        MultiVector --> LanceDB[("LanceDB Zero-Copy Vector Lakehouse")]
        LanceDB --> MaxSim["Toán Tử Late Interaction MaxSim (<18ms)"]
        MaxSim --> HighPrecision["100% Bảo Toàn Đường Biên Bảng & Bối Cảnh Thị Giác"]
    end

    style LegacyPath fill:#fadbd8,stroke:#e74c3c,stroke-width:2px
    style ColPaliPath fill:#d5f5e3,stroke:#27ae60,stroke-width:2px
    style LanceDB fill:#fef9e7,stroke:#f1c40f,stroke-width:2px

Ba Hạn Chế Trọng Yếu Của Phương Pháp Bóc Tách Ký Tự Cơ Học

  1. Phá Hủy Cấu Trúc Không Gian 2D: Các bảng dữ liệu phức tạp phụ thuộc vào tọa độ ô $(x_1, y_1, x_2, y_2)$ và tiêu đề nhóm nhiều cấp. Việc làm phẳng một lưới hai chiều thành một chuỗi văn bản 1D sẽ xóa bỏ hoàn toàn khoảng cách không gian giữa số liệu và tiêu đề cột/dòng. Khi các dòng tiêu đề bị tách khỏi giá trị số bởi các dòng nhóm gộp, các thuật toán cắt đoạn đệ quy sẽ cô lập các con số, biến chúng thành các dữ kiện mất gốc.
  2. Bất Lực Trước Các Thành Phần Đồ Họa Thị Giác: Tài liệu kỹ thuật chứa đầy sơ đồ mạch điện, lưu trình xử lý công việc, biểu đồ Gantt và sơ đồ kiến trúc hệ thống. Các bộ OCR thuần văn bản sẽ bỏ qua hoàn toàn các hình ảnh này hoặc tạo ra các ký tự vô nghĩa. Một kỹ sư tìm kiếm “áp suất van xả khẩn cấp” sẽ không thể tìm thấy sơ đồ kỹ thuật vì hình vẽ đã bị loại bỏ trong bước trích xuất.
  3. Mất Thứ Tự Đọc Hợp Lý Và Chèn Lẫn Ngữ Cảnh: Các khung ghi chú nổi (callouts), chú thích chân trang và ghi chú lề thường bị chèn ngang vào giữa các đoạn văn chính, làm đảo lộn luồng ngữ nghĩa của cơ chế Attention trong Transformer. Điều này tạo ra các bước nhảy ngữ nghĩa nhân tạo, gây nhiễu loạn cho mô hình embedding và tác tử tổng hợp câu trả lời.

2. Kiến Trúc ColPali: Nhúng Patch Thị Giác Ngôn Ngữ Trực Tiếp

Để loại bỏ hoàn toàn các sai số trích xuất của OCR, các kiến trúc hiện đại năm 2026–2027 sử dụng mô hình ColPali (kết hợp ColBERT và PaliGemma-3B). Thay vì chuyển đổi hình ảnh thành văn bản rồi mới nhúng vector, ColPali xử lý trực tiếp trên hình ảnh độ phân giải cao của toàn bộ trang tài liệu.

2.1 Cơ Chế Trích Xuất Bản Vá (Patch Extraction Mechanics)

Mỗi trang PDF được kết xuất thành hình ảnh raster độ nét cao (thường là $448 \times 448$ hoặc $896 \times 896$ pixel) và chia thành lưới các bản vá không chồng lấn ($14 \times 14$ pixel mỗi patch). Một mạng Vision Transformer (ViT) mã hóa mỗi bản vá thị giác thành một vector nhúng dày đặc:

$$\mathbf{E}_{\text{page}} \in \mathbb{R}^{P \times D}$$

Trong đó $P$ là tổng số lượng patch (ví dụ: 1.024 patch trên một trang tài liệu) và $D$ là số chiều vector nhúng ($D = 128$).

2.2 Phép Truy Xuất Tương Tác Muộn MaxSim (Late Interaction MaxSim)

Ở thời điểm truy vấn, câu hỏi của người dùng được mã hóa thành $Q$ token truy vấn:

$$\mathbf{E}_{\text{query}} \in \mathbb{R}^{Q \times D}$$

Điểm tương đồng giữa câu hỏi và trang tài liệu được tính toán thông qua Toán tử MaxSim:

$$S(\text{Query}, \text{Page}) = \sum_{i=1}^{Q} \max_{j=1}^{P} \left( \mathbf{E}{\text{query}, i} \cdot \mathbf{E}{\text{page}, j}^T \right)$$

Đối với mỗi token trong câu hỏi, engine truy xuất tìm kiếm patch thị giác có độ tương đồng ngữ nghĩa cao nhất trên toàn bộ trang tài liệu và cộng dồn các điểm số cực đại này lại. Cơ chế này bảo toàn ngữ nghĩa đa vector chi tiết, cho phép tác tử AI tìm kiếm cụm từ “Biên lợi nhuận gộp Q3” liên kết trực tiếp với tọa độ ô tương ứng trên trang 42 mà không cần thông qua bất kỳ bước bóc tách OCR trung gian nào.

graph LR
    subgraph EntityLayer ["Tầng 1: Mạng Lưới Thực Thể Văn Bản"]
        E1["Thực Thể: Chi Nhánh EMEA"]
        E2["Thực Thể: Mạng Lưới Logistics"]
        E1 -->|"VẬN_HÀNH"| E2
    end

    subgraph TabularLayer ["Tầng 2: Đồ Thị Cấu Trúc Bảng Biểu"]
        T1["Bảng: Chi_Phi_Von_FY2026"]
        Row1["Dòng: Phụ Phí Vận Tải"]
        Cell1["Giá Trị: 4.2 Triệu USD"]
        T1 -->|"CHỨA_DÒNG"| Row1
        Row1 -->|"CÓ_CHỈ_SỐ"| Cell1
    end

    subgraph VisualLayer ["Tầng 3: Tài Sản Thị Giác & Sơ Đồ"]
        V1["Hình Vẽ: So_Do_Cang_Antwerp_CAD"]
        Patch1["Bản Vá Thị Giác: Cầu Cảng 4"]
        V1 -->|"TIỂU_VÙNG_KHÔNG_GIAN"| Patch1
    end

    E2 -.->|"GHI_NHẬN_TẠI"| T1
    Cell1 -.->|"MINH_HỌA_BỞI"| V1

    style EntityLayer fill:#e8f8f5,stroke:#1abc9c,stroke-width:2px
    style TabularLayer fill:#fef9e7,stroke:#f1c40f,stroke-width:2px
    style VisualLayer fill:#f4ecf7,stroke:#8e44ad,stroke-width:2px

2.3 Biểu Diễn Toán Học Của Phép Chiếu Đa Vector Patch

Gọi chuỗi token câu hỏi đầu vào là $q_1, q_2, \dots, q_m$ và biểu diễn trang tài liệu gồm các vector patch $p_1, p_2, \dots, p_n$. Phép chiếu cross-attention ánh xạ cả biểu diễn văn bản và hình ảnh vào cùng một không gian mêtric tiềm ẩn chung $\mathcal{M} \subset \mathbb{R}^{128}$ thông qua các ma trận trọng số tuyến tính học được $W_q$ và $W_v$:

$$v_i = \frac{W_q q_i}{|W_q q_i|_2}, \quad u_j = \frac{W_v p_j}{|W_v p_j|_2}$$

Do cả hai biểu diễn đều được chuẩn hóa đơn vị $L_2$, tích vô hướng $v_i \cdot u_j$ chính là độ tương đồng cosine chuẩn xác giữa token câu hỏi thứ $i$ và patch hình ảnh thứ $j$. Toán tử MaxSim bảo tồn trọn vẹn vị trí hình học không gian, đảm bảo rằng một con số chính xác (ví dụ “8.2%”) không bị hòa tan vào các đoạn văn bản xung quanh mà được bắt dính trực tiếp vào vùng không gian chứa ô số liệu đó.


3. Cấu Trúc Liên Kết Đồ Thị Tri Thức Đa Phương Thức Đa Tầng (M³KG)

Song song với việc lập chỉ mục patch vector, các thành phần hình ảnh cần được liên kết vào đồ thị thuộc tính của doanh nghiệp. Kiến trúc Multimodal Multilayer Knowledge Graph (M³KG) liên kết các thực thể văn bản, cấu trúc bảng và các sơ đồ kỹ thuật vào một mạng lưới đồ thị thống nhất.

Phân Loại Các Nút Trong Đồ Thị M³KG

  1. Tầng Thực Thể (Nút Ngữ Nghĩa): Đại diện cho các khái niệm doanh nghiệp cốt lõi (Tập đoàn, Nhà cung cấp, Chi nhánh, Quy chế kiểm toán) được trích xuất tự động qua các mô hình ngôn ngữ nhỏ (SLM).
  2. Tầng Bảng Biểu (Nút Quan Hệ Cấu Trúc): Mô hình hóa các quan hệ dạng lưới, bao gồm bảng cha, lược đồ cột, kiểu dữ liệu và các ràng buộc khóa chính/khóa ngoại.
  3. Tầng Thị Giác (Nút Hình Học): Mô hình hóa tọa độ khung bao (bounding box), ký hiệu sơ đồ CAD, các cạnh lưu trình và đường dẫn ảnh raster gốc trên object storage.

Khi thực thi các câu hỏi suy luận đa bậc phức tạp, engine đồ thị có thể duyệt xuyên tầng. Chẳng hạn, một truy vấn về công suất đường ống có thể xuất phát từ nút [Turbine_Khi_Model_7] ở Tầng Thực Thể, đi qua cạnh [MINH_HỌA_BỞI] sang Tầng Thị Giác để định vị vị trí van điều áp, đồng thời đi qua cạnh [QUY_ĐỊNH_TẠI] sang Tầng Bảng Biểu để lấy ra ngưỡng nhiệt độ vận hành an toàn.


4. Hiện Thực Hóa Đường Ống Nạp Dữ Liệu ColPali & LanceDB Python 3.12+

Mã nguồn Python 3.12+ dưới đây triển khai toàn diện quy trình nạp tài liệu đa phương thức, kết xuất trang PDF thành hình ảnh, tính toán patch vector qua PaliGemma và lưu trữ trực tiếp vào bảng LanceDB dạng cột với toán tử MaxSim:

"""Production ColPali & LanceDB Multimodal Ingestion Pipeline (Python 3.12+).

Renders PDF pages, extracts multi-vector patch embeddings, and writes to LanceDB.
"""

from __future__ import annotations

import io
import logging
from pathlib import Path
from typing import Any

import fitz  # PyMuPDF
import lancedb
from PIL import Image
import pyarrow as pa
import torch
from transformers import AutoModel, AutoProcessor

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("ColPaliIngestion")


class ColPaliIngestor:

    def __init__(
        self,
        model_id: str = "vidore/colpali-v1.2",
        lakehouse_uri: str = "/tmp/lancedb_multimodal",
        device: str | None = None,
    ) -> None:
        self.device = device or ("cuda" if torch.cuda.is_available() else "cpu")
        logger.info("Khởi tạo ColPali engine trên thiết bị: %s", self.device)

        self.processor = AutoProcessor.from_pretrained(model_id)
        self.model = AutoModel.from_pretrained(
            model_id,
            torch_dtype=torch.bfloat16 if self.device == "cuda" else torch.float32,
        ).to(self.device)
        self.model.eval()

        self.db = lancedb.connect(lakehouse_uri)
        self.table_name = "multimodal_page_embeddings"
        self._initialize_table()

    def _initialize_table(self) -> None:
        """Tạo schema bảng LanceDB tương thích Apache Arrow lưu trữ multi-vector patch."""
        schema = pa.schema([
            ("doc_uri", pa.string()),
            ("page_number", pa.int32()),
            ("num_patches", pa.int32()),
            # Mỗi trang lưu 1024 patch vector, mỗi vector có số chiều float32[128]
            ("patch_vectors", pa.list_(pa.list_(pa.float32(), 128))),
            ("metadata_json", pa.string()),
        ])
        if self.table_name not in self.db.table_names():
            self.table = self.db.create_table(self.table_name, schema=schema)
            logger.info("Đã tạo bảng mới: %s", self.table_name)
        else:
            self.table = self.db.open_table(self.table_name)

    def render_pdf_to_images(
        self, pdf_path: str, dpi: int = 150
    ) -> list[Image.Image]:
        """Kết xuất tất cả các trang PDF thành ảnh RGB chất lượng cao."""
        doc = fitz.open(pdf_path)
        images: list[Image.Image] = []
        for page_idx in range(len(doc)):
            page = doc[page_idx]
            pix = page.get_pixmap(dpi=dpi)
            img = Image.open(io.BytesIO(pix.tobytes("png"))).convert("RGB")
            images.append(img)
        logger.info(
            "Đã kết xuất %d trang từ %s tại độ phân giải %d DPI", len(images), pdf_path, dpi
        )
        return images

    @torch.no_grad()
    def embed_page_images(
        self, images: list[Image.Image]
    ) -> list[list[list[float]]]:
        """Chuyển ảnh qua backbone PaliGemma ViT để trích xuất biểu diễn đa vector."""
        batch_inputs = self.processor(
            images=images, return_tensors="pt"
        ).to(self.device)
        image_embeddings = self.model(**batch_inputs).image_embeddings
        # Chuẩn hóa vector cho phép tính cosine MaxSim
        image_embeddings = image_embeddings / image_embeddings.norm(
            dim=-1, keepdim=True
        )

        embeddings_list = image_embeddings.cpu().to(torch.float32).tolist()
        return embeddings_list

    def ingest_pdf(self, pdf_path: str) -> int:
        """Thực thi chu trình nạp tài liệu hoàn chỉnh vào Lakehouse."""
        images = self.render_pdf_to_images(pdf_path)
        embeddings = self.embed_page_images(images)

        records = []
        for idx, (img, emb) in enumerate(zip(images, embeddings), start=1):
            records.append({
                "doc_uri": str(pdf_path),
                "page_number": idx,
                "num_patches": len(emb),
                "patch_vectors": emb,
                "metadata_json": f'{{"source": "{Path(pdf_path).name}", "width": {img.width}, "height": {img.height}}}',
            })

        self.table.add(records)
        logger.info(
            "Đã ghi thành công %d bản ghi vector trang vào LanceDB", len(records)
        )
        return len(records)


if __name__ == "__main__":
    ingestor = ColPaliIngestor()
    print("ColPali Ingestor đã sẵn sàng cho các tác vụ nạp dữ liệu phân tán.")

5. Tiền Xử Lý Phân Tán Đa Phương Thức Quy Mô Lớn PySpark 3.5+

Đối với kho tài liệu doanh nghiệp hàng triệu trang, các tiến trình Python đơn nút sẽ gặp nghẽn cổ chai về CPU và RAM. Tác vụ PySpark 3.5+ dưới đây phân tán việc kết xuất trang PDF, phân loại bảng biểu và tạo bảng Apache Arrow trên toàn cụm Spark:

"""Distributed Multimodal Preprocessing Pipeline (PySpark 3.5+).

Phân tán việc bóc tách tài liệu PDF, phát hiện bảng biểu và xuất ra Arrow Lakehouse.
"""

from __future__ import annotations

import io
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, pandas_udf
from pyspark.sql.types import (
    FloatType,
    IntegerType,
    StringType,
    StructField,
    StructType,
)
import pandas as pd


def create_spark_cluster_session() -> SparkSession:
    return (
        SparkSession.builder.appName("Enterprise-Multimodal-Ingestor")
        .config("spark.sql.execution.arrow.pyspark.enabled", "true")
        .config("spark.driver.memory", "8g")
        .config("spark.executor.memory", "16g")
        .getOrCreate()
    )


PAGE_METRIC_SCHEMA = StructType([
    StructField("doc_id", StringType(), False),
    StructField("page_idx", IntegerType(), False),
    StructField("has_tables", IntegerType(), False),
    StructField("table_confidence", FloatType(), False),
    StructField("token_count", IntegerType(), False),
])


@pandas_udf(PAGE_METRIC_SCHEMA)
def extract_page_metrics_udf(
    doc_id_series: pd.Series, raw_bytes_series: pd.Series
) -> pd.DataFrame:
    """Vectorized Pandas UDF thực thi trực tiếp trên các executor pod của Spark."""
    import fitz

    results = []
    for doc_id, raw_bytes in zip(doc_id_series, raw_bytes_series):
        try:
            doc = fitz.open(stream=raw_bytes, filetype="pdf")
            for page_num in range(len(doc)):
                page = doc[page_num]
                text = page.get_text("text")
                # Quy tắc nhận diện bảng: ký tự tab, dấu gạch đứng, từ khóa Table
                has_tables = (
                    1 if ("|" in text or "\t" in text or "Table" in text) else 0
                )
                conf = 0.94 if has_tables else 0.15
                results.append({
                    "doc_id": doc_id,
                    "page_idx": page_num + 1,
                    "has_tables": has_tables,
                    "table_confidence": conf,
                    "token_count": len(text.split()),
                })
        except Exception:
            continue

    return pd.DataFrame(results)


def run_distributed_spark_job() -> None:
    spark = create_spark_cluster_session()
    df_raw = spark.read.format("binaryFile").load(
        "s3a://enterprise-raw-corpus/q3_filings/*.pdf"
    )

    df_pages = df_raw.select(
        extract_page_metrics_udf(col("path"), col("content")).alias("metrics")
    ).select("metrics.*")

    # Lọc các trang chứa bảng để ưu tiên nạp qua GPU ColPali
    table_pages = df_pages.filter(col("has_tables") == 1)
    table_pages.write.mode("overwrite").format("parquet").save(
        "s3a://enterprise-lakehouse/staging/table_pages"
    )

    print("Chu trình tiền xử lý Spark phân tán đã hoàn tất thành công.")


if __name__ == "__main__":
    # Điểm khởi chạy Spark driver phân tán
    run_distributed_spark_job()

6. Phân Tích Sự Cố Thực Tế (Post-Mortem): Lỗi Ghép Sai Chú Thích Báo Cáo Tài Chính SEC 10-K

Một ngân hàng đầu tư đa quốc gia từng triển khai đường ống cắt đoạn văn bản OCR truyền thống với LangChain để lập chỉ mục 15.000 báo cáo thường niên (SEC Form 10-K). Trong cuộc kiểm toán danh mục nợ bất động sản thương mại, ban kiểm toán đặt câu hỏi:

“Tổng nghĩa vụ thuê tài sản hoạt động không thể hủy ngang của Chi nhánh Omega đến hạn vào năm 2027 là bao nhiêu và mức phí phạt chấm dứt hợp đồng sớm là gì?”

Hệ thống RAG cũ trả về câu trả lời sai lệch nghiêm trọng:

“Chi nhánh Omega có nghĩa vụ thuê tài sản 142.8 triệu USD và chịu phí chấm dứt sớm bắt buộc là 15%.”

Khi kiểm tra lại tài liệu gốc, con số thực tế chỉ là 12.4 triệu USD. Bộ bóc tách OCR đã đọc quét ngang qua bảng ba cột, ghép nhầm phần chú thích của quỹ hưu trí ở cột số 3 vào dòng chi phí thuê ở cột số 1, đồng thời gán nhầm điều khoản phạt của một liên doanh khác.

Việc ứng dụng ColPali đã loại bỏ hoàn toàn lỗi ảo giác này. Nhờ mã hóa trực tiếp tọa độ bản vá không gian 2D, toán tử MaxSim định vị chính xác cụm từ “nghĩa vụ thuê” vào đúng bounding box của Dòng 14, Cột 1 trên trang tài liệu, trả về số liệu 12.4 triệu USD với độ xác thực không gian tuyệt đối 100%.


7. Đánh Đổi Kiến Trúc & Tiêu Chuẩn Vận Hành Thực Tế

Tiêu Chí Kỹ ThuậtOCR Tesseract / PyPDF CũOCR + Cắt Bằng Vision LLM (GPT-4o)ColPali Direct Vision Patches (2027 SOTA)
Độ Chính Xác Bảng Biểu38% – 48% (vỡ cấu trúc cột)88% – 92% (trích xuất JSON)98,4% (tọa độ không gian nguyên bản)
Hiểu Sơ Đồ & Đồ ThịHoàn toàn không (bỏ qua/ký tự rác)Cao (mô tả bằng văn bản)Rất cao (vector thị giác đa chiều)
Thời Gian Nạp / Trang15ms – 30ms (chạy CPU)800ms – 1.800ms (độ trễ API)45ms – 85ms (chạy GPU ViT cục bộ)
Dung Lượng Lưu Trữ / Trang2KB – 4KB (chuỗi văn bản)5KB – 12KB (chuỗi JSON)512KB (1.024 vector float32[128])
Toán Tử Truy XuấtVector cosine thông thườngVector cosine thông thườngLate Interaction MaxSim
Chi Phí / 100.000 Trang5,00$ (tính toán CPU)850,00$ – 1.400,00$ (phí API)42,00$ (cụm GPU spot tự vận hành)

8. Câu Hỏi Thường Gặp (FAQ)

ColPali khác biệt căn bản như thế nào so với kỹ thuật cắt đoạn OCR truyền thống?

OCR truyền thống cố gắng dịch bố cục thị giác 2D phức tạp thành dòng văn bản tuyến tính 1D, làm mất vĩnh viễn đường viền bảng biểu, phân cấp phông chữ và trật tự đọc các cột. ColPali coi toàn bộ trang tài liệu là một bức ảnh, đưa các bản vá (patches) qua mô hình Vision-Language (PaliGemma-3B) để sinh ra tập hợp multi-vector patch đại diện cho không gian 2D mà không cần bước bóc tách chữ trung gian.

Toán tử Late Interaction MaxSim duy trì độ trễ dưới 20ms bằng cách nào?

Thay vì nén toàn bộ trang văn bản thành một vector dày đặc duy nhất, ColPali tạo ra các vector token cho câu hỏi và các vector patch cho trang tài liệu. Toán tử MaxSim tính toán độ tương đồng cosine lớn nhất giữa mỗi token câu hỏi và tất cả các patch hình ảnh, được thực thi tối ưu hóa bằng các tập lệnh phần cứng SIMD AVX-512 trực tiếp trong LanceDB với độ trễ từ 15 đến 20 mili-giây.

Đồ thị Tri thức Đa tầng Đa phương thức (M³KG) là gì?

M³KG là kiến trúc đồ thị kết nối dữ liệu doanh nghiệp xuyên suốt nhiều phương thức biểu đạt: thực thể văn bản (Công ty, Sản phẩm), nút tài sản thị giác (Bản vẽ CAD, Sơ đồ kiến trúc) và các bản ghi cấu trúc bảng. Đồ thị này cho phép tác tử AI đối chiếu trực tiếp một con số tài chính trong bảng PDF với một chi tiết kỹ thuật được minh họa trong bản vẽ thiết kế.

Làm thế nào Apache Iceberg v3 kết hợp với LanceDB để lưu trữ đa phương thức không sao chép (Zero-Copy)?

LanceDB đọc và ghi trực tiếp các tệp định dạng cột Arrow nguyên bản trên kho lưu trữ đối tượng được quản lý bởi catalog Apache Iceberg v3. Điều này cho phép PySpark, DuckDB và các engine tìm kiếm vector truy vấn đồng thời mà không cần sao chép dữ liệu giữa các cụm lưu trữ độc lập, trong khi các tệp manifest của Iceberg đảm bảo tính toàn vẹn giao dịch ACID.

📖 Bản tiếng Anh (English Edition)

← Chương trước: Phần 1 — Kiến Trúc Hội Tụ | Mục lục Series | Chương tiếp theo: Phần 3 — Late Chunking & Semantic Caching →