Phase 7: Hoàn thiện Modular RAG Backend với FastAPI và Đa LLM Provider

This commit is contained in:
2026-05-08 07:30:30 +00:00
commit 26d1298cf6
51 changed files with 5360 additions and 0 deletions

View File

@@ -0,0 +1,193 @@
# 11.Appendix-PDF-Inspection-and-TextLayer-Detection.md
> **Phụ lục chiến lược nhận diện PDF (text-based vs scan vs drawing)**.
>
> ⚠️ Phụ lục này **KHÔNG chỉnh sửa** các file 110.
> Mục tiêu: **chuẩn hoá cách hệ thống hiểu PDF trước khi quyết định OCR / MarkItDown**.
>
> Đây là phụ lục then chốt để **không xử lý OCR sai loại PDF**, đặc biệt trong môi trường có nhiều bản vẽ kỹ thuật.
---
## 1. Vì sao cần inspection PDF riêng?
Trong hệ thống doanh nghiệp, `.pdf` là extension **dễ gây hiểu nhầm nhất**:
- PDF có thể là:
- Văn bản thuần (text layer)
- Scan ảnh (image-only)
- Bản vẽ kỹ thuật (vector + text rải rác)
⚠️ **Không được quyết định OCR chỉ dựa trên việc "là PDF"**.
---
## 2. Ba loại PDF cần phân biệt (BẮT BUỘC)
### 2.1 PDF loại 1 Text-based PDF
**Đặc điểm**
- Có text layer thật
- Có thể select/copy text
- Thường sinh ra từ Word, InDesign, LaTeX
**Xử lý**
- ❌ Không OCR
- ✅ Đưa thẳng vào MarkItDown
---
### 2.2 PDF loại 2 Scan / Image-based PDF
**Đặc điểm**
- Không có text layer
- Toàn bộ là ảnh
- Scan từ giấy
**Xử lý**
- ✅ OCR là BẮT BUỘC
- ✅ OCR page-wise
- ✅ Sau OCR mới đưa vào MarkItDown
---
### 2.3 PDF loại 3 Technical Drawing PDF
**Đặc điểm**
- Nội dung chính là hình vẽ kỹ thuật
- Text rải rác (ký hiệu, mã số)
- Có thể có vector + text layer
**Xử lý**
- ❌ Không OCR toàn bộ
- ❌ Không MarkItDown
- ✅ Metadata-only indexing
- ✅ OCR giới hạn (title block) nếu cần
---
## 3. PDF Inspection Flow (Luồng quyết định)
```text
PDF file
Quick inspection
├─ Has text layer?
├─ Text density?
├─ Page structure?
Classify:
- TEXT_PDF
- SCAN_PDF
- DRAWING_PDF
```
---
## 4. Heuristics xác định Text-based PDF
Một PDF được coi là **TEXT_PDF** khi:
- Có text layer trên >70% số trang
- Text density đủ lớn (nhiều hơn nhãn/ký hiệu)
- Không có layout dạng drawing
✅ Ví dụ tiêu biểu
- Quy định
- Hợp đồng
- Hướng dẫn
---
## 5. Heuristics xác định Scan PDF
Một PDF được coi là **SCAN_PDF** khi:
- Không có text layer
- Page rendering = image
- OCR text length = 0 trước OCR
✅ Đây là target chính của OCR tiếng Việt
---
## 6. Heuristics xác định Drawing PDF (RẤT QUAN TRỌNG)
Một PDF bị coi là **DRAWING_PDF** khi:
- Text layer rất ít nhưng:
- Có vector shapes
- Có line dày đặc
- Page ratio lớn (A1, A0)
- Text xuất hiện chủ yếu ở:
- Title block
- Legend
⚠️ Thoả các dấu hiệu trên → **KHÔNG đưa vào OCR/MarkItDown dù có text layer**.
---
## 7. Vì sao Drawing PDF KHÔNG được OCR đại trà
- OCR sinh rất nhiều noise
- Text không mang ý nghĩa ngôn ngữ
- RAG dễ hallucinate nguy hiểm
✅ Nguyên tắc:
> **Drawing PDF chỉ để TRA CỨU, không để ĐỌC bằng AI**.
---
## 8. Quyết định xử lý theo loại PDF
| PDF Type | OCR | MarkItDown | Search | RAG |
|--------|-----|------------|--------|-----|
| TEXT_PDF | ❌ | ✅ | ✅ | ✅ |
| SCAN_PDF | ✅ | ✅ | ✅ | ✅ |
| DRAWING_PDF | ❌ (limited) | ❌ | ✅ (metadata) | ❌ |
---
## 9. OCR Scope áp dụng cho PDF
### Chỉ OCR khi:
- Classified = SCAN_PDF
### OCR giới hạn khi:
- Classified = DRAWING_PDF
- Mục tiêu: title, revision, project code
---
## 10. Logging & Audit bắt buộc
Mỗi PDF phải có log:
```json
{
"pdf_type": "SCAN_PDF",
"decision_reason": "No text layer detected",
"ocr_applied": true
}
```
---
## 11. Lợi ích kiến trúc
- ✅ Không OCR sai PDF
- ✅ Không đưa bản vẽ vào RAG
- ✅ Giảm chi phí OCR
- ✅ Tránh hallucination nguy hiểm
---
## 12. Kết luận phụ lục
- PDF inspection là **bước bắt buộc trước OCR**
- TEXT ≠ SCAN ≠ DRAWING
- OCR và MarkItDown chỉ là công cụ, **không phải đích đến**
---
*Phụ lục này là nền tảng để thiết kế bước tích hợp OCR trong hệ thống.*