Asosiy qismga o'tish

bootstrap.py — birinchi G'ALABA

5-bob 13 kod bloki 603 so'z

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:

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

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

matn1 qator
CREATE DATABASE cannot run inside a transaction block

Muammo 2: UUID

Ko'p qo'llanmalarda shunday yozilgan:

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

Bu ishlamasligi mumkin. uuid-ossp hamma PostgreSQL qurilmasida mavjud emas:

matn1 qator
extension "uuid-ossp" is not available

To'g'ri yechim — PostgreSQL 13+ da yadroga kiritilgan funksiya:

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

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

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

bash1 qator
python bootstrap.py

Kutilgan natija:

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

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

python5 qator
\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:

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

Telegramda yozish Narxlar