Enterprise Knowledge Bot β AI-powered document Q&A via Zalo.
- π 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
βββββββββββββββ βββββββββββββ βββββββββββββ
β 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.
| 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 |
- Python 3.11+
- Node.js 18+
- PostgreSQL 16+ with pgvector extension
- MinIO server
- Redis server
# 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# 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# --- 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=150bitsbooklm/
βββ 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
The arq worker runs as a separate process consuming jobs from Redis:
ingest_file_task: Upload β Extract text β Extract images β Chunk β Embed β Store β Summarizeingest_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)