Muammo va Yechim
LLM cheklovlari: Nega oddiy ChatGPT yetarli emas?
Katta til modellari (Large Language Models) — ChatGPT, Claude, Qwen — hayratlanarli darajada kuchli. Lekin ularning uchta fundamental cheklovi bor, va bu cheklovlar biznes ilovalar uchun jiddiy muammo tug'diradi.
1. Knowledge Cutoff — Bilim chegarasi
Har bir LLM ma'lum bir sanagacha bo'lgan ma'lumotlar bilan o'qitilgan. ChatGPT-4o masalan 2024-yil oktyabrgacha biladi. Undan keyingi voqealar haqida — mutlaqo xabarsiz.
Foydalanuvchi: "Nihol kompaniyasi 2025-yilda qanday loyihalar qildi?"
ChatGPT: "Kechirasiz, mening ma'lumotlarim 2024-yil oktyabrgacha.
Bu haqda aniq javob bera olmayman."
Bu degani, agar kompaniyangiz yangi loyiha qilgan bo'lsa, hatto eng kuchli LLM ham bu haqda bilmaydi.
2. Private Data — Maxfiy ma'lumotlarga kirish yo'qligi
LLM lar faqat internet dagi ommaviy ma'lumotlar bilan o'qitilgan. Sizning ichki hujjatlar, korporativ bazalar, CRM ma'lumotlari, shartnomalar — bularning hech biri LLM da yo'q.
Foydalanuvchi: "Nihol kompaniyasi Ucell uchun qanday loyiha qilgan?"
ChatGPT: "Nihol kompaniyasi haqida aniq ma'lumotim yo'q.
Iltimos, kompaniya veb-saytini tekshiring."
ChatGPT Nihol kompaniyasi haqida hech narsa bilmaydi — chunki nihol.uz saytidagi ma'lumotlar uning training data siga kirmagan yoki juda kam kiritilgan.
3. Hallucination — Gallyutsinatsiya
Bu eng xavfli cheklov. LLM bilmagan narsani so'rasangiz, u gohida ishonchli ko'rinadigan, lekin to'liq soxta javob beradi.
Foydalanuvchi: "Nihol kompaniyasi Ucell uchun qanday loyiha qilgan?"
ChatGPT: "Nihol kompaniyasi Ucell uchun tarmoq infratuzilmasini
modernizatsiya qilish loyihasini amalga oshirgan." # <-- SOXTA!
Bu javob ishonchli ko'rinadi, lekin bu to'liq uydirilgan. Haqiqatda Nihol Ucell uchun IBM Power CPU VRM modullarini yetkazib berish va Dell PowerEdge billing modernizatsiyasini amalga oshirgan. LLM buni bilmaydi, shuning uchun o'ylab topadi.
RAG bilan farq: Haqiqiy ma'lumot bazasidan javob
Endi xuddi shu savolni RAG tizimiga beraylik. Bizning Nihol loyihasidagi tizim qanday ishlaydi:
Foydalanuvchi: "Nihol kompaniyasi Ucell uchun qanday loyiha qilgan?"
RAG tizimi:
1. Savolni embedding ga aylantiradi (Qwen3-embedding modeli)
2. PostgreSQL + pgvector da eng o'xshash chunk larni qidiradi
3. Eng tegishli chunk larni tanlaydi (top-3 + kalit so'z mosliklari)
4. LLM ga FAQAT topilgan ma'lumotlar bilan javob berdiriladi
Javob: "Nihol kompaniyasi Ucell uchun quyidagi loyihalarni amalga oshirgan:
1. IBM Power CPU VRM modullarini yetkazib berish
2. Dell PowerEdge billing modernizatsiyasi
3. Tarmoq monitoring tizimini joriy etish"
Farqni ko'ryapsizmi? RAG tizimi o'ylab topmaydi — u bazadagi haqiqiy ma'lumotlardan javob beradi. Agar bazada ma'lumot bo'lmasa, ochiq aytadi: "Ma'lumot topilmadi."
RAG nima? Retrieval-Augmented Generation
RAG — Retrieval-Augmented Generation — bu LLM ni tashqi bilim bazasi bilan boyitish usuli. Tushunish uchun kutubxonachi analogiyasini ko'raylik.
Kutubxonachi analogiyasi
Tasavvur qiling, juda bilimdon professor bor (bu LLM). U million kitob o'qigan, lekin: - Oxirgi 2 yilning yangi kitoblarini o'qimagan (knowledge cutoff) - Sizning kompaniyangiz ichki hujjatlarini ko'rmagan (private data) - Bilmagan savolingizga ishonchli javob uydirib berishi mumkin (hallucination)
Endi professorga shaxsiy kutubxonachi biriktiramiz. Kutubxonachi: 1. Savolingizni eshitadi 2. Kutubxonaga (bilim bazasiga) boradi 3. Eng tegishli kitob va sahifalarni topadi 4. Professorga olib keladi: "Mana, shu sahifalarga qarang" 5. Professor FAQAT shu sahifalar asosida javob beradi
+------------------+ +-------------------+ +------------------+
| | | | | |
| Foydalanuvchi | --> | Kutubxonachi | --> | Professor |
| (Savol beradi) | | (Retrieval) | | (Generation) |
| | | | | |
+------------------+ +-------------------+ +------------------+
| |
v v
+-----------+ +-------------+
| Bilim | | Javob faqat |
| bazasi | | topilgan |
| (pgvector)| | ma'lumotlar |
+-----------+ | asosida |
+-------------+
Kodda bu qanday ko'rinadi? Bizning Nihol loyihasidan haqiqiy misol:
# 1. Savolni embedding ga aylantirish (kutubxonachi savolni tushunishi) def generate_query_embedding(text_input: str) -> list[float] | None: resp = httpx.post( f"{settings.OLLAMA_URL}/api/embed", json={"model": "qwen3-embedding:8b", "input": text_input}, ) return resp.json()["embeddings"][0] # 4096 o'lchamli vektor # 2. Bazadan eng o'xshash chunk larni qidirish (kutubxonachi kitob qidirishi) sql = """ SELECT chunk_text, 1 - (embedding_local <=> :vec) AS similarity FROM wde.lv_content_chunks WHERE embedding_local IS NOT NULL ORDER BY embedding_local <=> :vec LIMIT 10 """ # 3. LLM ga context bilan savol berish (professor javob berishi) messages = [ {"role": "system", "content": "FAQAT quyidagi CONTEXT asosida javob ber."}, {"role": "system", "content": f"CONTEXT:\n\n{topilgan_chunklar}"}, {"role": "user", "content": "Nihol Ucell uchun nima qilgan?"}, ]
RAG vs Fine-tuning vs Prompt Engineering
LLM ni maxsus bilimlar bilan boyitishning uchta yo'li bor. Har birining o'z joyi bor.
| Xususiyat | Prompt Engineering | RAG | Fine-tuning |
|---|---|---|---|
| Mohiyati | LLM ga prompt orqali ko'rsatma va context berish | Tashqi bazadan qidirib, topilgan ma'lumotni LLM ga berish | LLM ni yangi ma'lumotlar ustida qayta o'qitish |
| Murakkabligi | Past | O'rta | Yuqori |
| Narxi | Bepul (faqat API cost) | O'rtacha (baza + embedding) | Yuqori (GPU, vaqt, ekspert) |
| Ma'lumot yangilanishi | Har safar prompt da yozish kerak | Bazaga qo'shsangiz — darrov ishlaydi | Qayta o'qitish kerak (soatlab/kunlab) |
| Ma'lumot hajmi | 4K-128K token (context window) | Millionlab hujjatlar | O'qitish uchun minglab misollar |
| Hallucination nazorati | Past (LLM o'zi hal qiladi) | Yuqori (faqat bazadagi ma'lumot) | O'rta (o'qitish sifatiga bog'liq) |
| Shaxsiylashtirish | Past | Yuqori | Juda yuqori |
| Misol | "Sen Nihol kompaniyasi assistentisan. Mana loyihalar ro'yxati: ..." | Savol keldi -> bazadan qidirdi -> topilgan ma'lumot bilan javob berdi | Qwen3 ni Nihol ma'lumotlari bilan qayta o'qitish |
Prompt Engineering — eng oddiy
# Barcha ma'lumotni prompt ga yozib qo'yish prompt = """Sen Nihol kompaniyasi assistentisan. Kompaniya loyihalari: 1. Ucell — IBM Power CPU VRM modullari 2. COSCOM — billing tizimi 3. Orient Finans Bank — SWIFT integratsiya ... Savol: {user_question} """
Muammo: Context window chegarasi bor. 100 ta loyihani prompt ga sig'dirsangiz bo'ladi, 10,000 ta loyihani sig'dira olmaysiz.
Fine-tuning — eng murakkab
# Ma'lumotlarni o'qitish formatiga tayyorlash training_data = [ { "messages": [ {"role": "user", "content": "Ucell loyihasi haqida gapirib bering"}, {"role": "assistant", "content": "Nihol Ucell uchun IBM Power..."} ] }, # ... minglab bunday misollar kerak ] # Keyin GPU da soatlab o'qitish
Muammo: Yangi loyiha qo'shilsa — qaytadan o'qitish kerak. Qimmat va sekin.
RAG — o'rtacha murakkablik, eng moslashuvchan
# Ma'lumotni bazaga qo'shish — bir necha soniya chunk = "Nihol 2025-yilda Yangi Loyiha amalga oshirdi..." embedding = generate_query_embedding(chunk) db.execute("INSERT INTO chunks (chunk_text, embedding_local) VALUES (:t, :e)", {"t": chunk, "e": str(embedding)}) # Shu zahoti foydalanuvchi so'rasa — javob bera oladi
Afzallik: Ma'lumot qo'shsangiz — darrov ishlaydi. O'qitish shart emas.
Qachon RAG ishlatish kerak?
RAG mos keladigan holatlar
- Kompaniya bilim bazasi — Nihol loyihasimizdek. Saytdagi barcha ma'lumotlar bazada, chatbot javob beradi.
- Tez-tez yangilanadigan ma'lumot — yangiliklar, loyihalar, mahsulotlar. Bazaga qo'shsangiz bas.
- Katta hajmdagi hujjatlar — minglab sahifalar, PDF lar, shartnomalar.
- Aniq javob kerak — hallucination qabul qilib bo'lmaydigan holatlar (tibbiyot, huquq, moliya).
- Manba ko'rsatish kerak — RAG har bir javob uchun qaysi hujjatdan olgani ma'lum.
RAG mos kelmaydigan holatlar
- Umumiy bilim savollari — "Python nima?" degan savolga RAG kerak emas, LLM o'zi biladi.
- Kreativ yozish — she'r yozish, hikoya yozishga RAG keraksiz.
- Kod yozish — dasturlash uchun LLM ning o'z bilimi yetarli (ko'p hollarda).
- Real-time ma'lumot — ob-havo, valyuta kursi — buning uchun API integration kerak, RAG emas.
- Juda kichik ma'lumot bazasi — 10-20 ta hujjat bo'lsa, prompt engineering yetarli.
Nihol loyihasining umumiy ko'rinishi
Bizning real loyiha qanday ishlaydi — yuqori darajada:
nihol.uz sayti Foydalanuvchi (Telegram)
| |
v v
+-----------+ +------------------+
| Scraper | | FastAPI endpoint |
| (Extract) | | /api/chat |
+-----+-----+ +--------+---------+
| |
v v
+-----------+ +------------------+
| Chunker | | expand_query() |
| (Split) | | LLM so'rovni |
+-----+-----+ | kengaytiradi: |
| | sinonim, termin |
v | qo'shadi |
+-----------+ +--------+---------+
| Embedding | |
| Qwen3-emb | v
| 4096 dim | +------------------+
+-----+-----+ | retrieve_chunks()|
| | pgvector search |
v | cosine distance |
+-----------+ +--------+---------+
| PostgreSQL| |
| pgvector | <---------qidirish----------+
| wde schema| |
+-----------+ v
+----------------------+
|select_context_chunks()|
| Top 3 + kalit so'z |
| mosliklari, max 8 |
+--------+-------------+
|
v
+------------------+
| build_prompt() |
| CONTEXT + Savol |
+--------+---------+
|
v
+------------------+
| Qwen3:8b LLM |
| Javob generatsiya|
+------------------+
Texnologiyalar: - Backend: FastAPI (Python) - Ma'lumotlar bazasi: PostgreSQL + pgvector extension - Embedding modeli: Qwen3-embedding:8b (4096 dimension) - Chat modeli: Qwen3:8b (Ollama orqali local) - Chunk tanlash: Heuristik -- top-3 + kalit so'z mosliklari (reranker modelsiz) - Til aniqlash: Kirill vs Lotin harf soni orqali (RU/UZ)
Xulosa
RAG — bu LLM ning eng katta kamchiliklarini hal qiluvchi arxitektura. U: - Knowledge cutoff muammosini hal qiladi (bazaga yangi ma'lumot qo'shing — darrov ishlaydi) - Private data muammosini hal qiladi (o'z hujjatlaringizni bazaga yuklang) - Hallucination ni kamaytiradi (LLM faqat topilgan ma'lumotlar asosida javob beradi)
Keyingi bobda RAG ning turli xillarini ko'rib chiqamiz — Naive RAG dan Agentic RAG gacha.
</> Loyihaning haqiqiy kodi — bu bob amalda qanday ishlaydi
app/config.py — barcha sozlamalar
from functools import lru_cache
from os import getenv
from dotenv import load_dotenv
load_dotenv()
class Settings:
DB_HOST: str = getenv("DB_HOST", "localhost")
DB_PORT: str = getenv("DB_PORT", "5432")
DB_USER: str = getenv("DB_USER", "postgres")
DB_PASSWORD: str = getenv("DB_PASSWORD", "")
DB_NAME: str = getenv("DB_NAME", "web_data_extractor")
SESSION_SECRET: str = getenv("SESSION_SECRET", "")
OLLAMA_URL: str = getenv("OLLAMA_URL", "http://127.0.0.1:11434")
EMBED_OLLAMA_URL: str = getenv("EMBED_OLLAMA_URL") or getenv("OLLAMA_URL", "http://127.0.0.1:11434")
EMBED_MODEL: str = getenv("EMBED_MODEL", "qwen3-embedding:8b")
EMBED_DIMENSIONS: int = int(getenv("EMBED_DIMENSIONS", "4096"))
#CHAT_MODEL: str = getenv("CHAT_MODEL", "qwen3.5:9b")
CHAT_MODEL: str = getenv("CHAT_MODEL", "qwen3:8b")
RERANK_MODEL: str = getenv("RERANK_MODEL", "dengcao/Qwen3-Reranker-8B:Q5_K_M")
RAG_TOP_K: int = int(getenv("RAG_TOP_K", "15"))
RAG_RERANK_TOP: int = int(getenv("RAG_RERANK_TOP", "8"))
RAG_TEMPERATURE: float = float(getenv("RAG_TEMPERATURE", "0.0"))
RAG_SIMILARITY_THRESHOLD: float = float(getenv("RAG_SIMILARITY_THRESHOLD", "0.0"))
PUBLIC_RATE_LIMIT_PER_MIN: int = int(getenv("PUBLIC_RATE_LIMIT_PER_MIN", "10"))
@property
def DATABASE_URL(self) -> str:
return (
f"postgresql://{self.DB_USER}:{self.DB_PASSWORD}"
f"@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}"
)
@lru_cache
def get_settings() -> Settings:
return Settings()app/services/chat.py — til aniqlash
def detect_lang(text_input: str) -> str:
if any(c in _UZ_CYRILLIC for c in text_input):
return "UZ"
if any("\u0400" <= c <= "\u04ff" for c in text_input):
return "RU"
return "UZ"Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.