Apidog

Nền tảng phát triển API hợp tác tất cả trong một

Thiết kế API

Tài liệu API

Gỡ lỗi API

Giả lập API

Kiểm thử API tự động

Cách tôi sử dụng Gemini 2.0 Flash để nhận diện văn bản trong các tài liệu PDF lớn

中村 拓也

中村 拓也

Updated on tháng 3 1, 2025

💡
Trước khi bắt đầu, hãy để tôi đưa ra một lưu ý nhanh: hãy tải Apidog miễn phí hôm nay để tối ưu hóa quy trình thử nghiệm API của bạn, đặc biệt là để khám phá những tính năng mạnh mẽ của Claude 3.7 Sonnet—hoàn hảo cho các nhà phát triển đang tìm cách thử nghiệm các mô hình AI tiên tiến như thế này!
button

Trong hành trình của mình với tư cách là một nhà khoa học dữ liệu làm việc với trí tuệ tài liệu, tôi thường gặp phải nhiệm vụ đầy thách thức là trích xuất và xử lý văn bản từ những tệp PDF lớn và phức tạp. Các quy trình OCR truyền thống (Nhận dạng Ký tự Quang học) thường liên quan đến nhiều bước, các công cụ chuyên biệt và thời gian xử lý đáng kể. Tuy nhiên, việc giới thiệu Gemini 2.0 Flash đã biến đổi cách tiếp cận của tôi trong việc xử lý những tài liệu này. Trong bài viết này, tôi sẽ chia sẻ quy trình làm việc cá nhân của mình cho việc sử dụng Gemini 2.0 Flash như một giải pháp OCR mạnh mẽ cho các PDF lớn mà không cần dựa vào các kiến trúc RAG (Sinh điều chỉnh theo truy xuất) phức tạp.

Giới thiệu của tôi về Gemini 2.0 Flash

Cuộc gặp gỡ đầu tiên của tôi với Gemini 2.0 Flash đến sau khi tôi chật vật với một dự án đặc biệt khó khăn liên quan đến hàng trăm báo cáo tài chính cổ điển ở định dạng PDF quét. Các công cụ OCR truyền thống hoặc không thể nhận diện đúng các bảng hoặc yêu cầu xử lý hậu kỳ rộng rãi. Khi Google phát hành Gemini 2.0 Flash với cửa sổ ngữ cảnh 1 triệu token ấn tượng và khả năng đa phương thức, tôi đã ngay lập tức nhận ra tiềm năng của nó.

Gemini 2.0 Flash không chỉ là một mô hình ngôn ngữ khác—nó là một cỗ máy đa phương thức có khả năng hiểu cả nội dung văn bản và trực quan trong các tài liệu. Điều này khiến nó trở thành lựa chọn đặc biệt phù hợp cho các nhiệm vụ OCR nơi mà ngữ cảnh và sự hiểu biết trực quan rất quan trọng. Với khả năng xử lý khoảng 1,500 trang trong một lần, nó đã trở thành giải pháp ưa thích của tôi cho OCR tài liệu lớn.

Thiết lập Môi Trường OCR của Tôi

Trước khi đi vào quy trình OCR của mình, tôi cần thiết lập một nền tảng kỹ thuật đáng tin cậy. Đây là cách tôi thiết lập môi trường của mình:

  1. Cài đặt Thư viện Cần thiết: Đầu tiên, tôi cài đặt các gói Python cần thiết để giao diện với Gemini và xử lý PDF:
pip install google-generativeai
pip install pypdf
pip install pdf2image
pip install pillow
pip install python-dotenv
  1. Cấu hình Truy cập API: Tôi đã tạo một dự án trong Google Cloud Console, kích hoạt API Gemini và tạo một khóa API. Tôi lưu trữ khóa này một cách an toàn bằng cách sử dụng biến môi trường:
import os
import google.generativeai as genai
from dotenv import load_dotenv

# Tải khóa API từ tệp .env
load_dotenv()
api_key = os.getenv('GOOGLE_API_KEY')

# Cấu hình API Gemini
genai.configure(api_key=api_key)
  1. Khởi tạo Mô hình: Tôi truy cập Gemini 2.0 Flash hỗ trợ đầu vào đa phương thức:
# Khởi tạo Gemini 2.0 Flash
model = genai.GenerativeModel('gemini-2.0-flash')

Quy trình Chuyển đổi PDF và Trích xuất Hình ảnh của Tôi

Để thực hiện OCR hiệu quả với Gemini 2.0 Flash, tôi đã phát triển một phương pháp có hệ thống để xử lý các PDF:

  1. Chuyển đổi sang Hình ảnh: Đầu tiên, tôi chuyển đổi các trang PDF thành hình ảnh độ phân giải cao:
from pdf2image import convert_from_path
import os

def convert_pdf_to_images(pdf_path, output_folder, dpi=300):
    # Tạo thư mục đầu ra nếu nó không tồn tại
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    # Chuyển đổi các trang PDF thành hình ảnh
    images = convert_from_path(pdf_path, dpi=dpi)
    
    # Lưu hình ảnh vào thư mục đầu ra
    image_paths = []
    for i, image in enumerate(images):
        image_path = os.path.join(output_folder, f'page_{i+1}.jpg')
        image.save(image_path, 'JPEG')
        image_paths.append(image_path)
    
    return image_paths
  1. Xử lý Lô cho PDF lớn: Đối với các tài liệu lớn đặc biệt, tôi xử lý các hình ảnh theo lô:
def batch_images(image_paths, batch_size=50):
    """Nhóm hình ảnh thành các lô để xử lý"""
    for i in range(0, len(image_paths), batch_size):
        yield image_paths[i:i + batch_size]

Pipeline OCR của Tôi Sử dụng Gemini 2.0 Flash

Dưới đây là nơi sức mạnh của Gemini 2.0 Flash thật sự tỏa sáng trong quy trình làm việc của tôi:

  1. Chuyển đổi Hình ảnh trực tiếp sang Văn bản: Tôi xử lý các hình ảnh trực tiếp thông qua các khả năng đa phương thức:
from PIL import Image
from IPython.display import display
import base64
import io

def ocr_with_gemini(image_paths, instruction):
    """Xử lý hình ảnh với Gemini 2.0 Flash cho OCR"""
    images = [Image.open(path) for path in image_paths]
    
    prompt = f"""
    {instruction}
    
    Đây là các trang từ một tài liệu PDF. Trích xuất tất cả nội dung văn bản trong khi vẫn giữ nguyên cấu trúc.
    Chú ý đặc biệt đến các bảng, cột, tiêu đề và bất kỳ nội dung có cấu trúc nào.
    Giữ nguyên các đoạn ngắt và định dạng.
    """
    
    response = model.generate_content([prompt, *images])
    return response.text
  1. Cách tiếp cận của tôi trong việc xử lý các yếu tố tài liệu phức tạp:

Đối với các tài liệu có bố cục phức tạp bao gồm bảng, biểu đồ và văn bản nhiều cột, tôi sử dụng các chỉ dẫn cụ thể:

def ocr_complex_document(image_paths):
    instruction = """
    Trích xuất TẤT CẢ nội dung văn bản từ các trang tài liệu này.
    Đối với các bảng:
    1. Giữ nguyên cấu trúc bảng bằng định dạng bảng markdown
    2. Giữ nguyên tất cả tiêu đề cột và nhãn hàng
    3. Đảm bảo dữ liệu số được ghi lại chính xác
    
    Đối với bố cục nhiều cột:
    1. Xử lý các cột từ trái sang phải
    2. Tách rõ ràng nội dung từ các cột khác nhau
    
    Đối với biểu đồ và đồ thị:
    1. Mô tả loại biểu đồ
    2. Trích xuất bất kỳ nhãn trục, chú giải và điểm dữ liệu nào có thể nhìn thấy
    3. Trích xuất bất kỳ tiêu đề hoặc chú thích nào
    
    Giữ nguyên tất cả tiêu đề, chân trang, số trang và chú thích.
    """
    
    return ocr_with_gemini(image_paths, instruction)
  1. OCR Chuyên biệt cho Tài liệu Tài chính:

Nhiều tệp PDF mà tôi làm việc chứa dữ liệu tài chính, điều này đòi hỏi sự chú ý đặc biệt:

def ocr_financial_document(image_paths):
    instruction = """
    Trích xuất TẤT CẢ nội dung văn bản từ các trang tài liệu tài chính này.
    
    Chú ý đặc biệt đến:
    1. Tất cả các giá trị số và đảm bảo chúng được viết chính xác
    2. Các ký hiệu tiền tệ và mối liên hệ đúng với các số
    3. Các bảng tài chính - giữ nguyên cấu trúc và cách căn chỉnh của chúng
    4. Bảng cân đối, báo cáo thu nhập và báo cáo lưu chuyển tiền tệ
    5. Chú thích và tiết lộ - những điều này thường chứa thông tin quan trọng
    6. Bất kỳ ngày nào liên quan đến các khoảng thời gian tài chính
    
    Định dạng bảng bằng cú pháp bảng markdown để giữ nguyên cấu trúc của chúng.
    """
    
    return ocr_with_gemini(image_paths, instruction)

Quy trình Đảm bảo Chất lượng của Tôi

Tôi đã nhận thấy rằng chất lượng OCR có thể thay đổi tùy theo các đặc điểm của tài liệu, vì vậy tôi thực hiện quy trình kiểm tra chất lượng:

def verify_ocr_quality(image_path, extracted_text):
    """Xác minh chất lượng của kết quả OCR cho một trang cụ thể"""
    image = Image.open(image_path)
    
    prompt = f"""
    Tôi có một trang tài liệu và văn bản đã được trích xuất từ nó bằng cách sử dụng OCR.
    
    So sánh hình ảnh gốc với văn bản đã trích xuất và xác định bất kỳ lỗi hoặc sự thiếu sót nào.
    Tập trung vào:
    1. Văn bản bị thiếu
    2. Ký tự nhận diện sai
    3. Vấn đề cấu trúc bảng
    4. Vấn đề với ký tự hoặc ký hiệu đặc biệt
    
    Văn bản đã trích xuất:
    {extracted_text}
    """
    
    response = model.generate_content([prompt, image])
    return response.text

Tôi sử dụng hàm này để kiểm tra ngẫu nhiên các trang từ các tài liệu lớn nhằm đảm bảo chất lượng.

Quy trình của Tôi để Xử lý Các Tài liệu Lớn Vượt quá Giới hạn Ngữ cảnh

Mặc dù Gemini 2.0 Flash có giới hạn 1 triệu token ấn tượng, một số tài liệu của tôi vẫn vượt quá khả năng này. Đối với những trường hợp này, tôi đã phát triển một cách tiếp cận xử lý tuần tự:

  1. Xử lý PDF theo các Phân đoạn có Ý nghĩa:
def process_large_pdf(pdf_path, output_folder, output_file):
    # Chuyển đổi PDF thành hình ảnh
    image_paths = convert_pdf_to_images(pdf_path, output_folder)
    
    # Tạo các lô hình ảnh (ví dụ: theo chương hoặc phần)
    batches = batch_images(image_paths, 30)  # Điều chỉnh kích thước lô dựa trên độ phức tạp của tài liệu
    
    full_text = ""
    for i, batch in enumerate(batches):
        print(f"Đang xử lý lô {i+1}...")
        batch_text = ocr_with_gemini(batch, "Trích xuất tất cả văn bản, giữ nguyên cấu trúc tài liệu")
        full_text += f"\n\n--- LÔ {i+1} ---\n\n{batch_text}"
    
    # Lưu văn bản đã trích xuất hoàn chỉnh
    with open(output_file, 'w', encoding='utf-8') as f:
        f.write(full_text)
    
    return full_text
  1. Xử lý Hậu kỳ để Đảm bảo Tính Liên kết của Tài liệu:

Sau khi trích xuất văn bản từ tất cả các lô, tôi sử dụng Gemini 2.0 Flash để đảm bảo tính nhất quán:

def harmonize_document(extracted_text):
    prompt = """
    Văn bản sau đây đã được trích xuất từ một tài liệu PDF lớn theo từng lô.
    Hài hòa nội dung bằng cách:
    1. Loại bỏ bất kỳ dấu hiệu phân tách lô nào
    2. Đảm bảo định dạng nhất quán xuyên suốt
    3. Sửa chữa bất kỳ vấn đề cấu trúc bảng nào tại các ranh giới lô
    4. Đảm bảo dòng và đoạn văn bản tự nhiên giữa các ranh giới lô
    
    Văn bản đã trích xuất ban đầu:
    """
    
    response = model.generate_content(prompt + extracted_text)
    return response.text

Trường hợp Sử dụng Chuyên biệt: Cách tiếp cận của Tôi đối với OCR Tài liệu Lịch sử

Một số dự án OCR khó khăn nhất của tôi liên quan đến các tài liệu lịch sử với giấy đã cũ, văn bản mờ hoặc phông chữ không bình thường. Đối với những tài liệu này, tôi đã phát triển một cách tiếp cận chuyên biệt:

def historical_document_ocr(image_paths):
    instruction = """
    Trích xuất văn bản từ những hình ảnh tài liệu lịch sử này.
    
    Xem xét các thách thức sau:
    1. Giấy đã cũ với vết bẩn hoặc đổi màu
    2. Mực hoặc kiểu chữ mờ
    3. Kiểu chữ kiểu cũ và liên kết
    4. Chú thích viết tay
    5. Bố cục trang không tiêu chuẩn
    
    Ưu tiên độ chính xác hơn việc bảo tồn định dạng khi cần thiết.
    Ghi chú bất kỳ văn bản nào có vẻ không chắc chắn với [?].
    """
    
    extracted_text = ocr_with_gemini(image_paths, instruction)
    
    # Sửa đổi dựa trên ngữ cảnh bổ sung
    correction_prompt = f"""
    Văn bản sau đây đã được trích xuất từ một tài liệu lịch sử có thể có vấn đề chất lượng.
    Xem xét văn bản để tìm ra các lỗi OCR điển hình trong tài liệu lịch sử:
    1. Sửa lại những từ có thể đã bị hiểu sai do giấy cũ hoặc mực mờ
    2. Chỉ sửa các cách viết cổ điển nếu chúng có vẻ là lỗi OCR (không phải nếu thực sự phù hợp với thời kỳ)
    3. Giải quyết bất kỳ văn bản không chắc chắn nào được đánh dấu bằng [?] nếu ngữ cảnh làm cho việc đọc đúng trở nên rõ ràng
    
    Văn bản gốc:
    {extracted_text}
    """
    
    corrected_text = model.generate_content(correction_prompt)
    return corrected_text.text

Kết quả Thực tiễn Từ Các Dự án OCR của Tôi

Trong kinh nghiệm của tôi khi sử dụng Gemini 2.0 Flash cho OCR trên hàng chục tài liệu lớn, tôi đã thấy những cải tiến đáng kinh ngạc so với các phương pháp OCR truyền thống:

  1. Cải thiện Độ Chính xác: Đối với các báo cáo tài chính phức tạp có bảng và biểu đồ, tỷ lệ độ chính xác của tôi đã cải thiện từ khoảng 85% với OCR truyền thống lên hơn 95% với Gemini 2.0 Flash. Khả năng của mô hình hiểu ngữ cảnh giúp nó diễn giải chính xác các ký tự mơ hồ dựa trên nội dung xung quanh.
  2. Giảm Thời gian Xử lý: Những gì từng mất tôi nhiều giờ xử lý và sửa chữa thủ công giờ đây thường hoàn tất trong vài phút. Bằng cách loại bỏ sự cần thiết cho các bước OCR và hiểu văn bản riêng biệt, quy trình làm việc của tôi đã trở nên hiệu quả hơn đáng kể.
  3. Giữ nguyên Cấu trúc Bảng: Một trong những khả năng ấn tượng nhất mà tôi thấy là khả năng của Gemini 2.0 Flash giữ nguyên cấu trúc bảng phức tạp. Trong các tài liệu tài chính, điều này đã rất quý giá cho việc đảm bảo tính toàn vẹn của dữ liệu.

Kết luận: Ảnh hưởng đến Quy trình Xử lý Tài liệu của Tôi

Việc áp dụng Gemini 2.0 Flash cho OCR các PDF lớn đã biến đổi quy trình xử lý tài liệu của tôi. Việc loại bỏ các kiến trúc RAG phức tạp cho hầu hết các trường hợp sử dụng đã đơn giản hóa cơ sở hạ tầng kỹ thuật của tôi trong khi cải thiện kết quả. Khả năng đa phương thức của mô hình cho phép nó hiểu cả các yếu tố hình ảnh và nội dung văn bản của tài liệu đồng thời, dẫn đến việc trích xuất văn bản thông minh hơn.

Điều khiến tôi ấn tượng nhất là khả năng của mô hình trong việc xử lý các trường hợp đặc biệt mà các hệ thống OCR truyền thống gặp khó khăn—các chú thích viết tay, dấu hiệu bản quyền, phông chữ không bình thường, và bố cục phức tạp. Bằng cách sử dụng cửa sổ ngữ cảnh lớn của Gemini 2.0 Flash, tôi có thể xử lý những phần lớn của tài liệu trong một lần, duy trì sự liên kết và hiểu biết ngữ cảnh xuyên suốt.

Đối với các nhà khoa học dữ liệu, nhà nghiên cứu, và chuyên gia thường xuyên làm việc với các bộ sưu tập tài liệu lớn, Gemini 2.0 Flash không chỉ đại diện cho một cải tiến gia tăng mà còn là một sự chuyển dịch cơ bản trong cách chúng ta tiếp cận OCR và hiểu tài liệu. Khả năng "nhìn" và "đọc" tài liệu như cách mà một con người làm—xem xét bố cục, ngữ cảnh và các yếu tố trực quan một cách tổng thể—mở ra những khả năng mới cho các ứng dụng trí tuệ tài liệu.

Khi tôi tiếp tục tinh chỉnh quy trình làm việc của mình, tôi liên tục khám phá những cách mới mà công nghệ này có thể tối ưu hóa các nhiệm vụ xử lý tài liệu mà trước đây từng tốn nhiều công sức hoặc thách thức về công nghệ. Tương lai của OCR tài liệu đang ở đây, và nó đang cách mạng hóa cách tôi làm việc với những kho lưu trữ PDF khổng lồ mà từng là nỗi đau của sự tồn tại nghề nghiệp của tôi.

button