Cấu hình VectorStore từ LlamaIndex để trỏ tới PostgreSQL
Bước đầu tiên là thiết lập đối tượng VectorStore trong LlamaIndex để giao tiếp với cơ sở dữ liệu PostgreSQL đã được mở rộng bởi pgvector. Chúng ta sẽ sử dụng connector PGVector có sẵn trong thư viện llama-index-vector-stores-postgres.
Để kết nối, bạn cần xác định đúng database, user, password, host và port của PostgreSQL. Đảm bảo PostgreSQL đang chạy và extension pgvector đã được kích hoạt trong database mục tiêu.
Thư mục /home/ubuntu/llama-project/src/config.py sẽ chứa cấu hình kết nối này. Chúng ta sẽ tạo file Python để khởi tạo vector store.
cat > /home/ubuntu/llama-project/src/config.py
Kết quả mong đợi: File config.py được tạo thành công. Khi chạy file này, terminal sẽ in thông báo "VectorStore đã được khởi tạo thành công" và tên bảng được sử dụng, xác nhận kết nối Python tới PostgreSQL đã hoạt động.
Chạy lệnh sau để kiểm tra tính khả thi của cấu hình:
cd /home/ubuntu/llama-project/src && python3 config.py
Verify: Không có lỗi ConnectionError hoặc OperationalError. Nếu thấy lỗi, kiểm tra lại pg_hba.conf trong PostgreSQL hoặc thông tin password trong file config.
Tạo index vector và chèn dữ liệu vào pgvector
Khởi tạo Index và thêm dữ liệu Embedding
Sau khi có VectorStore, bước tiếp theo là tạo Index (cụ thể là VectorStoreIndex) để quản lý các node dữ liệu. LlamaIndex sẽ tự động xử lý việc chèn các vector embedding vào PostgreSQL thông qua VectorStore đã cấu hình.
Chúng ta sẽ viết script build_index.py để đọc dữ liệu từ file text (đã chuẩn bị ở Phần 5), tạo embedding, và lưu vào PostgreSQL. Script này sẽ sử dụng PGVectorStore làm backend lưu trữ.
Thư mục: /home/ubuntu/llama-project/src/build_index.py
cat > /home/ubuntu/llama-project/src/build_index.py
Kết quả mong đợi: Script sẽ tải model embedding, đọc file dữ liệu, tính toán vector và chèn vào bảng llama_documents trong PostgreSQL. Không có lỗi runtime.
Chạy lệnh sau để thực thi việc chèn dữ liệu:
cd /home/ubuntu/llama-project/src && python3 build_index.py
Verify: Quan sát output console. Nếu thấy dòng "Hoàn tất! Dữ liệu đã được lưu vào PostgreSQL" và số lượng documents khớp với file trong thư mục data, bước này thành công.
Kiểm tra dữ liệu đã lưu trong PostgreSQL bằng SQL trực tiếp
Truy vấn trực tiếp bảng Vector
Để đảm bảo chắc chắn rằng LlamaIndex đã chèn dữ liệu vào đúng bảng PostgreSQL và dữ liệu vector tồn tại dưới dạng vector (kiểu dữ liệu của pgvector), chúng ta cần truy vấn trực tiếp qua psql.
Bảng được tạo bởi PGVectorStore với tham số table_name="llama_documents" sẽ chứa các cột: id, doc_id, embedding (kiểu vector), metadata, và text.
Chúng ta sẽ đăng nhập vào PostgreSQL và chạy lệnh SQL để xem cấu trúc bảng và nội dung vector.
sudo -u postgres psql -d ai_embeddings_db -c "\d llama_documents"
Kết quả mong đợi: Hiển thị cấu trúc bảng (Table "public.llama_documents") với các cột. Quan trọng nhất là cột embedding có kiểu dữ liệu vector (thường hiển thị là vector(1024) hoặc tương tự tùy model).
Tiếp theo, kiểm tra xem đã có dữ liệu nào chưa bằng cách đếm số lượng dòng và hiển thị một bản ghi mẫu:
sudo -u postgres psql -d ai_embeddings_db -c "SELECT count(*) as total_rows FROM llama_documents;"
Kết quả mong đợi: Giá trị total_rows phải lớn hơn 0, khớp với số lượng documents được xử lý trong bước trước.
Cuối cùng, kiểm tra nội dung vector thực tế. Do vector là mảng số thực dài, ta chỉ lấy 5 phần tử đầu tiên để kiểm tra định dạng:
sudo -u postgres psql -d ai_embeddings_db -c "SELECT id, doc_id, (embedding)[1:5] as vector_sample, metadata FROM llama_documents LIMIT 1;"
Kết quả mong đợi:
- Cột vector_sample hiển thị mảng các số thập phân (float), ví dụ: {0.123, -0.456, 0.789, ...}.
- Cột metadata chứa JSON với thông tin file hoặc chunk.
- Nếu thấy dữ liệu này, chứng tỏ LlamaIndex đã thành công trong việc chèn embedding vào pgvector.
Để xác nhận index vector đã được tạo tự động (bằng hnsw hoặc ivfflat), kiểm tra danh sách index trong bảng:
sudo -u postgres psql -d ai_embeddings_db -c "\di llama_documents*"
Kết quả mong đợi: Có ít nhất một index với phương pháp hnsw hoặc ivfflat trên cột embedding sử dụng operator vector_cosine_ops hoặc tương tự. Điều này xác nhận tìm kiếm ngữ nghĩa (semantic search) sẽ hoạt động hiệu quả.
Điều hướng series:
Mục lục: Series: Triển khai Database AI với pgvector, LlamaIndex và Ubuntu 24.04
« Phần 5: Chuẩn bị dữ liệu và tạo Embeddings với LlamaIndex
Phần 7: Xây dựng ứng dụng tìm kiếm ngữ nghĩa (Semantic Search) »