Không có công cụ "tốt nhất", chỉ có công cụ phù hợp với hoàn cảnh. Bài này cho bạn khung quyết định thực dụng để chọn giữa 4 lựa chọn phổ biến nhất cho bộ nhớ agent.
Bảng so sánh nhanh
| Tiêu chí | pgvector | Qdrant | Pinecone | Weaviate |
|---|---|---|---|---|
| Kiểu | Extension của Postgres | DB chuyên vector | Managed cloud thuần | DB chuyên vector |
| Tự host | Có | Có | Không (SaaS) | Có |
| Managed cloud | Có (Supabase, Neon...) | Có (Qdrant Cloud) | Có (mặc định) | Có (WCS) |
| Hybrid search | Qua SQL + tsvector | Có (sparse+dense) | Có | Có (BM25+vector) |
| Metadata filter | SQL đầy đủ | Mạnh | Có | Có (GraphQL) |
| Điểm mạnh | Đã có Postgres, join dữ liệu | Nhanh, filter tốt, OSS | Không lo vận hành | Schema + module hóa |
Khung quyết định 4 câu hỏi
- Đã có Postgres trong hệ thống chưa?
- Cần hiệu năng cao + filter phức tạp, muốn tự host / OSS?
- Không muốn vận hành gì cả, chấp nhận trả tiền theo dùng?
- Muốn schema có kiểu dữ liệu, module hóa (vectorizer, generative)?
Ví dụ tình huống thật
Tình huống A — Startup fintech đã dùng Supabase (Postgres). Cần agent nhớ lịch sử giao dịch của user và tra chính sách. Vector vài trăm nghìn.
→ Chọn pgvector. Lý do: join thẳng memories với users bằng user_id, một hệ backup, không thêm hạ tầng.
Tình huống B — Sản phẩm search ngữ nghĩa 50 triệu vector, cần độ trễ < 50ms, đội nhỏ không muốn quản DB. → Chọn Pinecone hoặc Qdrant Cloud. pgvector ở quy mô này sẽ đau về tuning index.
Đoạn khởi tạo nhanh mỗi bên (cảm nhận API)
# pgvector (qua SQL)
# CREATE EXTENSION vector;
# CREATE TABLE mem (id bigserial, embedding vector(1536), text text, user_id int);
# Qdrant
from qdrant_client import QdrantClient
c = QdrantClient(":memory:")
c.create_collection("mem", vectors_config={"size":1536,"distance":"Cosine"})
# Pinecone
from pinecone import Pinecone
pc = Pinecone(api_key="...")
pc.create_index("mem", dimension=1536, metric="cosine")
# Weaviate
import weaviate
client = weaviate.connect_to_local()
client.collections.create("Mem", vectorizer_config=None) # tự đẩy vector
Checklist chọn công cụ
- [ ] Quy mô vector (nghìn → pgvector ok; nhiều triệu → chuyên dụng).
- [ ] Có cần join với dữ liệu quan hệ không? (Có → pgvector lợi thế lớn.)
- [ ] Đội có kỹ năng DevOps để self-host không? (Không → managed.)
- [ ] Ràng buộc chi phí: SaaS tính theo dùng vs server cố định.
- [ ] Compliance: dữ liệu có được phép rời hạ tầng của bạn? (Không → self-host.)
Sai lầm thường gặp
- Chọn Pinecone chỉ vì "nghe nổi tiếng" trong khi đã có Postgres và chỉ vài chục nghìn vector — thêm hạ tầng + chi phí không cần thiết.
- Chọn pgvector cho 100 triệu vector rồi ngạc nhiên vì chậm — quy mô đó nên dùng DB chuyên dụng.
- Bỏ qua yếu tố filter: nếu agent luôn lọc theo
user_id, hãy chọn công cụ có metadata filter mạnh và biết cách đánh index cho field đó. - Lock-in mù quáng: viết code bám chặt SDK một bên. Nên bọc một lớp
MemoryStoreinterface để đổi backend về sau đỡ đau.
Học xong bài này rồi?
Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu,
và học hết khóa thì có chứng chỉ.
Lưu tiến độ của tôi