Asosiy qismga o'tish

run.py va yakun

21-bob 3 kod bloki 600 so'z

run.py

python40 qator
import sys
import uvicorn

from app.config import settings
from app.database import SessionLocal
from sqlalchemy import text


def tekshir():
    """Ishga tushirishdan oldin baza tayyorligini tekshiradi."""
    try:
        db = SessionLocal()
        n = db.execute(text(
            "SELECT count(embedding_local) FROM rag.chunks")).scalar()
        db.close()
    except Exception as e:
        print(f"[XATO] Bazaga ulanib bo'lmadi: {type(e).__name__}")
        print("       Avval ishga tushiring:  python bootstrap.py")
        return False

    if n == 0:
        print("[OGOH] Bazada embedding YO'Q — qidiruv bo'sh natija beradi.")
        print("       Ishga tushiring:  python -m scraper.embedder")
    else:
        print(f"       {n} ta vektor tayyor")
    return True


if __name__ == "__main__":
    print("=" * 56)
    print("RAG DEMO")
    print("=" * 56)
    print(f"  Rejim: {settings.rag_mode}")
    print(f"  Baza : {settings.db_name} @ {settings.db_host}")

    if not tekshir():
        sys.exit(1)

    print("  Manzil: http://localhost:8000")
    uvicorn.run("app.main:app", host="0.0.0.0", port=8000, reload=True)

Pre-flight tekshiruv nega kerak

Busiz: ilova ishga tushadi, foydalanuvchi savol beradi, "ma'lumot yo'q" javobini oladi va sababni bilmaydi.

Bu bilan: muammo darhol aytiladi, aniq buyruq bilan.

To'liq ishga tushirish tartibi

bash15 qator
# 1. Baza
python bootstrap.py

# yoki haqiqiy ma'lumot bilan:
python bootstrap.py --qayta --pdf hujjat.pdf
python bootstrap.py --qayta --url https://sayt.uz/sahifa

# 2. Vektorlar (Ollama ishlab turishi kerak)
python -m scraper.embedder

# 3. Quvurni ko'rish (dars uchun)
python demo_pipeline.py "Nihol narxi qancha?"

# 4. Ilova
python run.py

Brauzerda: http://localhost:8000

Nima qurdik

python28 qator
PDF / Sayt
    |  pdf_parser, web_scraper
    v
  Xom matn
    |  normalizer
    v
 Toza matn
    |  chunker  (overlap bilan)
    v
  Bo'laklar
    |  embedder  (bge-m3)
    v
 Vektorlar -> PostgreSQL + pgvector (HNSW indeks)


Savol
  |  embedder
  v
Vektor
  |  search  (<=> cosine, threshold)
  v
10 ta chunk
  |  reranker  (cross-encoder)
  v
 5 ta chunk
  |  generator  (prompt + LLM)
  v
Javob + manba

Eng ko'p uchraydigan xatolar

Xato Sabab Yechim
extension "vector" is not available pgvector yo'q 0-bobga qayting
function uuid_generate_v4() does not exist eski usul gen_random_uuid()
expected 768 dimensions, not 1024 model almashtirildi bootstrap.py --qayta
NoneType has no len() Ollama o'chiq ollama serve
Qidiruv bo'sh embedding yo'q python -m scraper.embedder
Qidiruv sekin HNSW indeks ishlamayapti ORDER BY da xom <=> ishlating
Javob o'ylab topilgan prompt kuchsiz 2-qoidani kuchaytiring

Keyingi qadamlar

1. Baholash (eng muhim)

Hozir "yaxshi ishlayapti shekilli" deb taxmin qilyapsiz. Buni o'lchang:

  • 30-50 ta savol va to'g'ri javob juftligini qo'lda tayyorlang
  • Recall@k, MRR, NDCG ni hisoblang
  • Har bir o'zgarishdan keyin qayta o'lchang

Busiz siz ko'r holda ishlaysiz.

2. Hybrid search

Vektor qidiruv ma'noni topadi, lekin aniq atamalarni (mahsulot kodi, ism) o'tkazib yuborishi mumkin. PostgreSQL'ning full-text qidiruvini qo'shing va ikkala natijani birlashtiring.

3. Suhbat tarixi

Hozir har bir savol mustaqil. "Uning narxi qancha?" degan savol ishlamaydi — "uning" nimaligini bilmaydi.

4. Streaming

Javob 3 sekund kutish o'rniga so'zma-so'z chiqsin. Ollama'da "stream": True.

5. Production

  • Rate limiting (bir foydalanuvchi minutiga N ta so'rov)
  • Loglar (qaysi savol, qancha vaqt, qaysi chunk)
  • Backup (pg_dump)
  • HTTPS

Yakuniy fikr

RAG murakkab ko'rinadi, lekin aslida oddiy:

Savolga o'xshash matnlarni top, ularni LLM ga kontekst sifatida ber.

Qolgan hamma narsa — shu g'oyani yaxshilash: qanday bo'laklash, qanday o'xshashlik o'lchash, qanday tartiblash, qanday prompt yozish.

Sizda endi ishlaydigan tizim bor. Uni yaxshilash — o'lchash va sinashdan boshlanadi, taxmindan emas.


Bu bobni bepul o'qidingiz.

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

Telegramda yozish Narxlar