Vector database la thanh phan cot loi cua cac ung dung AI hien dai can tim kiem ngu nghia, retrieval-augmented generation (RAG), hoac he thong goi y. Khac voi co so du lieu truyen thong chi khop tu khoa chinh xac, vector database luu tru va truy van cac embedding nhieu chieu, giup ung dung tim noi dung tuong dong ve mat y nghia.
Trong bai huong dan nay, ban se cai dat ca Pinecone (quan ly tren cloud) va Chroma (ma nguon mo, tu host), xay dung mot pipeline RAG don gian voi tung loai, va hieu khi nao nen chon cai nao.
Yeu cau truoc khi bat dau
Truoc khi bat dau, hay dam bao ban co:
- Python 3.9 tro len
- API key cua OpenAI (de tao embedding)
- Tai khoan Pinecone (goi mien phi la du)
- Kien thuc co ban ve pip va virtual environment
Buoc 1: Thiet lap moi truong du an
Tao thu muc du an va moi truong ao:
mkdir vector-db-demo && cd vector-db-demo
python -m venv venv
source venv/bin/activate # Tren Windows: venv\Scripts\activateCai dat cac thu vien dung chung:
pip install openai tiktoken langchain langchain-openaiTao file .env chua API key:
OPENAI_API_KEY=sk-your-key-here
PINECONE_API_KEY=your-pinecone-keyBuoc 2: Cai dat Chroma (Vector Database cuc bo)
Chroma chay hoan toan tren may ban ma khong can cau hinh gi. Cai dat:
pip install chromadbTao file chroma_demo.py:
import chromadb
from chromadb.utils import embedding_functions
# Khoi tao luu tru lau dai
client = chromadb.PersistentClient(path="./chroma_data")
# Su dung OpenAI embeddings
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
api_key="your-openai-key",
model_name="text-embedding-3-small"
)
# Tao collection
collection = client.get_or_create_collection(
name="documents",
embedding_function=openai_ef
)
# Them tai lieu
collection.add(
documents=[
"Vector databases luu tru embeddings cho tim kiem ngu nghia.",
"RAG ket hop truy xuat voi sinh van ban tu mo hinh ngon ngu.",
"Pinecone la dich vu vector database duoc quan ly.",
"Chroma la co so du lieu embedding ma nguon mo.",
],
ids=["doc1", "doc2", "doc3", "doc4"]
)
# Truy van
results = collection.query(
query_texts=["Lam sao de tim tai lieu tuong tu?"],
n_results=2
)
print(results["documents"])Chay thu:
python chroma_demo.pyBan se thay hai tai lieu co ngu nghia gan nhat duoc tra ve. Chroma xu ly viec tao embedding, luu tru, va truy van chi trong vai dong code.
Buoc 3: Cai dat Pinecone (Database tren Cloud)
Pinecone can tai khoan nhung bu lai se lo toan bo viec mo rong, nhan ban, va ha tang cho ban. Cai dat:
pip install pinecone-client openaiTao file pinecone_demo.py:
from pinecone import Pinecone, ServerlessSpec
from openai import OpenAI
import os
# Khoi tao client
pc = Pinecone(api_key=os.getenv("PINECONE_API_KEY"))
openai_client = OpenAI()
# Tao index (chi can chay mot lan)
index_name = "documents"
if index_name not in pc.list_indexes().names():
pc.create_index(
name=index_name,
dimension=1536, # Kich thuoc cua text-embedding-3-small
metric="cosine",
spec=ServerlessSpec(cloud="aws", region="us-east-1")
)
index = pc.Index(index_name)
# Chuan bi tai lieu
documents = [
"Vector databases luu tru embeddings cho tim kiem ngu nghia.",
"RAG ket hop truy xuat voi sinh van ban tu mo hinh ngon ngu.",
"Pinecone la dich vu vector database duoc quan ly.",
"Chroma la co so du lieu embedding ma nguon mo.",
]
# Tao embeddings
response = openai_client.embeddings.create(
input=documents,
model="text-embedding-3-small"
)
# Upsert vectors kem metadata
vectors = [
(f"doc{i+1}", emb.embedding, {"text": doc})
for i, (doc, emb) in enumerate(zip(documents, response.data))
]
index.upsert(vectors=vectors)
# Truy van
query_embedding = openai_client.embeddings.create(
input=["Lam sao de tim tai lieu tuong tu?"],
model="text-embedding-3-small"
).data[0].embedding
results = index.query(vector=query_embedding, top_k=2, include_metadata=True)
for match in results.matches:
print(f"Diem: {match.score:.4f} | {match.metadata['text']}")Buoc 4: Xay dung Pipeline RAG don gian
Ket hop tim kiem vector voi LLM de tra loi cau hoi:
from openai import OpenAI
client = OpenAI()
def rag_answer(question, context_docs):
context = "\n".join(context_docs)
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": f"Tra loi dua tren ngu canh sau:\n{context}"},
{"role": "user", "content": question}
]
)
return response.choices[0].message.content
# Su dung voi ket qua tu Chroma hoac Pinecone
question = "Su khac biet giua Pinecone va Chroma la gi?"
# retrieved_docs = ket qua tim kiem vector cua ban
answer = rag_answer(question, retrieved_docs)
print(answer)Buoc 5: Chon database phu hop voi nhu cau cua ban
Meo thuc te
Day la nhung bai hoc rut ra tu viec trien khai vector database trong thuc te:
1. Upsert theo lo. Ca Pinecone va Chroma deu hoat dong tot hon dang ke khi ban chen tai lieu theo lo 100-500 thay vi tung cai mot.
2. Chon kich thuoc embedding hop ly. text-embedding-3-small cua OpenAI (1536 chieu) la su can bang tot giua chat luong va chi phi. Chi dung text-embedding-3-large khi do chinh xac truy xuat la yeu to then chot va chi phi khong phai van de.
3. Luu metadata day du. Luon luu van ban goc va metadata lien quan (URL nguon, thoi gian, danh muc) cung voi vector. Ban se can chung de loc va hien thi.
4. Su dung namespace cho multi-tenancy. Trong Pinecone, namespace cho phep phan vung du lieu theo nguoi dung hoac du an ma khong can tao nhieu index. Trong Chroma, hay dung cac collection rieng biet.
5. Theo doi recall. Thiet lap danh gia voi tap du lieu nho co nhan. Do xem tai lieu dung co xuat hien trong top-k ket qua khong. Nham toi recall 90%+ tai k=5.
6. Loc truoc khi co the. Neu ban biet nguoi dung chi can tai lieu tu mot danh muc cu the, ap dung bo loc metadata truoc khi tim kiem vector. Dieu nay giam khong gian tim kiem va cai thien ca toc do lan do chinh xac.
Nhung loi thuong gap can tranh
- Quen doi index san sang -- Index cua Pinecone mat 30-60 giay de khoi tao. Luon kiem tra
describe_indextruoc khi truy van index moi. - Tron lan mo hinh embedding -- Neu ban embed tai lieu voi
text-embedding-3-small, ban phai truy van voi cung mo hinh do. Kich thuoc hoac khong gian embedding khong khop se tra ve ket qua vo nghia. - Khong xu ly trung lap -- Su dung ID xac dinh (vi du: hash cua noi dung) de khi index lai cung tai lieu se ghi de thay vi tao ban sao.
Buoc tiep theo
Sau khi pipeline co ban hoat dong:
- Them chunking cho tai lieu dai (nham 200-500 token moi chunk)
- Trien khai tim kiem ket hop (ket hop tuong dong vector voi BM25 theo tu khoa)
- Them reranker (Cohere Rerank hoac cross-encoder) de tang do chinh xac
- Thiet lap so lieu danh gia de do chat luong truy xuat theo thoi gian