| | from langchain_huggingface import HuggingFaceEmbeddings |
| | from config import Config |
| | from numpy import dot |
| | from numpy.linalg import norm |
| |
|
| | class EmbeddingsManager: |
| | |
| | def __init__(self): |
| | import os |
| | |
| | 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 |
| |
|
| | |
| | def cosine(a, b): |
| | return dot(a, b) / (norm(a) * norm(b)) |
| |
|
| | |
| | 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]) |
| |
|
| | |
| | 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 |
| | |
| | """ |
| |
|
| |
|
| |
|