
SQLite là cơ sở dữ liệu nhúng phổ biến nhất thế giới, nhưng ít người biết nó còn có thể làm vector database cho ứng dụng AI nhờ extension sqlite-vss (Vector Similarity Search) của Alex Garcia. Kết hợp embedding model local như all-MiniLM-L6-v2, bạn có thể chạy semantic search hoàn toàn offline mà không cần server riêng.
Trước khi sqlite-vss xuất hiện, người ta thường dùng Chroma, Qdrant hay Pinecone để lưu vector. Giờ bạn chỉ cần một file .db đơn giản. Điều này đặc biệt hữu ích cho app desktop, CLI tool, hoặc prototype nhanh mà không muốn chạy container phức tạp.

So sánh SQLite vs vector database chuyên dụng
Không phải lúc nào cũng nên dùng SQLite cho AI. Bảng dưới đây giúp bạn quyết định nhanh:
| Tiêu chí | SQLite + sqlite-vss | Qdrant / Chroma / Pinecone |
|---|---|---|
| Kích thước dataset | Dưới vài triệu vector, DB < 10GB | Hàng triệu đến tỷ vector, cluster |
| Latency | 1-5ms cho local ANN | 1-20ms tùy infra |
| Chi phí | Miễn phí, file .db | Có thể miễn phí tier, nhưng cần server |
| Triển khai | Copy file, không cần network | Cần endpoint, container, hoặc cloud |
| Filter metadata | Hỗ trợ SQL WHERE | Hỗ trợ payload filter |
Cài đặt sqlite-vss và chạy thử
Bước 1: Cài extension. Trên macOS/Linux bạn dùng brew install sqlite-vss hoặc build từ source nếu dùng Windows. Python có gói sqlite-vss tự động load extension.
Bước 2: Tạo bảng lưu embedding. Cấu trúc bảng gồm 2 phần: bảng chính lưu nội dung và metadata, bảng vss lưu vector.
import sqlite3
import sqlite_vss
conn = sqlite3.connect("knowledge.db")
conn.enable_load_extension(True)
sqlite_vss.load(conn)
conn.execute("""
CREATE TABLE IF NOT EXISTS documents (
id INTEGER PRIMARY KEY,
content TEXT,
url TEXT
)
""")
conn.execute("""
CREATE VIRTUAL TABLE IF NOT EXISTS vss_docs USING vss0(
embedding(384)
)
""")
Bước 3: Chèn dữ liệu và search. Dùng model all-MiniLM-L6-v2 của sentence-transformers để tạo embedding 384 chiều, rồi insert vào bảng vss_docs.
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
docs = [
("Python là gì? Ngôn ngữ lập trình bậc cao", "https://example.com/python"),
("SQLite là gì? Database nhúng nhẹ", "https://example.com/sqlite"),
]
for text, url in docs:
emb = model.encode(text).tolist()
cur = conn.execute("INSERT INTO documents (content, url) VALUES (?, ?)", (text, url))
doc_id = cur.lastrowid
conn.execute("INSERT INTO vss_docs (rowid, embedding) VALUES (?, ?)", (doc_id, emb))
conn.commit()
Bước 4: Tìm kiếm semantic. Câu truy vấn sẽ được biến thành vector, rồi sqlite-vss tìm top-k vector gần nhất bằng khoảng cách cosine hoặc Euclidean.
query = "hướng dẫn học lập trình Python"
q_emb = model.encode(query).tolist()
results = conn.execute("""
SELECT d.id, d.content, d.url, v.distance
FROM vss_docs v
JOIN documents d ON d.rowid = v.rowid
WHERE v.embedding MATCH ?
ORDER BY v.distance
LIMIT 3
""", (q_emb,)).fetchall()
for r in results:
print(f"[{r[2]}] {r[1]} (distance: {r[3]:.4f})")

Khi nào nên dùng, khi nào không?
Dùng SQLite + sqlite-vss khi bạn cần prototype nhanh, app desktop, CLI tool, hoặc dataset nhỏ dưới vài triệu vector. Không dùng khi cần quy mô lớn, đồng thời nhiều writer, hoặc cần advanced filtering phức tạp vì SQLite chỉ phù hợp với single-writer ở mức độ cao.
Kết hợp tốt nhất là dùng SQLite làm local cache và Qdrant làm cloud backend — app đồng bộ metadata lên cloud khi online, vẫn hoạt động offline nhờ bản sao SQLite local.
