Tra nhanh lệnh pgvector (extension, kiểu vector, index HNSW/IVFFlat, toán tử khoảng cách) và Qdrant (collection, upsert, search có filter) khi dựng RAG.
Lệnh hay dùng để lưu và truy vấn embedding. Pipeline RAG tổng thể (chunking, embedding, rerank) xem RAG cơ bản. Số chiều trong ví dụ là 1024: thay bằng số chiều của model embedding bạn dùng.
SELECT extversion FROM pg_extension WHERE extname = 'vector';
Chạy nhanh bằng Docker
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=$PGPASSWORD pgvector/pgvector:pg17
Cột embedding
embedding vector(1024)
Tiết kiệm bộ nhớ (float16)
embedding halfvec(1024)
CREATE TABLE doc_chunks ( id bigserial PRIMARY KEY, source text NOT NULL, -- vd runbook/bgp.md vendor text, -- iosxr / junos, dùng để filter content text NOT NULL, embedding vector(1024) NOT NULL);INSERT INTO doc_chunks (source, vendor, content, embedding)VALUES ('runbook/bgp.md', 'iosxr', 'Kiểm tra hold timer...', '[0.012, -0.034, ...]');
-- top 5 chunk gần nhất theo cosine, có filterSELECT id, source, 1 - (embedding <=> $1) AS similarityFROM doc_chunksWHERE vendor = 'iosxr'ORDER BY embedding <=> $1LIMIT 5;
Index chỉ được dùng khi có ORDER BY embedding <op> ... LIMIT n với đúng toán tử khớp operator class của index. Embedding đã chuẩn hoá (norm = 1) thì cosine và inner product cho cùng thứ tự kết quả.
CREATE INDEX ON doc_chunks USING hnsw (embedding vector_cosine_ops);
HNSW chỉnh tham số
... USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64);
Tăng recall khi query HNSW
SET hnsw.ef_search = 100; (mặc định 40)
IVFFlat (build nhanh, nên tạo sau khi đã có dữ liệu)
CREATE INDEX ON doc_chunks USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
Tăng recall khi query IVFFlat
SET ivfflat.probes = 10; (mặc định 1)
Tăng bộ nhớ khi build index
SET maintenance_work_mem = '2GB';
Xem query có dùng index
EXPLAIN ANALYZE SELECT ... ORDER BY embedding <=> $1 LIMIT 5;
Gợi ý lists cho IVFFlat: khoảng rows / 1000 nếu dưới 1 triệu dòng. Index HNSW/IVFFlat cho kiểu vector giới hạn tối đa 2000 chiều. Model nhiều chiều hơn thì dùng halfvec (index được tới 4000 chiều).