nduckmink/BookLM

Enterprise Knowledge Bot, AI-powered document Q&A via Zalo. Based on NotebookLM

β˜… 0Forks 0PythonGitHub β†—Compare

README

BitsBook LM

Enterprise Knowledge Bot β€” AI-powered document Q&A via Zalo.

Features

  • πŸ“š Knowledge Base: Upload PDF, DOCX β†’ auto-extract & embed
  • πŸ€– Google Gemini AI: Chat, RAG, summarization (text-embedding-004)
  • πŸ–ΌοΈ Image Extraction: Auto-extract images from documents, send with answers
  • πŸ“‡ Contacts: Admin manages contacts, AI suggests when info not found
  • πŸ—„οΈ MinIO Storage: S3-compatible file storage with presigned URLs
  • πŸ” Semantic Search: pgvector-powered similarity search
  • ⚑ arq Worker Queue: Redis-backed async ingestion with real-time progress tracking

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Next.js 15 │────▢│  FastAPI   │────▢│ PostgreSQLβ”‚
β”‚  Admin UI   │◀────│  API      β”‚     β”‚ + pgvectorβ”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                    β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚   Redis   │────▢│ arq Workerβ”‚
                    β”‚   Queue   │◀────│ (process) β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
                                            β”‚
                                      β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”
                                      β”‚   MinIO    β”‚
                                      β”‚  Storage   β”‚
                                      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Ingestion Pipeline: API enqueues job β†’ Redis β†’ arq Worker picks up β†’ Extract text β†’ Chunk β†’ Embed β†’ Store β†’ Update progress in DB β†’ Frontend auto-polls progress.

Tech Stack

Layer Tech
API Backend FastAPI (Python 3.12)
Vector Database PostgreSQL 16 + pgvector
Graph Database Neo4j (Knowledge Graph)
AI & Vision Gemini 3.1 Flash-Lite (Multimodal RAG) + gemini-embedding-2
Task Queue arq + Redis
Storage MinIO (S3-compatible)
Frontend Next.js 15 + Tailwind CSS + shadcn/ui
Deployment Docker + Docker Compose

Prerequisites

  • Python 3.11+
  • Node.js 18+
  • PostgreSQL 16+ with pgvector extension
  • MinIO server
  • Redis server

Quick Start

Using Docker (Recommended)

# 1. Copy & edit env file
cp .env.example .env
# β†’ Fill in DATABASE_URL, GOOGLE_API_KEY, NEO4J_URI, NEXT_PUBLIC_API_URL, etc.

# 2. Build and start all services
docker compose up -d --build

Manual Setup (Local Development)

# 1. Copy & edit env file
cp .env.example .env

# 2. Install backend dependencies & run migrations
python -m venv .venv
source .venv/bin/activate
pip install -e .
alembic upgrade head

# 3. Start API (Terminal 1)
python -m uvicorn app.main:app --reload --port 5055

# 4. Start arq Worker (Terminal 2)
python -m arq app.worker.WorkerSettings

# 5. Start Frontend (Terminal 3)
cd frontend
npm install
npm run dev

Environment Variables

# --- PostgreSQL ---
DATABASE_URL=postgresql+asyncpg://user:pass@host:5432/dbname

# --- Google AI ---
GOOGLE_API_KEY=your-api-key

# --- MinIO ---
MINIO_ENDPOINT=host:9000
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=your-secret
MINIO_BUCKET=kb-files
MINIO_SECURE=false

# --- Redis (arq worker queue) ---
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=your-password
REDIS_DB=0

# --- Embedding ---
EMBEDDING_MODEL=text-embedding-004
EMBEDDING_DIMENSIONS=768
CHUNK_SIZE=1500
CHUNK_OVERLAP=150

Project Structure

bitsbooklm/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ main.py              # FastAPI entry
β”‚   β”œβ”€β”€ config.py            # Settings from .env
β”‚   β”œβ”€β”€ worker.py            # arq worker β€” ingestion tasks
β”‚   β”œβ”€β”€ database/            # SQLAlchemy + pgvector
β”‚   β”œβ”€β”€ routers/             # API endpoints
β”‚   β”œβ”€β”€ services/            # Business logic (KB, MinIO, images)
β”‚   β”œβ”€β”€ ai/                  # Gemini integration
β”‚   └── channels/            # Zalo adapter + session manager
β”œβ”€β”€ alembic/                 # DB migrations
β”œβ”€β”€ frontend/                # Next.js 15 admin UI (shadcn/ui)
└── pyproject.toml

Worker Details

The arq worker runs as a separate process consuming jobs from Redis:

  • ingest_file_task: Upload β†’ Extract text β†’ Extract images β†’ Chunk β†’ Embed β†’ Store β†’ Summarize
  • ingest_url_task: Fetch URL β†’ Extract text β†’ Chunk β†’ Embed β†’ Store β†’ Summarize
  • Progress tracking: 0–100% with messages, auto-polled by frontend every 2s
  • Retry policy: max 3 attempts, 10s delay between retries
  • Max concurrent jobs: 3 (configurable via WORKER_MAX_JOBS)

Contributors

nduckmink

Issues