Asosiy qismga o'tish

Papka tuzilishi

1-bob 7 kod bloki 407 so'z

Birinchi savol: qaysi papkani birinchi yaratamiz?

Javob muhim, chunki papka tuzilishi — bu loyihaning skeleti. Noto'g'ri boshlasangiz, keyin hamma narsani ko'chirishga to'g'ri keladi.

Yaratamiz

bash5 qator
mkdir RagDemo
cd RagDemo

python -m venv venv
source venv/bin/activate      # Windows: venv\Scripts\activate

venv nega birinchi? Chunki paketlarni tizim Python'iga o'rnatmaslik kerak. Har bir loyihaning o'z paketlari bo'ladi. Buni birinchi kunda o'rganmasangiz — uchinchi loyihada versiya konflikti chiqadi.

Endi skelet:

bash5 qator
mkdir -p app/models app/routes app/services app/templates
mkdir scraper
touch app/__init__.py app/models/__init__.py
touch app/routes/__init__.py app/services/__init__.py
touch scraper/__init__.py

Nima uchun aynan shunday

python23 qator
RagDemo/
├── .env                  <- parollar. GIT'GA TUSHMAYDI
├── .env.example          <- namuna. Bu git'ga tushadi
├── requirements.txt      <- paketlar ro'yxati
├── bootstrap.py          <- bazani noldan quradi
├── run.py                <- ilovani ishga tushiradi
├── demo_pipeline.py      <- RAG ni qadam-baqadam ko'rsatadi
│
├── app/                  <- WEB ILOVA
│   ├── config.py         <- barcha sozlamalar bitta joyda
│   ├── database.py       <- bazaga ulanish
│   ├── main.py           <- FastAPI ilovasi
│   ├── models/           <- jadval ta'riflari
│   ├── routes/           <- URL manzillar
│   ├── services/         <- RAG MANTIG'I (eng muhim papka)
│   └── templates/        <- HTML sahifalar
│
└── scraper/              <- MA'LUMOT TAYYORLASH
    ├── pdf_parser.py     <- PDF -> matn
    ├── web_scraper.py    <- sayt -> matn
    ├── normalizer.py     <- matnni tozalash
    ├── chunker.py        <- matnni bo'laklash
    └── embedder.py       <- bo'lak -> vektor

Asosiy g'oya: app/ va scraper/ ALOHIDA.

Sababi shundaki, ular turli vaqtda ishlaydi:

  • scraper/ — bir marta ishlaydi, ma'lumotni tayyorlaydi
  • app/ — doim ishlaydi, foydalanuvchi savollariga javob beradi

Agar ularni aralashtirsangiz, saytni yangilash uchun butun ilovani qayta ishga tushirishga to'g'ri keladi. Ajratilgan bo'lsa — scraper ni alohida ishga tushirasiz, ilova esa ishlab turaveradi.

services/ nega alohida? Chunki RAG mantig'i (qidiruv, reranking, javob yozish) HTTP dan mustaqil bo'lishi kerak. Bugun web, ertaga Telegram bot — mantiq o'zgarmaydi, faqat routes/ o'zgaradi.

requirements.txt

matn11 qator
fastapi
uvicorn[standard]
jinja2
python-multipart
sqlalchemy
psycopg2-binary
pgvector
pydantic-settings
httpx
PyMuPDF
beautifulsoup4

O'rnatamiz:

bash1 qator
pip install -r requirements.txt

Har biri nima uchun:

Paket Vazifasi
fastapi + uvicorn web server
jinja2 HTML shablonlar
sqlalchemy bazaga Python orqali murojaat
psycopg2-binary PostgreSQL drayveri
pgvector SQLAlchemy uchun Vector ustun turi
httpx Ollama ga so'rov yuborish
PyMuPDF PDF o'qish
beautifulsoup4 HTML dan matn ajratish

.gitignore

matn4 qator
venv/
__pycache__/
.env
*.pyc

.env ni birinchi qatorga yozing. Parol git'ga tushsa — uni o'chirish deyarli imkonsiz, tarixda qoladi.

Tekshiruv

bash1 qator
python -c "import fastapi, sqlalchemy, pgvector, fitz; print('paketlar joyida')"

Bu ishlasa — 2-bobga.


Bu bobni bepul o'qidingiz.

Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.

Telegramda yozish Narxlar