Đừng “nuôi” RAG bằng dữ liệu rác: Trích xuất dữ liệu hiệu quả hơn với LlamaParse và LlamaIndex

AI tutorial - IT technology blog
AI tutorial - IT technology blog

Khó khăn tiềm ẩn khi xây dựng RAG cho tài liệu

Việc xây dựng một hệ thống Retrieval-Augmented Generation (RAG) trông có vẻ đơn giản trong các bài hướng dẫn. Bạn lấy vài file PDF, chia nhỏ chúng thành các chunk, lưu trữ vào cơ sở dữ liệu vector và để LLM lo phần còn lại. Tuy nhiên, quy trình này thường vấp phải rào cản lớn khi đối mặt với các tài liệu thực tế như báo cáo tài chính 10-K hoặc hợp đồng bảo hiểm dài 50 trang. Gần đây, tôi đã chứng kiến một hệ thống ảo tưởng doanh thu quý của công ty là 500 triệu đô la chỉ vì nó đọc sai một bảng biểu mà con số thực tế là 50 triệu đô la.

Vấn đề thường không nằm ở LLM, mà nằm ở dữ liệu. Nếu bạn đưa cho mô hình một mớ ký tự hỗn độn, bạn sẽ nhận lại những câu trả lời hỗn độn. Các bộ nạp PDF tiêu chuẩn thường loại bỏ cấu trúc hình ảnh, biến một bảng biểu được trình bày ngăn nắp thành một “mớ hỗn độn chữ nghĩa”. Để xây dựng một hệ thống sẵn sàng cho môi trường production, trước tiên bạn phải khắc phục chiến lược parsing (phân tách dữ liệu) của mình.

Tại sao các bộ parser PDF tiêu chuẩn khiến pipeline của bạn thất bại

Hầu hết các nhà phát triển bắt đầu với PyPDF2 hoặc các bộ nạp cơ bản của LangChain. Những công cụ này nhẹ và miễn phí, nhưng chúng gặp khó khăn với bất kỳ tài liệu nào phức tạp hơn một bài luận cơ bản. Đây là những điểm chúng thường thất bại:

  • Phá hủy cấu trúc bảng: Chúng chuyển đổi các hàng và cột thành một chuỗi văn bản phẳng duy nhất. Sự liên kết giữa tiêu đề “Doanh thu năm 2023” và giá trị tương ứng của nó bị mất đi ngay lập tức.
  • Nhầm lẫn cột: Trong bố cục hai cột, nhiều bộ parser đọc từ trái sang phải trên toàn bộ trang. Điều này trộn lẫn các câu từ hai chủ đề khác nhau thành một đoạn văn vô nghĩa.
  • Bỏ qua yếu tố hình ảnh: Dữ liệu quan trọng thường nằm trong các biểu đồ hoặc sơ đồ luồng. Các bộ parser tiêu chuẩn bỏ qua hoàn toàn những phần này, để lại những lỗ hổng lớn trong cơ sở tri thức của AI.
  • Hạn chế của OCR: Các tài liệu quét (scanned) thường biến thành những ký tự vô nghĩa nếu công cụ OCR không xử lý được văn bản có độ tương phản thấp hoặc các trang bị nghiêng.

Sau khi triển khai nhiều ứng dụng RAG, tôi học được rằng bước quan trọng nhất không phải là chọn cơ sở dữ liệu vector, mà là đảm bảo tài liệu của bạn máy có thể đọc được trước khi nó được chuyển đổi thành embedding.

So sánh các chiến lược trích xuất

Tôi đã thử nghiệm nhiều phương pháp để xem phương pháp nào xử lý các bố cục phức tạp tốt nhất. Dưới đây là kết quả:

1. Các thư viện Python truyền thống (PyPDF2, PDFMiner)

Các thư viện này chạy local và nhanh, hoạt động tốt cho các tài liệu đơn giản, chủ yếu là văn bản. Tuy nhiên, chúng hầu như vô dụng đối với bảng biểu. Nếu tài liệu của bạn có cấu trúc lưới phức tạp, hãy tránh xa chúng; chúng sẽ chỉ tạo ra nhiễu cho các embedding của bạn.

2. Các OCR engine chạy local (Tesseract, PaddleOCR)

Những công cụ này tốt hơn cho các hình ảnh quét nhưng đòi hỏi nhiều tài nguyên tính toán. Bạn cũng sẽ kết thúc bằng việc viết hàng trăm dòng regex tùy chỉnh chỉ để tái cấu trúc lại một cái bảng mà OCR đã làm hỏng. Đây là một sự lãng phí thời gian lớn đối với hầu hết các đội ngũ.

3. Các bộ parser nhận diện layout (LlamaParse)

Đây là tiêu chuẩn vàng hiện nay cho việc parsing tối ưu cho LLM. LlamaParse là một dịch vụ dựa trên đám mây có khả năng hiểu được ý đồ hình ảnh của một trang giấy. Thay vì chỉ lấy văn bản, nó chuyển đổi các bảng biểu thành định dạng Markdown hoặc HTML sạch sẽ. Vì các LLM được huấn luyện trên dữ liệu web, chúng xử lý các bảng Markdown với độ chính xác cao hơn đáng kể.

Sự kết hợp hoàn hảo: LlamaParse + LlamaIndex

Pipeline đáng tin cậy nhất mà tôi từng xây dựng sử dụng LlamaParse cho các tác vụ nặng và LlamaIndex để điều phối. Sự kết hợp này đảm bảo rằng ngữ cảnh vẫn được giữ nguyên vẹn từ file PDF cho đến câu trả lời cuối cùng.

Bước 1: Thiết lập môi trường

Đầu tiên, hãy lấy API key từ LlamaCloud. Sau đó, cài đặt các thư viện cốt lõi:

pip install llama-index llama-parse llama-index-embeddings-openai

Bước 2: Xây dựng pipeline trích xuất

Script này là lựa chọn ưu tiên của tôi khi xử lý các báo cáo tài chính. Nó buộc LlamaParse xuất ra định dạng Markdown, bí quyết để bảo toàn tính toàn vẹn của bảng biểu.

import os
from llama_parse import LlamaParse
from llama_index.core import Settings, VectorStoreIndex
from llama_index.embeddings.openai import OpenAIEmbedding

# Thiết lập API key của bạn
os.environ["LLAMA_CLOUD_API_KEY"] = "key_llama_parse_cua_ban"
os.environ["OPENAI_API_KEY"] = "key_openai_cua_ban"

# Khởi tạo parser
parser = LlamaParse(
    result_type="markdown",  # Markdown giúp giữ cấu trúc bảng dễ đọc
    num_workers=4,           # Tăng tốc độ xử lý với các worker song song
    verbose=True,
    language="en"
)

# Parse tài liệu
documents = parser.load_data("./baocao_quy.pdf")

# Thiết lập mô hình embedding
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")

# Tạo index và query engine
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()

response = query_engine.query("So sánh lợi nhuận ròng giữa quý 3 và quý 4.")
print(response)

Bước 3: Xử lý file Excel và dữ liệu nhiều sheet

LlamaParse không chỉ giới hạn ở PDF. Nó xử lý các file Excel tốt đến ngạc nhiên, ngay cả khi dữ liệu nằm rải rác trên nhiều tab. Thay vì chuyển đổi sang CSV và làm mất ngữ cảnh, bạn có thể đưa trực tiếp file .xlsx vào. Parser coi mỗi sheet là một phần riêng biệt, giúp hệ thống RAG dễ dàng xác định các điểm dữ liệu cụ thể trong một bảng tính khổng lồ.

Những bài học thực chiến từ môi trường production

Xây dựng các pipeline này trong thực tế đã dạy tôi một vài điều mà tài liệu hướng dẫn thường bỏ qua:

Markdown là yếu tố bắt buộc

Luôn thiết lập result_type="markdown". Các mô hình như GPT-4o và Claude 3.5 cực kỳ thành thạo trong việc diễn giải cú pháp | cột |. Văn bản thuần túy buộc mô hình phải đoán xem một cột kết thúc ở đâu và cột khác bắt đầu từ đâu, vốn là nguồn cơn của các lỗi sai.

Kích hoạt Multimodal Parsing

Nếu báo cáo của bạn đầy rẫy biểu đồ, hãy bật các tính năng đa phương thức (multimodal). LlamaParse có thể sử dụng một mô hình thị giác (vision model) để viết mô tả văn bản cho một biểu đồ. Điều này cho phép hệ thống RAG của bạn “thấy” được một biểu đồ cột hiển thị xu hướng tăng trưởng 20% và đưa dữ kiện đó vào câu trả lời.

Chunking thông minh hiệu quả hơn chunking kích thước lớn

Đừng chỉ chia nhỏ văn bản sau mỗi 500 ký tự. Vì bạn có Markdown, bạn có thể chia nhỏ (chunk) dựa trên các tiêu đề (H1, H2). Điều này giữ các thông tin liên quan ở cùng nhau. Một bảng 10 hàng không bao giờ được bị cắt làm đôi; việc giữ nó trong một chunk đảm bảo LLM nhìn thấy toàn bộ ngữ cảnh.

Kiểm soát chi phí

LlamaParse là một dịch vụ trả phí. Nếu bạn đang xử lý 10.000 tài liệu, một cách tiếp cận kết hợp là tốt nhất. Sử dụng bộ parser local miễn phí cho các file văn bản cơ bản và dành LlamaParse cho các file PDF phức tạp, nhiều bảng biểu thực sự cần đến trí tuệ hình ảnh.

Lời kết

Một hệ thống RAG chỉ tốt khi dữ liệu nó truy xuất được là chính xác. Bằng cách chuyển từ các bộ thu thập PDF cơ bản sang một công cụ am hiểu bố cục như LlamaParse, bạn sẽ giải quyết được nguyên nhân phổ biến nhất gây ra ảo tưởng của AI. Nó biến một bản mẫu (prototype) mong manh thành một công cụ chuyên nghiệp có thể xử lý những tài liệu lộn xộn nhất mà bạn đưa vào.

Share: