bootstrap.py — birinchi G'ALABA
Bu bobda birinchi marta biror narsa ishlaydi. Terminalda natija ko'rasiz.
bootstrap.py — bazani noldan quradi: baza, kengaytma, schema,
jadvallar, indekslar va namuna ma'lumot.
Nega alohida fayl
Talaba loyihani yuklab oldi. Endi nima? psql ochib, 200 qator SQL
yozadimi? Yo'q. Bitta buyruq:
python bootstrap.py
Hamma narsa tayyor bo'ladi.
Muammo 1: bazani yaratish
Bazaga ulanish uchun baza kerak. Lekin biz bazani hali yaratmadik. Aylanma.
Yechim: postgres degan tizim bazasiga ulanamiz va u yerdan
yangi baza yaratamiz.
import psycopg2 from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT conn = psycopg2.connect( host=settings.db_host, port=settings.db_port, user=settings.db_user, password=settings.db_password, dbname="postgres", # <- TIZIM bazasi, o'zimizniki emas ) conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) cur = conn.cursor() cur.execute("SELECT 1 FROM pg_database WHERE datname = 'rag_demo'") if not cur.fetchone(): cur.execute("CREATE DATABASE rag_demo")
ISOLATION_LEVEL_AUTOCOMMIT — bu qatorsiz ishlamaydi.
CREATE DATABASE tranzaksiya ichida bajarilmaydi. PostgreSQL buni
taqiqlaydi. psycopg2 esa odatda hamma narsani tranzaksiyaga o'raydi.
Autocommit rejimi shu o'rashni o'chiradi.
Xato quyidagicha ko'rinadi:
CREATE DATABASE cannot run inside a transaction block
Muammo 2: UUID
Ko'p qo'llanmalarda shunday yozilgan:
CREATE EXTENSION "uuid-ossp"; id UUID PRIMARY KEY DEFAULT uuid_generate_v4()
Bu ishlamasligi mumkin. uuid-ossp hamma PostgreSQL qurilmasida
mavjud emas:
extension "uuid-ossp" is not available
To'g'ri yechim — PostgreSQL 13+ da yadroga kiritilgan funksiya:
id UUID PRIMARY KEY DEFAULT gen_random_uuid()
Hech qanday kengaytma kerak emas. Bizning kod avval shuni sinaydi,
faqat eski serverda uuid-ossp ga qaytadi.
Kengaytmalar
cur.execute('CREATE EXTENSION IF NOT EXISTS "vector"')
IF NOT EXISTS — takroriy ishga tushirishda xato bermaydi. Bu
idempotentlik: skriptni necha marta ishlatsangiz ham, natija
bir xil.
Indekslar
CREATE INDEX idx_chunks_embedding_local_hnsw ON rag.chunks USING hnsw (embedding_local vector_cosine_ops);
HNSW — vektor qidiruv uchun indeks turi. Busiz PostgreSQL har bir qidiruvda barcha chunk'larni tekshiradi. 100 ta chunk'da sezilmaydi, 100 000 ta chunk'da qidiruv sekundlar davom etadi.
vector_cosine_ops — cosine masofa uchun. Agar boshqa masofa
ishlatsangiz (<-> evklid), indeks turini ham o'zgartirish kerak,
aks holda indeks ishlatilmaydi va siz buni sezmaysiz.
Ishga tushiring
python bootstrap.py
Kutilgan natija:
1-QADAM: BAZA YARATISH [OK] 'rag_demo' bazasi YARATILDI 2-QADAM: KENGAYTMALAR [OK] vector 0.6.2 — vektor saqlash va qidirish [OK] gen_random_uuid() — yadro funksiyasi (PG13+) 3-QADAM: SCHEMA VA JADVALLAR [OK] rag.documents [OK] rag.chunks (embedding_local = vector(1024)) 4-QADAM: VEKTOR INDEKSLARI [OK] idx_chunks_embedding_local_hnsw 5-QADAM: MA'LUMOT YUKLASH [OK] Nihol tariflari (uz) 3 chunk 6-QADAM: TEKSHIRUV [OK] hujjatlar: 6 chunklar: 14 embedding: 0 [OK] cosine distance sinovi: 0.008540 (pgvector ishlayapti)
embedding: 0 — bu to'g'ri. Matn bor, vektor yo'q. Vektorlarni
9-bobda yasaymiz.
Haqiqiy ma'lumot bilan
python bootstrap.py --qayta --pdf hujjat.pdf python bootstrap.py --qayta --url https://sayt.uz/tariflar
--qayta — eskisini o'chirib, qaytadan yuklaydi.
Bazani o'z ko'zingiz bilan ko'ring
\c rag_demo \dt rag.* SELECT title, source_type, language FROM rag.documents; SELECT chunk_index, left(chunk_text, 60) FROM rag.chunks LIMIT 5;
Diqqat: \c va \dt — bu SQL emas, psql buyruqlari. Ularni
Python'dan yuborsangiz xato chiqadi.
Vektor ustuni hozircha bo'sh:
SELECT count(*) AS jami, count(embedding_local) AS vektorli FROM rag.chunks;
jami = 14, vektorli = 0. Keyingi boblarda buni to'ldiramiz.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.