Cài đặt package pgvector cho PostgreSQL 16
Để bắt đầu, chúng ta cần cài đặt extension pgvector tương thích với phiên bản PostgreSQL 16 đang chạy trên Ubuntu 24.04. Vì pgvector là một extension mở rộng, cách tốt nhất và ổn định nhất là sử dụng repository chính thức của Postgres App hoặc cài đặt từ source code nếu không có package binary cho Ubuntu 24.04 (Hirsute/Noble) trong các repo mặc định.
Tuy nhiên, trên Ubuntu 24.04, chúng ta sẽ sử dụng phương pháp cài đặt từ source code để đảm bảo tính tương thích tuyệt đối với PostgreSQL 16, vì các package trong apt có thể chưa cập nhật kịp phiên bản mới nhất của pgvector.
Bước 1: Cài đặt các công cụ build và dependencies cần thiết.
sudo apt update
sudo apt install -y build-essential git postgresql-server-dev-16 libpq-dev
Kết quả mong đợi: Các package build-essential, git, và header files của PostgreSQL 16 được cài đặt thành công mà không có lỗi.
Bước 2: Clone repository pgvector từ GitHub và checkout phiên bản mới nhất.
cd /tmp
git clone https://github.com/pgvector/pgvector.git
cd pgvector
git checkout main
Kết quả mong đợi: Mã nguồn pgvector được tải về thư mục /tmp/pgvector và bạn đang ở trên nhánh main.
Bước 3: Build và cài đặt extension pgvector vào hệ thống PostgreSQL 16.
make
sudo make install
Kết quả mong đợi: Quá trình biên dịch hoàn tất và các file extension (.so) được copy vào thư mục module của PostgreSQL 16 (thường là /usr/lib/postgresql/16/lib/).
Bước 4: Verify việc cài đặt bằng cách kiểm tra file extension.
ls /usr/lib/postgresql/16/lib/ | grep vector
Kết quả mong đợi: Danh sách xuất hiện file vector.so và pgvector.control.
Kích hoạt extension pgvector trong database mục tiêu
Sau khi cài đặt file binary, chúng ta cần đăng ký extension này vào database cụ thể mà ứng dụng AI sẽ sử dụng. Hãy giả sử chúng ta đã tạo database tên là ai_db trong Phần 1.
Bước 1: Kết nối vào database ai_db bằng người dùng postgres.
sudo -u postgres psql -d ai_db
Kết quả mong đợi: Prompt SQL chuyển đổi từ shell sang ai_db=#.
Bước 2: Tạo extension pgvector trong database hiện tại.
CREATE EXTENSION vector;
Kết quả mong đợi: Thông báo CREATE EXTENSION xuất hiện, xác nhận extension đã được kích hoạt.
Bước 3: Kiểm tra các kiểu dữ liệu mới được thêm vào catalog.
\d vector
Kết quả mong đợi: PostgreSQL hiển thị thông tin về kiểu dữ liệu vector, bao gồm input/output functions và length.
Kiểm tra phiên bản và tính năng sẵn có của pgvector
Trước khi bắt đầu tạo bảng, cần xác nhận phiên bản pgvector đã cài đặt để đảm bảo tính năng HNSW và các hàm distance metrics (L2, Cosine, Inner Product) đều hoạt động.
Bước 1: Truy vấn thông tin phiên bản extension.
SELECT name, default_version, installed_version FROM pg_available_extensions WHERE name = 'vector';
Kết quả mong đợi: Cột installed_version trả về một số phiên bản cụ thể (ví dụ: 0.5.x hoặc 0.6.x) thay vì NULL.
Bước 2: Kiểm tra các hàm distance metrics hỗ trợ.
SELECT proname FROM pg_proc WHERE proname LIKE '%' OR proname LIKE '%' OR proname LIKE '%';
Kết quả mong đợi: Danh sách các toán tử khoảng cách: <-> (L2 distance), <#> (Inner Product), <=> (Cosine distance).
Tạo bảng lưu trữ vector embeddings với kiểu dữ liệu vector
Bây giờ chúng ta sẽ tạo bảng để lưu trữ dữ liệu văn bản và vector embedding tương ứng. Chúng ta sẽ sử dụng kiểu dữ liệu vector với kích thước chiều (dimensions) cụ thể, ví dụ 1536 chiều (phổ biến với OpenAI text-embedding-ada-002) hoặc 768 chiều (phổ biến với BERT).
Bước 1: Tạo bảng documents với cột metadata và cột vector.
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536)
);
Kết quả mong đợi: Thông báo CREATE TABLE xác nhận bảng đã được tạo thành công.
Bước 2: Chèn dữ liệu mẫu với vector embedding giả lập để kiểm tra.
INSERT INTO documents (content, embedding)
VALUES (
'Triển khai AI với PostgreSQL',
'[0.1, 0.2, 0.3, ..., 0.95]'::vector
);
Lưu ý: Để chạy lệnh trên chính xác, bạn cần một mảng 1536 số. Dưới đây là lệnh chèn một vector ngắn hơn để test nhanh, sau đó scale lên 1536 khi thực tế.
INSERT INTO documents (content, embedding)
VALUES ('Dữ liệu mẫu 1', ARRAY[0.1, 0.2, 0.3]::vector);
Kết quả mong đợi: Lệnh chạy thành công. Nếu bạn dùng vector(1536), mảng phải có đủ 1536 số. Nếu dùng vector (không có chiều), PostgreSQL sẽ tự động phát hiện chiều từ dữ liệu đầu tiên.
Bước 3: Verify dữ liệu đã được lưu và kiểu dữ liệu vector hoạt động.
SELECT id, content, embedding FROM documents LIMIT 1;
Kết quả mong đợi: Dữ liệu được trả về, cột embedding hiển thị dưới dạng mảng vector.
Cấu hình index HNSW cho tối ưu hóa tìm kiếm vector
Truy vấn vector trên bảng lớn sẽ rất chậm nếu không có index. pgvector hỗ trợ 2 loại index: IVF (Inverted File Index) và HNSW (Hierarchical Navigable Small World). HNSW phù hợp hơn cho các tập dữ liệu vừa và nhỏ, cũng như khi cần độ chính xác cao hơn với tốc độ nhanh.
Bước 1: Tạo index HNSW trên cột embedding sử dụng khoảng cách Cosine.
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);
Kết quả mong đợi: Thông báo CREATE INDEX xuất hiện. Lưu ý: Cần chạy lệnh này sau khi đã có ít nhất một dòng dữ liệu để pgvector xác định chiều của vector.
Bước 2: Tạo index HNSW sử dụng khoảng cách L2 (Euclidean) nếu cần.
CREATE INDEX ON documents USING hnsw (embedding vector_l2_ops);
Kết quả mong đợi: Index thứ hai được tạo thành công.
Bước 3: Tối ưu hóa tham số M và ef_construction (Optional nhưng khuyến nghị).
Tham số M (số lượng kết nối) ảnh hưởng đến tốc độ index và độ chính xác. Giá trị mặc định là 16. ef_construction ảnh hưởng đến thời gian tạo index.
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64);
Kết quả mong đợi: Index được tạo với các tham số tùy chỉnh. (Lưu ý: Bạn cần drop index cũ trước nếu đã tạo index mặc định ở Bước 1).
Bước 4: Verify index đã được tạo và loại index.
\d documents
Kết quả mong đợi: Trong phần Indexes, bạn thấy dòng documents_embedding_idx (hoặc tên tùy chọn) với loại using hnsw.
Bước 5: Chạy truy vấn tìm kiếm tương tự để kiểm tra hiệu năng index.
SELECT id, content, embedding '[0.1, 0.2, 0.3]'::vector AS distance
FROM documents
ORDER BY distance
LIMIT 5;
Kết quả mong đợi: Truy vấn trả về kết quả được sắp xếp theo khoảng cách, và execution plan (chạy EXPLAIN ANALYZE trước lệnh trên) sẽ hiển thị Index Scan using hnsw thay vì Seq Scan.
Điều hướng series:
Mục lục: Series: Triển khai Database AI với PostgreSQL, pgvector và Ubuntu 24.04
« Phần 1: Chuẩn bị môi trường Ubuntu 24.04 và cài đặt PostgreSQL 16
Phần 3: Tạo pipeline xử lý dữ liệu và chuyển đổi sang vector »