Asosiy qismga o'tish

SQL fayllar — bazani qo'lda qurish

6-bob 14 kod bloki 648 so'z

bootstrap.py bazani Python orqali quradi. Lekin loyihada toza SQL fayllar ham bor:

matn2 qator
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

matn2 qator
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

python26 qator
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:

python2 qator
CREATE EXTENSION "uuid-ossp";
id UUID PRIMARY KEY DEFAULT uuid_generate_v4()

Natija ba'zi serverlarda:

yaml2 qator
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:

python1 qator
id UUID PRIMARY KEY DEFAULT gen_random_uuid()

PostgreSQL 13+ da yadroda bor. Kengaytma kerak emas.

2-tuzoq: vektor o'lchami

python2 qator
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:

yaml1 qator
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

python2 qator
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

matn1 qator
\c rag_demo

Bu SQL emas — psql dasturining buyrug'i ("connect").

Python'dan yuborsangiz xato chiqadi:

python1 qator
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

matn2 qator
\c rag_demo
\dt rag.*

To'rtta jadval ko'rinishi kerak: chat_history, chunks, documents, settings.

Indekslar:

sql2 qator
SELECT indexname FROM pg_indexes
WHERE schemaname = 'rag' AND indexname LIKE '%hnsw%';

Ikkita HNSW indeks bo'lishi kerak.

O'lchamni tekshirish:

sql4 qator
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.

Telegramda yozish Narxlar