0
0
Lập trình
Admin Team
Admin Teamtechmely

Biến PostgreSQL thành Cơ sở Dữ liệu Vector với pgvector

Đăng vào 7 tháng trước

• 8 phút đọc

Chủ đề:

KungFuTech

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:

Copy
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:

Copy
docker ps --filter "ancestor=postgres"

Kết quả của lệnh trên sẽ giống như sau:

Copy
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:

Copy
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:

Copy
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).

Copy
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:

Copy
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:

Copy
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:

Copy
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:

Copy
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:

Copy
\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:

Copy
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:

Copy
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:

Copy
\d pgvector

Kết quả của tôi trông như thế này:

Copy
                               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:

Copy
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.

Copy
SELECT * FROM pgvector;

Dưới đây là kết quả:

Copy
 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:

Copy
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à:

Copy
 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:

Copy
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

  1. 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.
  2. 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.
  3. 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.

Tài nguyên tham khảo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào