MedChat / src /embeddings.py
=
fix: set HF_HUB_OFFLINE=1 at runtime to prevent model network calls on startup
66c6f17
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
"""