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

Hướng dẫn lập trình để triển khai hệ thống tìm kiếm vector ngữ nghĩa, lai, thưa và lượng tử hóa được hỗ trợ bởi pgvector

MarkTechPost· Sana Hassan· 28/5/2026general

Trong hướng dẫn này, chúng tôi xây dựng một môi trường thử nghiệm pgvector hoàn chỉnh trong Google Colab và khám phá cách PostgreSQL có thể hoạt động như một cơ sở dữ liệu vector mạnh mẽ cho các ứng dụng AI hiện đại. Chúng tôi bắt đầu bằng cách cài đặt PostgreSQL, biên dịch tiện ích mở rộng pgvector, kết nối thông qua Psycopg và đăng ký các kiểu vector để tích hợp Python mượt mà. Sau đó, chúng tôi tạo các embedding (nhúng) bằng SentenceTransformers, lưu trữ chúng trong PostgreSQL, xây dựng các chỉ mục HNSW và thực hiện tìm kiếm ngữ nghĩa, tìm kiếm có bộ lọc, so sánh các chỉ số khoảng cách, lưu trữ độ chính xác một nửa, lượng tử hóa nhị phân, tìm kiếm vector thưa, truy xuất lai và tổng hợp vector.

Trong hướng dẫn này, chúng ta sẽ xây dựng một môi trường thử nghiệm pgvector hoàn chỉnh trong Google Colab và khám phá cách PostgreSQL có thể hoạt động như một cơ sở dữ liệu vector mạnh mẽ cho các ứng dụng AI hiện đại. Chúng ta bắt đầu bằng cách cài đặt PostgreSQL, biên dịch tiện ích mở rộng pgvector, kết nối thông qua Psycopg và đăng ký các kiểu vector để tích hợp Python mượt mà. Sau đó, chúng ta tạo các embedding với SentenceTransformers, lưu trữ chúng trong PostgreSQL, xây dựng các chỉ mục HNSW và chạy tìm kiếm ngữ nghĩa, tìm kiếm có lọc, so sánh độ đo khoảng cách, lưu trữ độ chính xác một nửa, lượng tử hóa nhị phân, tìm kiếm vector thưa, truy xuất lai và tổng hợp vector. Thông qua quy trình làm việc này, chúng ta tìm hiểu cách pgvector hỗ trợ các hệ thống tạo sinh tăng cường truy xuất, đề xuất, tìm kiếm tương tự và tìm kiếm lai thực tế chỉ bằng các công cụ mã nguồn mở. ``` import os import subprocess import sys import time def sh(cmd: str, check: bool = True): """Chạy một lệnh shell, truyền một nhật ký nhỏ gọn.""" print(f" $ {cmd}") return subprocess.run(cmd, shell=True, check=check, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) print("[0/10] Đang cài đặt PostgreSQL + xây dựng pgvector (≈1–2 phút)...") sh("apt-get -qq update") sh("apt-get -qq install -y postgresql postgresql-contrib " "postgresql-server-dev-all build-essential git") if not os.path.exists("/tmp/pgvector"): sh("git clone --depth 1 https://github.com/pgvector/pgvector.git /tmp/pgvector") sh("cd /tmp/pgvector && make && make install") sh("service postgresql start") time.sleep(3) sh("""sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'postgres';" """) print("[0/10] Đang cài đặt các gói Python...") sh(f"{sys.executable} -m pip install -q pgvector psycopg[binary] " f"sentence-transformers numpy") ``` Chúng ta thiết lập môi trường PostgreSQL và pgvector hoàn chỉnh. Chúng ta cài đặt các gói hệ thống cần thiết, sao chép và xây dựng pgvector từ mã nguồn, khởi động dịch vụ PostgreSQL và cấu hình mật khẩu cơ sở dữ liệu. Chúng ta cũng cài đặt các phụ thuộc Python cần thiết để kết nối với PostgreSQL và làm việc với các embedding vector. import numpy as np import psycopg from pgvector import HalfVector, SparseVector from pgvector.psycopg import register_vector from sentence_transformers import SentenceTransformer print("\n[1/10] Đang kết nối và kích hoạt tiện ích mở rộng 'vector'...") conn = psycopg.connect( "host=127.0.0.1 port=5432 dbname=postgres user=postgres password=postgres", autocommit=True, ) conn.execute("CREATE EXTENSION IF NOT EXISTS vector") register_vector(conn) ver = conn.execute("SELECT extversion FROM pg_extension WHERE extname='vector'").fetchone()[0] print(f" Phiên bản pgvector: {ver}") print("\n[2/10] Đang tải mô hình nhúng + mã hóa ngữ liệu...") model = SentenceTransformer("all-MiniLM-L6-v2") DIM = model.get_sentence_embedding_dimension() corpus = [ ("Bạch tuộc có ba trái tim và máu màu xanh lam.", "động vật"), ("Transformers đã cách mạng hóa xử lý ngôn ngữ tự nhiên.","công nghệ"), ("Máy tính lượng tử khai thác sự chồng chập và vướng víu.","công nghệ"), ("GPU tăng tốc học sâu bằng cách song song hóa phép toán ma trận.","công nghệ"), ("Bánh mì Sourdough dựa vào men hoang dã và lactobacilli.", "thực phẩm"), ("Sô cô la đen chứa chất chống oxy hóa flavonoid.", "thực phẩm"), ("Trọng lực của lỗ đen mạnh đến mức ánh sáng không thể thoát ra.","không gian") ] contents = [c for c, _ in corpus] categories = [k for _, k in corpus] embeddings = model.encode(contents, normalize_embeddings=True) conn.execute("DROP TABLE IF EXISTS documents") conn.execute(f""" CREATE TABLE documents ( id bigserial PRIMARY KEY, content text, category text, embedding vector({DIM}) ) """) with conn.cursor() as cur: cur.executemany( "INSERT INTO documents (content, category, embedding) VALUES (%s, %s, %s)", list(zip(contents, categories, [np.asarray(e) for e in embeddings])), ) print(f" Đã chèn {len(corpus)} tài liệu với nhúng {DIM}-d.") Chúng tôi kết nối với PostgreSQL, kích hoạt tiện ích mở rộng pgvector và đăng ký hỗ trợ vector với Psycopg. Chúng tôi tải mô hình SentenceTransformers, định nghĩa một ngữ liệu văn bản nhỏ, tạo các nhúng được chuẩn hóa và tạo một bảng PostgreSQL để lưu trữ tài liệu. Sau đó, chúng tôi chèn từng tài liệu với danh mục và biểu diễn vector của nó để có thể thực hiện tìm kiếm ngữ nghĩa sau này. [3/10] Xây dựng chỉ mục HNSW và chạy tìm kiếm ngữ nghĩa... conn.execute( "CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops) " "WITH (m = 16, ef_construction = 64)" ) conn.execute("SET hnsw.ef_search = 100") def semantic_search(query: str, k: int = 4): q = np.asarray(model.encode(query, normalize_embeddings=True)) return conn.execute( "SELECT content, category, embedding <=> %s AS distance " "FROM documents ORDER BY distance LIMIT %s", (q, k), ).fetchall() for content, cat, dist in semantic_search("animals that are unusually quick"): print(f" {dist:.3f} [{cat:<10}] {content}") [4/10] Tìm kiếm có lọc (chỉ danh mục = 'space')... q = np.asarray(model.encode("objects with extreme gravity", normalize_embeddings=True)) rows = conn.execute( "SELECT content, embedding <=> %s AS distance " "FROM documents WHERE category = %s ORDER BY distance LIMIT 3", (q, "space"), ).fetchall() for content, dist in rows: print(f" {dist:.3f} {content}") [5/10] Cùng một truy vấn với các độ đo khoảng cách khác nhau (kết quả hàng đầu mỗi loại)... q = np.asarray(model.encode("brewing a hot caffeinated drink", normalize_embeddings=True)) for op, label in [("<->", "L2"), ("<=>", "cosine"), ("<#>", "neg-inner"), ("<+>", "L1")]: content, score = conn.execute( f"SELECT content, embedding {op} %s AS s FROM documents ORDER BY s LIMIT 1", (q,) ).fetchone() print(f" {label:<10} {score:+.3f} {content}") Chúng tôi xây dựng chỉ mục HNSW trên cột embedding để cho phép tìm kiếm vector nhanh hơn, hiệu quả hơn. Chúng tôi định nghĩa một hàm tìm kiếm ngữ nghĩa chuyển đổi truy vấn thành embedding và truy xuất các tài liệu tương tự nhất bằng cách sử dụng độ tương đồng cosine.

Nguồn tin: MarkTechPost — Tác giả: Sana Hassan. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.