File size: 2,253 Bytes
74b76f3 66c6f17 74b76f3 66c6f17 74b76f3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | from langchain_huggingface import HuggingFaceEmbeddings
from config import Config
from numpy import dot
from numpy.linalg import norm
class EmbeddingsManager:
# Khởi tạo model embedding từ cofig ngay khi gọi class
def __init__(self):
import os
# Use cached model; never call the network (model is baked into Docker image)
local_only = os.getenv("TRANSFORMERS_OFFLINE", "0") == "1" or \
os.getenv("HF_HUB_OFFLINE", "0") == "1"
self.embeddings = HuggingFaceEmbeddings(
model_name=Config.EMBEDDING_MODEL,
model_kwargs={"local_files_only": local_only},
)
def get_embeddings(self):
return self.embeddings
# Code thêm cái này xíu hiểu hơn bản chất so sánh vector embed
def cosine(a, b):
return dot(a, b) / (norm(a) * norm(b))
# TEST: python embeddings.py
if __name__ == "__main__":
print("Loading embedding model...")
em = EmbeddingsManager()
embeddings = em.get_embeddings()
text = "Sốt ở trẻ em là tình trạng thân nhiệt tăng."
vec = embeddings.embed_query(text)
print("Vector length:", len(vec))
print("First 5 values:", vec[:5])
# ---- Test 2: cosine similarity ----
v1 = embeddings.embed_query("Sốt ở trẻ em")
v2 = embeddings.embed_query("Trẻ bị sốt cao")
v3 = embeddings.embed_query("Gãy xương tay")
print("\n COSINE SIMILARITY TEST")
print("v1 ↔ v2 (gần nghĩa):", cosine(v1, v2))
print("v1 ↔ v3 (khác nghĩa):", cosine(v1, v3))
"""
OUTPUT VÀ EXPLAIN DỄ HIỂU:
1. OUTPUT:
Vector length: 384
First 5 values: [-0.02630099654197693, 0.01091383583843708, 0.0058159008622169495, -0.05811420455574989, -0.051191169768571854]
2. EXPLAIN
- Là tọa độ ngữ nghĩa của câu
- Không có ý nghĩa đơn lẻ
- Chỉ có ý nghĩa khi so sánh với vector khác
v1 = embed("Sốt ở trẻ em")
v2 = embed("Trẻ bị sốt cao")
v3 = embed("Gãy xương tay")
=> v1 ≈ v2 (gần)
v1 ≠ v3 (xa)
=> FAISS dùng cosine similarity / L2 distance để tìm câu gần nghĩa nhất
"""
|