SQL fayllar — bazani qo'lda qurish
bootstrap.py bazani Python orqali quradi. Lekin loyihada toza SQL
fayllar ham bor:
sql/01-setup.sql <- baza, schema, jadvallar sql/02-indexes.sql <- indekslar
Qaysi birini ishlatish
bootstrap.py |
sql/*.sql |
|
|---|---|---|
| Ishga tushirish | python bootstrap.py |
psql -f sql/01-setup.sql |
| Ma'lumot yuklaydi | HA (PDF, URL, namuna) | YO'Q |
| O'lchamni modeldan oladi | HA (avtomatik) | YO'Q (qo'lda yozilgan) |
| Xato xabari | tushunarli o'zbekcha | psql xatosi |
| Dars uchun | boshlash uchun | SQL ni O'RGATISH uchun |
Tavsiya: darsda ikkalasini ham ko'rsating.
SQL fayl — talaba haqiqiy CREATE TABLE ni ko'radi, ORM orqasida
nima borligini tushunadi. bootstrap.py — tez ishga tushirish.
Ishga tushirish
psql -U postgres -f sql/01-setup.sql psql -U postgres -d rag_demo -f sql/02-indexes.sql
Diqqat: tartib muhim. Indekslar jadval mavjud bo'lgandan keyin yaratiladi.
01-setup.sql ichida nima bor
CREATE DATABASE rag_demo; \c rag_demo CREATE EXTENSION IF NOT EXISTS vector; CREATE SCHEMA IF NOT EXISTS rag; CREATE TABLE IF NOT EXISTS rag.documents ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), title VARCHAR(500) NOT NULL, source_type VARCHAR(50) NOT NULL, source_url TEXT, language VARCHAR(10) DEFAULT 'uz', created_at TIMESTAMPTZ DEFAULT now() ); CREATE TABLE IF NOT EXISTS rag.chunks ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), document_id UUID REFERENCES rag.documents(id) ON DELETE CASCADE, chunk_text TEXT NOT NULL, chunk_index INTEGER NOT NULL, language VARCHAR(10) DEFAULT 'uz', embedding_local vector(1024), embedding_cloud vector(1536), created_at TIMESTAMPTZ DEFAULT now() );
Uchta tuzoq
Bu fayl avval ishlamas edi. Uchta xato bor edi va ular talabalar ham uchratadigan xatolar.
1-tuzoq: uuid-ossp
Ko'p qo'llanmalarda shunday yozilgan:
CREATE EXTENSION "uuid-ossp"; id UUID PRIMARY KEY DEFAULT uuid_generate_v4()
Natija ba'zi serverlarda:
ERROR: extension "uuid-ossp" is not available ERROR: function uuid_generate_v4() does not exist
Keyin hamma jadval yaratilmaydi. Fayl oxirigacha o'qiladi, lekin hech narsa qolmaydi.
To'g'ri yechim:
id UUID PRIMARY KEY DEFAULT gen_random_uuid()
PostgreSQL 13+ da yadroda bor. Kengaytma kerak emas.
2-tuzoq: vektor o'lchami
embedding_local vector(4096) -- XATO edi embedding_local vector(1024) -- bge-m3 uchun TO'G'RI
.env da OLLAMA_EMBED_MODEL=bge-m3 yozilgan bo'lsa, model 1024
ta son qaytaradi. Jadval 4096 kutsa:
ERROR: expected 4096 dimensions, not 1024
Va bu xato faqat embedding yozishda chiqadi — jadval yaratishda emas. Ya'ni yarim soatdan keyin, sababi noaniq holda.
| Model | O'lcham |
|---|---|
| bge-m3, mxbai-embed-large | 1024 |
| nomic-embed-text | 768 |
| all-minilm | 384 |
SQL faylda bu son QO'LDA yoziladi. Model almashtirsangiz — SQL ni
ham o'zgartiring. bootstrap.py buni avtomatik qiladi, SQL esa yo'q.
Bu SQL faylning asosiy kamchiligi.
3-tuzoq: bo'sh jadvalda IVFFlat
CREATE INDEX ... USING ivfflat (embedding_local vector_cosine_ops) WITH (lists = 100);
IVFFlat ma'lumotdan klaster quradi. Bo'sh jadvalda yaratsangiz, klasterlar ma'nosiz bo'ladi va qidiruv sifati pasayadi.
Ikki yechim:
- HNSW ishlating — u bo'sh jadvalda ham to'g'ri ishlaydi (bizning tanlov)
- yoki IVFFlat ni ma'lumot yuklangandan keyin yarating
Shuning uchun 02-indexes.sql da HNSW yoqilgan, IVFFlat izohda.
\c nima
\c rag_demo
Bu SQL emas — psql dasturining buyrug'i ("connect").
Python'dan yuborsangiz xato chiqadi:
cur.execute("\\c rag_demo") # XATO: syntax error at or near "\"
Python'da bazani almashtirish uchun yangi ulanish ochish kerak.
bootstrap.py aynan shunday qiladi.
Tekshirish
\c rag_demo \dt rag.*
To'rtta jadval ko'rinishi kerak: chat_history, chunks,
documents, settings.
Indekslar:
SELECT indexname FROM pg_indexes WHERE schemaname = 'rag' AND indexname LIKE '%hnsw%';
Ikkita HNSW indeks bo'lishi kerak.
O'lchamni tekshirish:
SELECT atttypmod AS olcham FROM pg_attribute WHERE attrelid = 'rag.chunks'::regclass AND attname = 'embedding_local';
1024 chiqishi kerak. Boshqa son chiqsa — model bilan mos emas.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.