1. Giới thiệu & Mục đích
Kreuzberg (trước đây có thể được biết đến dưới tên namespace Goldziher) là một thư viện xử lý tài liệu (document intelligence) hiệu năng cao, được viết lại hoàn toàn bằng Rust trong phiên bản v4.0 mới nhất. Mục đích chính của dự án này là cung cấp giải pháp trích xuất văn bản, metadata và dữ liệu có cấu trúc từ nhiều loại định dạng file khác nhau một cách nhanh chóng, chính xác và bảo mật.
Ứng dụng thực tế:
- RAG (Retrieval-Augmented Generation): Trích xuất nội dung từ PDF, file Word để làm dữ liệu đầu vào cho các mô hình ngôn ngữ lớn (LLM).
- Tự động hóa quy trình: Xử lý hóa đơn, hợp đồng, tài liệu scan để lấy thông tin tự động.
- Search Engine: Đánh chỉ mục nội dung (indexing) từ các file nhị phân mà không cần phụ thuộc vào API của bên thứ ba.
- Chuyển đổi định dạng: Chuyển đổi PDF, Office sang Markdown hoặc JSON để dễ dàng xử lý bằng code.
2. Tính năng chính
- Đa ngôn ngữ (Polyglot): Core được viết bằng Rust cho hiệu năng cực cao, nhưng cung cấp binding (thư viện) cho nhiều ngôn ngữ: Python, TypeScript (Node.js), Go, Java, C#, Ruby, PHP, Elixir.
- Hỗ trợ đa định dạng: Xử lý hơn 56 định dạng file bao gồm PDF (cả dạng text và scan), Microsoft Office (Word, Excel, PowerPoint), Hình ảnh, HTML, Email, v.v.
- Tích hợp OCR: Hỗ trợ sẵn OCR (Nhận dạng ký tự quang học) sử dụng Tesseract, EasyOCR hoặc PaddleOCR để xử lý các tài liệu dạng ảnh hoặc PDF scan.
- Xử lý cục bộ (Local Processing): Chạy hoàn toàn offline, không gửi dữ liệu ra ngoài, đảm bảo quyền riêng tư và bảo mật dữ liệu.
- Hỗ trợ Async: (Đặc biệt với Python) Hỗ trợ cả cơ chế đồng bộ (sync) và bất đồng bộ (async), tối ưu cho các ứng dụng web server hoặc xử lý song song.
- Smart PDF Handling: Tự động phát hiện và fallback sang OCR nếu PDF bị lỗi font hoặc không thể trích xuất text trực tiếp.
3. Hướng dẫn cài đặt Local (macOS)
Để sử dụng Kreuzberg trên macOS (ví dụ với Python binding), bạn thực hiện các bước sau:
Bước 1: Cài đặt System Dependencies (qua Homebrew) Nếu bạn cần tính năng OCR hoặc Embeddings, hãy cài đặt các thư viện hệ thống cần thiết:
# Cài đặt Tesseract cho tính năng OCR
brew install tesseract
# Cài đặt ngôn ngữ cho Tesseract (ví dụ tiếng Việt và tiếng Anh)
brew install tesseract-lang
# (Tùy chọn) Cài đặt ONNX Runtime nếu dùng tính năng embeddings
brew install onnxruntime
Bước 2: Cài đặt thư viện Python
Sử dụng pip để cài đặt thư viện chính:
# Cài đặt bản cơ bản
pip install kreuzberg
# Hoặc cài đặt bản hỗ trợ đầy đủ async và các tính năng mở rộng
pip install "kreuzberg[async,ocr]"
Lưu ý: Nếu bạn chỉ muốn dùng công cụ dòng lệnh (CLI) mà không cần code Python:
brew install kreuzberg-dev/tap/kreuzberg
4. Hướng dẫn Docker
Kreuzberg cung cấp sẵn Docker image chính thức, có thể chạy như một REST API server hoặc một công cụ xử lý độc lập.
Cách 1: Chạy Kreuzberg Server (REST API) Pull và chạy image chính thức từ GitHub Container Registry:
docker run -p 3000:3000 ghcr.io/kreuzberg-dev/kreuzberg:server
Sau khi chạy, bạn có thể gửi request POST tới http://localhost:3000/extract để trích xuất dữ liệu.
Cách 2: Dockerfile cơ bản (cho Python App)
Nếu bạn muốn build một ứng dụng Python sử dụng thư viện kreuzberg, hãy dùng Dockerfile sau để đảm bảo đầy đủ dependencies:
FROM python:3.11-slim
# Cài đặt dependencies hệ thống cho Tesseract OCR
RUN apt-get update && apt-get install -y \
tesseract-ocr \
tesseract-ocr-vie \
libgomp1 \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Cài đặt thư viện Kreuzberg
RUN pip install "kreuzberg[async]"
COPY . .
CMD ["python", "main.py"]
5. Ví dụ Code (Example Code)
Dưới đây là ví dụ sử dụng Python (Async) để trích xuất văn bản từ một file PDF:
import asyncio
from kreuzberg import extract_file, ExtractionConfig
async def main():
# Đường dẫn tới file cần xử lý
file_path = "./tai_lieu_mau.pdf"
# Cấu hình trích xuất (có thể tùy chỉnh OCR, ngôn ngữ...)
config = ExtractionConfig(
enable_ocr=True, # Bật OCR nếu cần
language="vie+eng" # Ngôn ngữ ưu tiên (nếu dùng OCR)
)
try:
# Thực hiện trích xuất bất đồng bộ
result = await extract_file(file_path, config=config)
print(f"--- Kết quả trích xuất từ: {file_path} ---")
print(f"MIME Type: {result.mime_type}")
print(f"Metadata: {result.metadata}")
print("\nNội dung văn bản:")
print(result.content[:500]) # In 500 ký tự đầu tiên
except Exception as e:
print(f"Có lỗi xảy ra: {e}")
if __name__ == "__main__":
asyncio.run(main())
Nguồn tham khảo
- dev.to
- reddit.com
- dev.to
- crates.io
- pypi.org
- medium.com
- reddit.com
- kreuzberg.dev
- ycombinator.com
- github.com
- kreuzberg.dev
- docs.rs
Github Page
https://github.com/kreuzberg-dev/kreuzberg