Hướng Dẫn Sử Dụng Tiện Ích Mở Rộng pgvector PostgreSQL Trong ServBay
pgvector
là một tiện ích mở rộng mạnh mẽ của bên thứ ba dành cho cơ sở dữ liệu PostgreSQL, bổ sung kiểu dữ liệu vector và các phương thức lập chỉ mục vector hiệu quả như IVFFlat và HNSW. Điều này cho phép PostgreSQL hỗ trợ lưu trữ vector và tìm kiếm tương đồng một cách nguyên bản, lý tưởng cho các ứng dụng AI, hệ thống gợi ý, nhận diện hình ảnh, xử lý ngôn ngữ tự nhiên và các trường hợp sử dụng dữ liệu vector hóa độ lớn.
ServBay là môi trường phát triển Web tích hợp tại máy, đã cài đặt sẵn PostgreSQL và tiện ích mở rộng pgvector
, giúp đơn giản hóa quy trình kích hoạt và sử dụng cơ sở dữ liệu vector ngay trên máy tính cá nhân. Bài viết này sẽ hướng dẫn chi tiết cách tận dụng pgvector
trong ServBay.
pgvector là gì? Tại sao nó quan trọng?
Trong các ứng dụng hiện đại, dữ liệu không chỉ giới hạn ở văn bản hoặc số liệu có cấu trúc. Đặc biệt với sự phát triển của trí tuệ nhân tạo và học máy, dữ liệu thường được biểu diễn dưới dạng vector đa chiều, gọi là “embeddings”. Những vector này lưu giữ thông tin đặc trưng hoặc ý nghĩa ngữ nghĩa của dữ liệu, ví dụ như đặc điểm hình ảnh, ý nghĩa đoạn văn, hoặc sở thích người dùng.
Tiện ích mở rộng pgvector
giúp PostgreSQL lưu trữ trực tiếp các vector này, đồng thời thực hiện các truy vấn tìm kiếm tương đồng vector (gọi là “nearest neighbor search”) hiệu quả. Nhờ đó, bạn có thể sử dụng SQL quen thuộc để tìm dữ liệu gần giống với một vector mẫu, không cần tách riêng một hệ quản trị cơ sở dữ liệu vector khác, giúp giảm độ phức tạp hệ thống.
Yêu cầu trước khi bắt đầu
Trước khi sử dụng pgvector
, hãy đảm bảo bạn đã:
- Cài đặt và chạy ServBay trên macOS.
- Đã kích hoạt gói phần mềm PostgreSQL trong danh sách Packages của ServBay. Nếu chưa, mở giao diện ServBay và chuyển trạng thái PostgreSQL sang “Enabled”.
Kích hoạt tiện ích mở rộng pgvector trong PostgreSQL của ServBay
ServBay đã cài đặt sẵn tệp mở rộng pgvector
trong thư mục cài đặt PostgreSQL. Bạn không cần tải hoặc biên dịch thủ công, chỉ cần kích hoạt tiện ích này cho database mong muốn.
Các bước kích hoạt pgvector
trong database PostgreSQL của ServBay:
Kết nối đến database PostgreSQL: Bạn có thể dùng công cụ dòng lệnh
psql
để kết nối đến PostgreSQL của ServBay. Thông số mặc định: người dùng thường làpostgres
hoặcservbay
, port mặc định là5432
. Nếu cấu hình khác, hãy tra cứu tài liệu thiết lập cơ sở dữ liệu của ServBay.Mở Terminal và dùng lệnh sau để kết nối (thay tên người dùng và database cho phù hợp):
bashpsql -U servbay -d your_database_name -h localhost -p 5432
1-U servbay
: Chỉ định user làservbay
(hoặcpostgres
).-d your_database_name
: Chỉ định tên database. Nếu chưa có, bạn cần tạo trước (ví dụ:CREATE DATABASE servbay_demo_db;
).-h localhost
: Chỉ định host là máy nội bộ.-p 5432
: Port mặc định của PostgreSQL trên ServBay.
Tạo tiện ích mở rộng
vector
: Kết nối thành công, tại dấu nhắcpsql
hãy thực thi SQL sau để kích hoạtpgvector
:sqlCREATE EXTENSION vector;
1Nếu tiện ích đã tồn tại, lệnh sẽ thông báo đã tồn tại.
Kiểm tra cài đặt: Liệt kê các tiện ích đã cài bằng lệnh sau:
sql\dx
1Danh sách trả về sẽ hiển thị tiện ích
vector
cùng với thông tin phiên bản.List of installed extensions Name | Version | Schema | Description ----------+---------+------------+-------------------------------------------------------------- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language vector | 0.7.0 | public | vector data type and ivfflat and hnsw access methods (2 rows)
1
2
3
4
5
6(Lưu ý: Phiên bản có thể thay đổi theo phiên bản pgvector tích hợp trong ServBay)
Cấu hình và sử dụng pgvector
Sau khi đã kích hoạt tiện ích mở rộng, bạn có thể bắt đầu tạo và thao tác với dữ liệu vector.
Tạo bảng chứa dữ liệu vector
Đầu tiên, hãy tạo một bảng lưu trữ vector. pgvector
cung cấp kiểu dữ liệu mới VECTOR(dimensions)
, trong đó dimensions
là số chiều của vector.
Ví dụ: Tạo bảng embeddings
lưu vector 3 chiều:
sql
CREATE TABLE embeddings (
id SERIAL PRIMARY KEY,
-- Khai báo cột vector 3 chiều
vector VECTOR(3)
);
1
2
3
4
5
2
3
4
5
Sau đó, chèn một số dữ liệu thử nghiệm:
sql
INSERT INTO embeddings (vector) VALUES
('[0.1, 0.2, 0.3]'),
('[0.4, 0.5, 0.6]'),
('[0.7, 0.8, 0.9]'),
('[0.15, 0.25, 0.35]'),
('[0.6, 0.5, 0.4]'); -- Thêm dữ liệu để minh họa cho các truy vấn sau
1
2
3
4
5
6
2
3
4
5
6
Lưu ý: Giá trị vector phải nằm trong dấu ngoặc vuông []
, các thành phần cách nhau bằng dấu phẩy.
Lập chỉ mục vector để tăng tốc độ truy vấn
Với các bảng chứa nhiều vector, lập chỉ mục rất cần thiết để tăng tốc tìm kiếm tương đồng vector. pgvector
hỗ trợ hai loại chỉ mục chính: IVFFlat và HNSW. Việc chọn loại nào phụ thuộc vào yêu cầu thực tế (tốc độ truy vấn, thời gian tạo chỉ mục, bộ nhớ, độ chính xác...).
- IVFFlat (Inverted File Index với Flat compression): Phù hợp cho bộ dữ liệu lớn, tốc độ tạo chỉ mục nhanh, độ chính xác có thể thấp hơn HNSW.
- HNSW (Hierarchical Navigable Small World): Thường cho tốc độ truy vấn nhanh hơn và độ chính xác cao hơn, nhưng vào bộ nhớ lớn, thời gian tạo chỉ mục lâu hơn.
Ví dụ tạo chỉ mục IVFFlat và HNSW cho cột vector
của bảng embeddings
:
Tạo chỉ mục IVFFlat:
sql-- Trước khi tạo IVFFlat, nên chạy ANALYZE để cập nhật thống kê ANALYZE embeddings; -- Tạo chỉ mục IVFFlat -- WITH (lists = 100): Chỉ định số danh sách đảo. Giá trị này cần điều chỉnh dựa theo kích thước tập dữ liệu. -- lists càng lớn, chỉ mục tạo càng lâu, truy vấn có thể chậm hơn nhưng độ chính xác cao hơn. -- Đề xuất: lists = sqrt(số dòng). CREATE INDEX idx_ivfflat_vector ON embeddings USING ivfflat (vector) WITH (lists = 100);
1
2
3
4
5
6
7
8Tạo chỉ mục HNSW:
sql-- Tạo chỉ mục HNSW -- WITH (m = 16, ef_construction = 200): Các tham số của HNSW. -- m: Số kết nối tối đa của mỗi node. -- ef_construction: Phạm vi tìm kiếm khi tạo chỉ mục. -- Các tham số này cần tinh chỉnh theo dữ liệu & yêu cầu hiệu năng. CREATE INDEX idx_hnsw_vector ON embeddings USING hnsw (vector) WITH (m = 16, ef_construction = 200);
1
2
3
4
5
6Lưu ý: Các tham số chỉ mục (
lists
,m
,ef_construction
) ảnh hưởng lớn tới hiệu năng và độ chính xác. Hãy hiểu rõ dữ liệu của bạn và kiểm thử để chọn giá trị phù hợp. Xem thêm tài liệu pgvector chính thức để biết chi tiết và khuyến nghị tối ưu hóa.
Truy vấn vector bằng pgvector
pgvector
cung cấp nhiều toán tử xác định khoảng cách giữa các vector, phục vụ truy vấn tìm kiếm tương đồng. Các toán tử phổ biến gồm:
<->
: Khoảng cách L2 (khoảng cách Euclid), đo khoảng cách đường thẳng giữa hai vector.<#>
: Tích trong (Inner Product), liên quan đến độ tương đồng cosine, dùng cho đánh giá hướng tương đồng.<=>
: Khoảng cách Cosine (1 - độ tương đồng cosine
), đánh giá sự giống nhau về hướng, không bị ảnh hưởng bởi độ dài vector.
Các ví dụ truy vấn thường gặp như sau:
Truy vấn lân cận nhất (Nearest Neighbor Search)
Tìm các vector gần nhất với một vector cho trước (khoảng cách nhỏ nhất). Dùng ORDER BY
kết hợp toán tử khoảng cách, và LIMIT
để giới hạn kết quả.
- Tìm 5 vector L2 gần nhất với
[0.2, 0.3, 0.4]
:sqlSELECT id, vector, -- Tính khoảng cách L2 đến vector truy vấn vector <-> '[0.2, 0.3, 0.4]' AS distance FROM embeddings ORDER BY distance -- Sắp xếp tăng dần theo khoảng cách (gần nhất lên trước) LIMIT 5;
1
2
3
4
5
6
7
8
9
10
Truy vấn tương đồng vector (Similarity Search)
Tương tự như nearest neighbor search, nhưng ưu tiên hiển thị điểm số tương đồng.
- Tìm 5 vector có khoảng cách Cosine gần nhất với
[0.2, 0.3, 0.4]
và hiển thị điểm số:sqlSELECT id, vector, -- Tính khoảng cách Cosine vector <=> '[0.2, 0.3, 0.4]' AS cosine_distance FROM embeddings ORDER BY cosine_distance -- Sắp xếp tăng dần (gần nhất lên đầu) LIMIT 5;
1
2
3
4
5
6
7
8
9
10
Trực quan hóa dữ liệu vector (tuỳ chọn)
Trực quan hóa vector đa chiều giúp bạn hiểu rõ phân bố, nhóm dữ liệu. Với vector 2D hoặc 3D, dùng đồ thị điểm trực tiếp; với vector nhiều chiều hơn, cần giảm số chiều bằng kỹ thuật PCA hoặc t-SNE trước khi vẽ.
Ví dụ sau minh họa cách dùng Python và thư viện Matplotlib để vẽ các vector 3 chiều.
Chuẩn bị môi trường Python: Bạn cần thiết lập môi trường Python bên ngoài hoặc nội bộ ServBay. Nếu dùng Python của ServBay, hãy kích hoạt nó. Cài đặt thư viện kết nối PostgreSQL:
psycopg2
và vẽ biểu đồ:matplotlib
:bash# Nếu dùng Python tự động hoặc hệ thống pip install psycopg2 matplotlib # Nếu dùng Python ServBay, hãy trỏ pip về thư mục bin của ServBay # /Applications/ServBay/软件包/python/bin/pip install psycopg2 matplotlib
1
2
3
4
5Đổi đường dẫn pip tùy theo môi trường Python bạn dùng.
Tạo file Python: Tạo file Python (ví dụ:
visualize_vectors.py
), copy đoạn mã bên dưới. Điều chỉnh tham số kết nối PostgreSQL cho đúng với ServBay (dbname
,user
,password
,host
,port
).pythonimport psycopg2 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # Import module vẽ scatter 3D # Tham số kết nối database - đổi giá trị theo ServBay của bạn db_params = { "dbname": "your_database_name", # Thay bằng tên database "user": "servbay", # Thay bằng user ServBay (thường là servbay hoặc postgres) "password": "", # Thay bằng mật khẩu database (thường để trống kết nối nội bộ) "host": "localhost", # PostgreSQL ServBay thường trên localhost "port": "5432" # Port mặc định } conn = None cur = None try: # Kết nối đến PostgreSQL conn = psycopg2.connect(**db_params) cur = conn.cursor() # Lấy dữ liệu vector # Lưu ý: psycopg2 thường đọc kiểu vector thành chuỗi dạng '[x, y, z]'. # Cần tự parse hoặc dựa vào phiên bản mới của pgvector + psycopg2 hỗ trợ tự động. # Ví dụ này giả sử nhận chuỗi trả về, sẽ parse đơn giản. cur.execute("SELECT vector FROM embeddings") vectors_raw = cur.fetchall() # Parse chuỗi vector sang danh sách số vectors = [] for row in vectors_raw: # Loại bỏ ngoặc vuông, tách theo dấu phẩy, chuyển sang float vec_str = row[0].strip('[]') coords = [float(c) for c in vec_str.split(',')] vectors.append(coords) if not vectors: print("Không tìm thấy dữ liệu vector.") exit() # Bóc tách tọa độ # Đảm bảo mọi vector là 3 chiều if any(len(v) != 3 for v in vectors): print("Cảnh báo: vector không đồng nhất hoặc không phải 3 chiều, không thể vẽ 3D.") exit() x = [v[0] for v in vectors] y = [v[1] for v in vectors] z = [v[2] for v in vectors] # Vẽ scatter 3D fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x, y, z) ax.set_xlabel('Dimension 1') ax.set_ylabel('Dimension 2') ax.set_zlabel('Dimension 3') ax.set_title('Trực quan hóa vector 3D') plt.show() except psycopg2.Error as e: print(f"Lỗi kết nối hoặc truy vấn database: {e}") except Exception as e: print(f"Phát sinh lỗi: {e}") finally: # Đóng kết nối if cur: cur.close() if conn: conn.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72Chạy script: Trên terminal, chạy file Python vừa tạo:
bashpython visualize_vectors.py
1Script sẽ kết nối tới PostgreSQL, lấy dữ liệu vector và vẽ đồ thị scatter 3D bằng Matplotlib.
Câu hỏi thường gặp (FAQ)
Hỏi: Dùng lệnh
\dx
không thấy tiện íchvector
thì sao? Đáp: Hãy chắc chắn bạn đã chạy lệnhCREATE EXTENSION vector;
và không gặp lỗi. Nếu vẫn không có, kiểm tra lại gói PostgreSQL của ServBay đã bật và cài đặt đúng chưa. Tập tin mở rộngpgvector
phải nằm trong thư mụcshare/extension
của PostgreSQL. Nếu bị thiếu, hãy thử cài lại hoặc cập nhật gói PostgreSQL của ServBay.Hỏi: Lỗi xác thực khi kết nối database? Đáp: Kiểm tra lại user, mật khẩu, host, port bạn cấu hình trong lệnh psql hoặc script Python so với thiết lập ServBay. Thường user mặc định là
servbay
hoặcpostgres
, mật khẩu đôi khi trống với kết nối cục bộ.Hỏi: Nên chọn chỉ mục tham số
lists
,m
,ef_construction
thế nào? Đáp: Các tham số này ảnh hưởng lớn đến hiệu năng và độ chính xác, không có giá trị “chuẩn” cho mọi trường hợp. Thử nghiệm dựa trên số lượng, kích thước, yêu cầu latency và độ chính xác của bạn. Tham khảo tài liệu pgvector chính thức để biết thông tin chi tiết và khuyến nghị.
Tổng kết
pgvector
đưa năng lực cơ sở dữ liệu vector mạnh mẽ vào hệ quản trị PostgreSQL ổn định, giúp lập trình viên phát triển các ứng dụng AI và xử lý vector ngay trên máy cá nhân. ServBay tích hợp sẵn tiện ích mở rộng pgvector giúp dựng môi trường lập trình cực kỳ đơn giản.
Thực hiện theo hướng dẫn này, bạn sẽ dễ dàng kích hoạt pgvector trong PostgreSQL của ServBay, tạo bảng lưu trữ vector, lập chỉ mục nhanh để tăng tốc truy vấn và thực hiện tìm kiếm đồng dạng vector ngay trên cơ sở dữ liệu. Kết hợp với công cụ lập trình khác có sẵn trong ServBay, bạn sẽ tăng hiệu suất phát triển, thử nghiệm các ứng dụng Web hiện đại và dự án dữ liệu lớn.