Biến PostgreSQL thành Cơ sở Dữ liệu Vector với pgvector
Giới thiệu
Hiện nay, việc xây dựng ứng dụng RAG (Retrieval-Augmented Generation) đang trở thành chủ đề hot trong cộng đồng phát triển. Một yêu cầu quan trọng trong ứng dụng này là cần có một kho lưu trữ vector hoặc cơ sở dữ liệu để lưu trữ và truy vấn các embedding. Mặc dù có nhiều cơ sở dữ liệu vector chuyên dụng, chúng ta cũng có thể sử dụng PostgreSQL, một cơ sở dữ liệu quan hệ phổ biến, như một cơ sở dữ liệu vector nhờ vào tiện ích mở rộng pgvector.
Trong bài viết này, chúng ta sẽ khám phá cách tích hợp pgvector với một cơ sở dữ liệu PostgreSQL hiện có. Ngoài ra, chúng tôi cũng sẽ hướng dẫn bạn cách cài đặt từ đầu nếu bạn chưa có cơ sở dữ liệu nào.
Yêu cầu trước khi bắt đầu
Trước khi bắt đầu, hãy đảm bảo rằng bạn đã có một container đang chạy với PostgreSQL. Nếu bạn đã cài đặt PostgreSQL cục bộ, hãy chắc chắn rằng nó đang hoạt động trên hệ thống của bạn.
Cài đặt
Tìm kiếm Container PostgreSQL
Vì chúng ta đang sử dụng PostgreSQL trong một container, hãy xác định vị trí container bằng lệnh sau:
docker ps
Lệnh này sẽ liệt kê tất cả các container đang chạy trên hệ thống của bạn. Bạn cần kiểm tra cột Names để tìm tên của container Postgres. Nếu bạn chỉ muốn liệt kê các container đang chạy từ hình ảnh Postgres, hãy sử dụng lệnh sau:
docker ps --filter "ancestor=postgres"
Kết quả của lệnh trên sẽ giống như sau:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
36622542432f postgres:latest "docker-entrypoint.s…" 3 weeks ago Up 4 hours 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp postgres_container
Như bạn thấy, tên container của tôi là postgres_container.
Tiếp theo, hãy mở container bằng terminal với lệnh sau:
docker exec -it <tên-container> bash
# docker exec -it postgres_container bash
Cài đặt pgvector
Bây giờ, hình ảnh Docker dựa trên một hình ảnh Ubuntu (phân phối Linux dựa trên Debian). Vì chúng ta đang ở bên trong hình ảnh Docker, chúng ta có thể chạy các lệnh apt. Chúng ta cần cài đặt một số gói để đảm bảo rằng các công cụ cần thiết có sẵn để xây dựng tiện ích mở rộng, cũng như tất cả các gói cần thiết cho Postgres để sử dụng tiện ích mở rộng pgvector.
Bạn có thể cài đặt các gói cần thiết bằng lệnh sau:
apt-get update
apt-get install -y build-essential git postgresql-server-dev-all
Bây giờ, sau khi đã cài đặt các gói này, hãy tiếp tục với việc cài đặt tiện ích mở rộng pgvector.
Đầu tiên, hãy sao chép mã nguồn từ kho chính thức (tốt nhất là ở thư mục gốc).
git clone https://github.com/pgvector/pgvector.git
Tiếp theo, cài đặt tiện ích mở rộng từ mã nguồn này với lệnh sau:
cd pgvector
make
make install
Sau khi cài đặt thành công, hãy thoát và khởi động lại container bằng lệnh sau:
docker restart <tên-container>
# docker restart postgres_container
Bây giờ, tiện ích mở rộng pgvector đã được thêm thành công vào container, bước tiếp theo là kích hoạt nó cho cơ sở dữ liệu mà chúng ta sẽ tích hợp với pgvector.
Kích hoạt pgvector
Đầu tiên, hãy kết nối với phiên bản cơ sở dữ liệu PostgreSQL từ terminal của chúng ta bằng lệnh sau:
docker exec -it <tên-container> psql -h localhost -U <tên-user-db> -d <tên-db>
# docker exec -it postgres_container psql -h localhost -U dushmanta -d klansity
Sau khi kết nối thành công, hãy chạy lệnh sau để tạo tiện ích mở rộng trong cơ sở dữ liệu:
CREATE EXTENSION vector;
Lệnh này sẽ tạo tiện ích mở rộng vector trong cơ sở dữ liệu mà chúng ta đang đăng nhập.
Tiếp theo, hãy kiểm tra xem nó có xuất hiện trong danh sách tiện ích bằng lệnh sau:
\dx
Nếu tiện ích mở rộng vector đã được tạo thành công, bạn sẽ thấy nó trong kết quả. Trong trường hợp của tôi, kết quả như sau:
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+------------------------------------------------------
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
vector | 0.8.0 | public | vector data type and ivfflat and hnsw access methods
(2 rows)
Sau khi cài đặt thành công, hãy kiểm tra xem nó hoạt động không.
Kiểm tra
Ở đây, chúng ta sẽ tạo một bảng với các trường vector. Sau đó, chúng ta sẽ lưu trữ một số vector, truy xuất chúng và xem nó có hoạt động không.
Tạo Bảng
Chúng ta sẽ tạo một bảng có tên pgvector với một trường gọi là embedding, là một trường vector với kích thước 3, bằng lệnh sau:
CREATE TABLE pgvector (
id SERIAL PRIMARY KEY,
content TEXT,
embedding VECTOR(3)
);
Nếu bạn muốn tìm hiểu thêm về kích thước vector, tôi khuyên bạn nên kiểm tra tài liệu của Cloudflare.
Lưu ý: Đặt kích thước dựa trên mô hình mà bạn sẽ sử dụng để tạo ra embedding vector.
Nếu bạn có pgAdmin, Adminer hoặc phpMyAdmin đang chạy, hãy kiểm tra xem cơ sở dữ liệu đã được tạo hay chưa. Bạn cũng có thể xác thực điều này trong terminal bằng lệnh sau:
\d pgvector
Kết quả của tôi trông như thế này:
Table "public.pgvector"
Column | Type | Collation | Nullable | Default
-----------+-----------+-----------+----------+--------------------------------------
id | integer | | not null | nextval('pgvector_id_seq'::regclass)
content | text | | |
embedding | vector(3) | | |
Indexes:
"pgvector_pkey" PRIMARY KEY, btree (id)
Và trong Adminer, nó trông như thế này:
Chèn Vector Embedding
Bây giờ, hãy chèn một vector embedding vào trường embedding bằng lệnh sau:
INSERT INTO pgvector (content, embedding) VALUES
('first doc', '[1,2,3]'),
('second doc', '[4,5,6]');
Điều này sẽ tạo ra hai bản ghi. Hãy kiểm tra các bản ghi:
Lưu ý: Trong các trường hợp sử dụng thực tế, các embedding này sẽ được tạo ra bởi các mô hình và các giá trị số của vector sẽ rất khác nhau.
SELECT * FROM pgvector;
Dưới đây là kết quả:
id | content | embedding
----+------------+-----------
1 | first doc | [1,2,3]
2 | second doc | [4,5,6]
(2 rows)
Tìm kiếm Vector
Bây giờ mà chúng ta đã thêm hai bản ghi với dữ liệu vector, hãy thực hiện một tìm kiếm vector sử dụng vector [1,2,2] để tìm dữ liệu nào gần nhất với nó bằng lệnh sau:
SELECT id, content, embedding
FROM pgvector
ORDER BY embedding <-> '[1,2,2]' -- Ký hiệu <-> được sử dụng cho tìm kiếm vector
LIMIT 1;
Kết quả sẽ là:
id | content | embedding
----+-----------+-----------
1 | first doc | [1,2,3]
(1 row)
Như bạn thấy, nó đã truy xuất giá trị [1,2,3] là gần nhất.
Xóa Bảng
Vì chúng ta đã tạo bảng này chỉ để thử nghiệm, hãy xóa nó bằng lệnh sau:
DROP TABLE pgvector;
Như vậy, chúng ta đã cài đặt thành công tiện ích mở rộng pgvector và có thể sử dụng cơ sở dữ liệu PostgreSQL của chúng ta như một cơ sở dữ liệu vector cho các ứng dụng GenAI.
Thực hành tốt nhất
- Kiểm tra hiệu năng: Trước khi triển khai ứng dụng thực tế, hãy kiểm tra hiệu suất của các truy vấn vector trong điều kiện tải cao.
- Theo dõi tài nguyên: Giám sát việc sử dụng tài nguyên của container PostgreSQL để đảm bảo nó hoạt động ổn định.
Những cạm bẫy phổ biến
- Không xác định kích thước vector: Đảm bảo rằng kích thước vector được xác định chính xác theo mô hình sử dụng.
- Không kiểm tra các phiên bản: Hãy chắc chắn rằng bạn đang sử dụng phiên bản mới nhất của pgvector để tránh lỗi không tương thích.
Kết luận
Bài viết này nhằm cung cấp một hướng dẫn chi tiết về cách biến PostgreSQL thành cơ sở dữ liệu vector với pgvector. Nếu bạn có bất kỳ câu hỏi hay vấn đề nào, hãy liên hệ với chúng tôi. Hy vọng bài viết này sẽ hữu ích cho bạn trong việc tích hợp pgvector vào dự án của mình. Cùng nhau phát triển những ứng dụng thông minh hơn!
Câu hỏi thường gặp
- pgvector có tương thích với các phiên bản nào của PostgreSQL?
pgvector tương thích với PostgreSQL phiên bản 9.6 trở lên. - Có cần cài đặt thêm gì không?
Ngoài pgvector, bạn không cần cài đặt thêm gói nào khác cho các truy vấn cơ bản. - Tôi có thể sử dụng pgvector trong môi trường sản xuất không?
Có, pgvector đã được kiểm tra và sử dụng trong nhiều ứng dụng sản xuất.