run.py va yakun
run.py
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
# 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
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,NDCGni 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.