tipitaka / Tipitaka-Web-Application-Tech-Stack-TURBOVEC-HF.md
dhammawatthumpra's picture
docs: add Turbovec-specific architecture and tech stack documents
a43002d
|
Raw
History Blame Contribute Delete
13.8 kB

Tech Stack Specification: Tipitaka Web Application (Turbovec Edition)

Phase 1 — All-on-Hugging-Face with Turbovec Backend

Version: 3.1.0 (Turbovec Edition) Date: 2026-05-26 Status: Production — Live at dhammadassana-tipitaka.hf.space Based on Architecture: V2.5.0 (commit 603ead8)


1. Executive Summary

Phase 1 ออกแบบให้ทุกอย่างรันอยู่บน Hugging Face Spaces ในลักษณะการทำงานใน Process เดียวกัน (In-process) เพื่อความเรียบง่าย เสถียรภาพ และประหยัดค่าใช้จ่าย โดยใช้ Turbovec เป็น Vector Database หลัก ซึ่งเป็นชุดค้นหาเวกเตอร์น้ำหนักเบาและประมวลผลเร็วระดับเสี้ยววินาที ระบบสามารถทำงานบน HF CPU Basic (Free Tier) ได้อย่างลื่นไหลโดยไม่ต้องใช้ RAM ปริมาณมหาศาล

สิ่งที่ระบบ Turbovec ยืนยันแล้ว:

  • การสืบค้นเวกเตอร์เฉลี่ยอยู่ที่ ~1.43 ms (เร็วกว่า Qdrant 13.5 เท่า)
  • RAG Pipeline ทำงานแบบ In-process ผ่าน sentence-transformers -> Turbovec -> SQLite Enrichment -> ONNX Reranker -> DeepSeek
  • ประหยัดหน่วยความจำ RAM ของเวกเตอร์เอนจินเหลือเพียง ~14 MB (ลดลงจาก Qdrant 100 เท่า)
  • ขนาดไฟล์ดัชนีเวกเตอร์ที่ต้องจัดเก็บลดลงเหลือ 13.2 MB (ผ่านการ Quantize 4-bit SQ)

2. Architecture Overview

┌─────────────────────────────────────────────────────────┐
│              Hugging Face Space (CPU Basic)             │
│                                                         │
│  ┌─────────────────────────────────────────────────┐   │
│  │         Vite + React 18 + TypeScript 5           │   │
│  │      (Static Build — Served by FastAPI)          │   │
│  └────────────────────┬────────────────────────────┘   │
│                       │ HTTP / SSE                      │
│  ┌────────────────────▼────────────────────────────┐   │
│  │              FastAPI (Python 3.13)               │   │
│  │                                                  │   │
│  │  ┌──────────┐  ┌──────────┐  ┌───────────────┐  │   │
│  │  │ SQLite   │  │ Turbovec │  │ Sentence-     │  │   │
│  │  │ FTS5     │  │ Index    │  │ Transformers  │  │   │
│  │  │(in-mem)  │  │ (.tvim)  │  │ (in-process)  │  │   │
│  │  └──────────┘  └──────────┘  └───────────────┘  │   │
│  │  ┌──────────────────────────────────────────┐   │   │
│  │  │       ONNX Reranker (jina-reranker-v2)   │   │   │
│  │  └──────────────────────────────────────────┘   │   │
│  └──────────────────────────────────────────────────┘   │
│                       │                                 │
│                       ▼ External API                    │
│              DeepSeek API (Pay-as-you-go)               │
└─────────────────────────────────────────────────────────┘

Assets: ดาวน์โหลดจาก HF Dataset (dhammawatthumpra/tipitaka-storage) ที่ Startup

3. Component Specification

3.1 Presentation Layer

รายการ Detail
Framework Vite 6 + React 18 + TypeScript 5
Styling Tailwind CSS v4 + Framer Motion + Lucide React
State Zustand (5 stores: Reader, Theme, UI, AI, Search)
PWA manifest.json + Dharma wheel PWA icons + Safari app touch icons
Transitions ReaderPanel ปรับใช้ mode="popLayout" พร้อมควบคุม loading spinner ด้านนอก เพื่อแก้ปัญหาจอนิ่งขาวบนอุปกรณ์พกพาขณะปัดเปลี่ยนหน้า

3.2 API Layer

รายการ Detail
Framework FastAPI (Python 3.13) + Uvicorn
Workers Single worker (ช่วยให้การโหลดโมเดลตัวแปลงและเวกเตอร์ทำงานร่วมกันได้ประหยัดแรมสูงสุด)
Deployment HF Space — port 7860

3.3 Data & Retrieval Layer

SQLite FTS5 (Lexical Search)

  • ไฟล์: tipitaka_mcu.db (~238MB)
  • โหลดเข้า Memory 100% ผ่าน sqlite3.backup() ที่ startup
  • Pipeline: FTS5 MATCH -> LIKE fallback -> Pali Autocorrect -> dedup -> highlight -> snippet

Turbovec Index (Vector Search)

  • ไฟล์ดัชนี: tipitaka_chunks.tvim (~13.2 MB)
  • รูปแบบ: โหลดขึ้นบน Memory ใน Python process โดยตรง ผ่านโมเดล turbovec.IdMapIndex (ไม่ใช่ server แยก)
  • เวกเตอร์ถูกย่อขนาดลงผ่าน 4-bit scalar quantization เหลือ 13.2 MB ทำให้โหลดไวและประหยัดพื้นที่คลาวด์
  • การเข้ารหัสพิกัด: แปลงพิกัดของเวกเตอร์เป็น ID ตัวเลขจำนวนเต็มด้วยสูตร UID = volume_id * 100_000 + page_number เพื่อไม่ต้องเก็บข้อมูล Payload อื่นๆ บนเวกเตอร์โดยไม่จำเป็น
  • การแก้ไขพารามิเตอร์ SQLite: แปลงประเภทผลลัพธ์เวกเตอร์ numpy.uint64 ให้เป็น native int() ก่อนค้นหากับฐานข้อมูล tipitaka_mcu.db เสมอ เพื่อป้องกันข้อผิดพลาดที่ SQLite จะมองพารามิเตอร์ดังกล่าวเป็นข้อมูลชนิด BLOB

ONNX Reranker

  • Model: jina-reranker-v2-base-multilingual (ONNX CPU, ~267MB)
  • Sequence Length: ปรับลดความยาวสูงสุดใน tokenization เหลือ max_length=256 ช่วยเร่งความเร็วในการประเมินคะแนนบน CPU พื้นฐานได้มากกว่าเดิม 4 เท่า

3.4 Embedding Layer

ใช้ sentence-transformers in-process เท่านั้น (ไม่มี Ollama ในระบบ HF Space)

รายการ Detail
Model jinaai/jina-embeddings-v5-text-small-retrieval
Runtime sentence-transformers (PyTorch, in-process)
Dimensions 1024 dims
RAM ~1.2 GB
Cache LRU 256 entries (OrderedDict) เพื่อสกัดการประมวลผลคำคิวรีซ้ำ

3.5 Generative AI Layer

(เหมือนเดิม — DeepSeek streaming API ผ่านโมเดล fast/reasoner)


4. Data Flow

4.1 RAG Pipeline

User Query
  │
  ├─► FTS5 MATCH (30 results)                [Lexical]
  │
  ├─► ST Embedding → Turbovec Search (30)     [Semantic]
  │     ├─ ตรวจสอบ LRU cache
  │     └─ tv_index.search() -> return vol & page IDs
  │
  ├─► SQLite Payload Enrichment (ดึง content_text จาก db ด้วย vol & page)
  ├─► Merge + Deduplicate by (vol, page)
  │
  ├─► ONNX Reranker → sort by score
  │
  └─► Top N context → DeepSeek API → SSE Stream → Browser

5. Deployment

5.1 HF Spaces Configuration

  • Visibility: Protected (ซ่อน Source Code และ Assets)
  • Build: Dockerfile (multi-stage)
  • Port: 7860

5.2 Startup Sequence

1. Dockerfile build: npm ci → vite build → pip install
2. startup.sh:
   a. download_assets.py → ดึงไฟล์จาก HF Dataset
      - tipitaka_mcu.db (~238MB)
      - tipitaka_chunks.tvim (~13.2MB - โหลดแทน snapshot ดั้งเดิม)
      - ONNX reranker via huggingface_hub (~267MB)
   b. ลบ Qdrant .lock file (กรณีมีการเปิดฟังก์ชัน Qdrant ไว้ร่วมกัน)
   c. uvicorn app.main:app --port 7860
3. FastAPI lifespan:
   a. SQLite → โหลดเข้า :memory:
   b. Turbovec Index → โหลดเข้าคลาส tv_index ในหน่วยความจำ (~14MB)
   c. ONNX reranker → โหลดโมเดล
   d. ST model → โหลด lazy (ครั้งแรกที่มี query)

เวลา Cold Start ของเครื่อง: ลดลงเหลือเพียง ~1.5–3 นาที (เนื่องจากไม่ต้องดาวน์โหลดไฟล์ขนาด 1 GB ของ Qdrant snapshot และข้ามขั้นตอนการดึง snapshot restore ขนาดใหญ่)

5.3 RAM Budget (CPU Basic = 16GB)

ด้วยการใช้ Turbovec ทำให้ขยายขนาดพื้นที่ว่างบน RAM ได้มากถึง 12 GB ซึ่งช่วยเพิ่มเสถียรภาพสูงสุดในการประมวลผลคำตอบ RAG

Component RAM (Qdrant Embedded) RAM (Turbovec Edition)
SQLite in-memory ~238 MB ~238 MB
Vector Index Engine ~1.2–1.5 GB ~14 MB
ST Model (Jina-v5) ~1.2 GB ~1.2 GB
ONNX Reranker ~500 MB ~500 MB
FastAPI + Python overhead ~300 MB ~300 MB
Ubuntu OS ~500 MB ~500 MB
รวม ~4.0–4.2 GB ~2.7–2.8 GB
เหลือ Headroom บนแรม ~11.8 GB ~13.2 GB

6. Environment Variables

Variable Default Description
LLM_API_KEY คีย์ DeepSeek API
DATA_DIR Auto-detect โฟลเดอร์เก็บข้อมูล SQLite & Turbovec Index
DATABASE_PATH Auto-detect ไฟล์ที่อยู่ของ SQLite
SERVE_STATIC true ให้ FastAPI ทำหน้าที่เสิร์ฟ Frontend ของ Vite
ST_EMBED_MODEL jinaai/jina-embeddings-v5-text-small-retrieval โมเดลทำเวกเตอร์บน Hugging Face
PORT 7860 พอร์ตของ HF Space

7. Cost Summary

  • HF PRO Account: $9.00/เดือน (ประมาณ 315 บาท) เพื่อสิทธิ์การเข้าถึงแบบ Protected
  • HF Space Hardware (CPU Basic): ฟรี
  • DeepSeek API: จ่ายตามปริมาณประมวลผลโทเค็นจริง
  • รวมค่าบริการคงที่: $9.00/เดือน

8. ข้อจำกัดและแนวทางปรับปรุง

ข้อจำกัด ผลกระทบ แนวทางแก้ไข
Cold start ในรอบการเปิดเครื่องใหม่ ระบบหยุดทำงานชั่วคราวเมื่อรีสตาร์ทหลังไม่มีการใช้งาน 48 ชม. ใช้ HF Persistent Storage หรือ VPS โฮสต์ส่วนตัว
SQLite FTS5 และ Turbovec ค้นแยก ข้อมูลเวกเตอร์อาจแตกต่างเล็กน้อยจากคำดั้งเดิมก่อน enrichment ทำ Cache เอนทิตีที่ซับซ้อนขึ้น

เอกสารนี้ได้รับการปรับปรุงเพื่อสะท้อนประสิทธิภาพจริงของดัชนี Turbovec ที่รันอยู่บนระบบของแอปพลิเคชัน