Bỏ qua tới nội dung chính
Quay lại tin tức

Xây dựng tính năng tìm kiếm tương tự vector trong PostgreSQL với pgvector

Machine Learning Mastery· Bala Priya C· 18/5/2026general

Tìm kiếm hoạt động hiệu quả khi người dùng biết chính xác những gì họ đang tìm kiếm, nhưng sẽ không hiệu quả khi ý định được mô tả bằng ngôn ngữ tự nhiên.

Xây dựng tính năng tìm kiếm tương tự vector trong PostgreSQL với pgvector Bởi Bala Priya C vào ngày 18/5/2026 trong Mô hình ngôn ngữ 0 Chia sẻ Đăng Chia sẻ Trong bài viết này, bạn sẽ tìm hiểu cách triển khai tính năng tìm kiếm tương tự vector trong PostgreSQL bằng cách sử dụng tiện ích mở rộng pgvector, cho phép bạn tìm kiếm các kết quả tương tự về mặt ngữ nghĩa dựa trên ý nghĩa thay vì khớp từ khóa. Các chủ đề chúng ta sẽ đề cập bao gồm: Vector embedding là gì và cách chúng cho phép tìm kiếm tương tự ngữ nghĩa. Cách cài đặt và cấu hình pgvector, lưu trữ các embedding trong PostgreSQL và truy vấn chúng bằng các toán tử khoảng cách SQL. Cách chọn đúng chỉ số khoảng cách và loại chỉ mục cho khối lượng công việc của bạn, và cách kết hợp tìm kiếm tương tự với các bộ lọc SQL tiêu chuẩn. Xây dựng tính năng tìm kiếm tương tự vector trong PostgreSQL với pgvector Giới thiệu Tìm kiếm hoạt động tốt khi người dùng biết chính xác những gì họ đang tìm kiếm, nhưng nó sẽ không hiệu quả khi ý định được mô tả bằng ngôn ngữ tự nhiên. Một người dùng tìm kiếm "thứ gì đó ấm áp và thoáng khí để đi bộ đường dài ở độ cao lớn" sẽ nhận được kết quả kém từ một chỉ mục từ khóa, vì các từ trong truy vấn đó hiếm khi khớp với các từ trong dữ liệu của bạn. Đây là lúc tìm kiếm tương tự trở nên hữu ích. Thay vì khớp từ khóa, nó tìm kiếm kết quả dựa trên ý nghĩa — kết nối ý định của người dùng với các bản ghi liên quan ngay cả khi cách diễn đạt hoàn toàn khác. Bài viết này chỉ ra cách triển khai tìm kiếm tương tự trong PostgreSQL bằng cách sử dụng pgvector. Bạn sẽ học cách thiết lập tiện ích mở rộng, lưu trữ các vector embedding trong cơ sở dữ liệu của mình và chạy các truy vấn tương tự bằng SQL thuần túy mà không cần một cơ sở dữ liệu vector riêng biệt. Vector Embedding là gì? Vector embedding là một danh sách các số dấu phẩy động đại diện cho ý nghĩa của một phần dữ liệu, không phải các ký tự hoặc từ khóa của nó. Các số này được tạo ra bởi một mô hình học máy được huấn luyện để đặt các nội dung tương tự về mặt ngữ nghĩa gần nhau trong một không gian số chiều cao. Hai câu nói về cùng một khái niệm sẽ tạo ra các embedding gần nhau về mặt số học, ngay cả khi chúng không chia sẻ từ nào. Hãy xem xét hai cụm từ này: "Giày chạy bộ đường mòn nhẹ cho việc đi bộ đường dài" "Giày chạy bộ được chế tạo cho sức bền ở vùng hẻo lánh" Một mô hình embedding sẽ đặt các vector của chúng gần nhau trong không gian đó. Sự gần gũi đó là điều làm cho tìm kiếm tương tự hoạt động: bạn nhúng truy vấn của người dùng, tìm các vector được lưu trữ gần nhất với nó và trả về các hàng đó. Tạo Embedding Kích thước vector phụ thuộc vào mô hình bạn sử dụng. Bạn có thể chọn từ một số tùy chọn; những tùy chọn phổ biến nhất để thử là: OpenAI text-embedding-3-small / text-embedding-3-large: 1536 và 3072 chiều tương ứng. Cohere Embed v4: Đa ngôn ngữ và đa phương thức, bao gồm văn bản và hình ảnh trong một không gian vector chung. EmbeddingGemma: Một mô hình mở 308M tham số từ Google được xây dựng trên Gemma 3, tạo ra các vector 768 chiều với hỗ trợ cắt tỉa Matryoshka, bao phủ hơn 100 ngôn ngữ và suy luận hoàn toàn trên thiết bị. BAAI/BGE-M3: Mã nguồn mở và có thể tự lưu trữ, hỗ trợ hơn 1.000 ngôn ngữ và chuỗi lên đến 8.192 token. Cũng có sẵn trên Hugging Face. Sentence Transformers: Các mô hình mã nguồn mở nhẹ chạy trên CPU, phù hợp cho phát triển cục bộ nơi độ chính xác truy xuất ít quan trọng hơn tốc độ. Bảng xếp hạng MTEB là một tài liệu tham khảo tiêu chuẩn để so sánh các mô hình nhúng (embedding model). Một quy tắc áp dụng bất kể lựa chọn của bạn: kích thước được cấu hình trong cột PostgreSQL phải khớp chính xác với kích thước mà mô hình tạo ra. pgvector là gì? pgvector là một tiện ích mở rộng mã nguồn mở của PostgreSQL, bổ sung tính năng tìm kiếm vector gốc vào cơ sở dữ liệu hiện có của bạn. Thay vì chuyển các nhúng (embedding) của bạn sang một kho lưu trữ vector chuyên dụng, pgvector giữ chúng cùng với dữ liệu quan hệ của bạn, bảo toàn các đảm bảo giao dịch của PostgreSQL, ngữ nghĩa JOIN, khôi phục tại một thời điểm (point-in-time recovery) và ngôn ngữ truy vấn SQL đầy đủ. Tiện ích mở rộng này bổ sung kiểu dữ liệu vector để lưu trữ các nhúng, các toán tử khoảng cách SQL để sắp xếp kết quả truy vấn theo độ tương tự và hai loại chỉ mục — HNSW và IVFFlat — để tăng tốc tra cứu láng giềng gần nhất (nearest-neighbor lookups) ở quy mô lớn. Nó cũng hỗ trợ các kiểu vector bán chính xác (half-precision), nhị phân (binary) và thưa (sparse). Cài đặt pgvector pgvector hỗ trợ PostgreSQL 13 trở lên. Hướng dẫn cài đặt trong kho lưu trữ trình bày chi tiết mọi nền tảng; các đường dẫn phổ biến nhất được hiển thị dưới đây. Trên Linux Trên Debian và Ubuntu, gói APT là cách nhanh nhất. Thay thế 18 bằng phiên bản chính của PostgreSQL của bạn: sudo apt install postgresql-18-pgvector Để biên dịch từ mã nguồn thay thế, hoạt động trên bất kỳ bản phân phối Linux nào, hãy sử dụng: cd /tmp git clone --branch v0.8.2 https://github.com/pgvector/pgvector.git cd pgvector make make install Trên macOS Nếu bạn đang sử dụng máy Mac, Homebrew là lựa chọn đơn giản nhất: brew install pgvector Các bước biên dịch mã nguồn ở trên hoạt động tương tự trên macOS với Xcode Command Line Tools đã được cài đặt. Đối với Windows, Docker và conda-forge, hãy xem các ghi chú cài đặt trong kho lưu trữ. Sau khi cài đặt, hãy bật tiện ích mở rộng trong cơ sở dữ liệu mục tiêu của bạn. Bạn chỉ cần thực hiện việc này một lần cho mỗi cơ sở dữ liệu: CREATE EXTENSION IF NOT EXISTS vector; Tạo bảng với cột Vector Chúng ta sẽ xây dựng một danh mục sản phẩm cho một cửa hàng đồ dùng ngoài trời. Mỗi sản phẩm có một mô tả văn bản, và chúng ta sẽ lưu trữ một nhúng của mô tả đó để người dùng có thể tìm kiếm theo ý nghĩa. CREATE TABLE products ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, category TEXT, description TEXT, price NUMERIC(8,2), embedding vector(1536) );

Nguồn tin: Machine Learning Mastery — Tác giả: Bala Priya C. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.