Loading
Loading
Embeddings convert text into numbers in a way that preserves semantic meaning โ the foundational building block for RAG systems and smart search.
An embedding is a mathematical representation (vector) of text in a multi-dimensional space. Key property: semantically similar texts are close in this space.
"The cat sits on the mat" โ [0.23, -0.71, 0.45, ...]
"A feline rests on the rug" โ [0.25, -0.69, 0.43, ...] very close!
"Tomorrow will be rainy" โ [-0.82, 0.31, -0.55, ...] far away
similarity = (A ยท B) / (|A| ร |B|)
1.0 = identical meaning, 0.0 = unrelated, -1.0 = opposite.
Long documents are split into chunks before embedding. Use overlap between chunks to preserve context:
chunk 1: chars 0โ500
chunk 2: chars 400โ900 (100-char overlap)
chunk 3: chars 800โ1300
import numpy as np
from sentence_transformers import SentenceTransformer # pip install sentence-transformers
print("=" * 55)
print("Embeddings: ุงูุชุดุงุจู ุงูุฏูุงูู")
print("=" * 55)
# ูู
ูุฐุฌ ู
ุฌุงูู ูุนู
ู ู
ุญููุงู
model = SentenceTransformer("all-MiniLM-L6-v2")
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 1. ุชูููุฏ ุงูู Embeddings
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
sentences_ar = [
"ุงููุทุฉ ุชุฌูุณ ุนูู ุงูุณุฌุงุฏุฉ",
"ุงููุฑุฉ ููู ุงูุจุณุงุท",
"ููุจ ูุฑูุถ ูู ุงูุญุฏููุฉ",
"ุฃุญุจ ุชูุงูู ุงููููุฉ ูู ุงูุตุจุงุญ",
"ุงูุดุงู ุงูู
ุณุงุฆู ู
ู
ุชุน",
"ุงูุฐูุงุก ุงูุงุตุทูุงุนู ูุบูุฑ ุงูุนุงูู
",
]
print("\n1. ุชูููุฏ Embeddings...")
embeddings = model.encode(sentences_ar)
print(f"ุดูู ู
ุตูููุฉ ุงูู embeddings: {embeddings.shape}")
print(f"(ุนุฏุฏ ุงูุฌู
ู ร ุฃุจุนุงุฏ ูู embedding)")
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 2. ุญุณุงุจ Cosine Similarity
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
def cosine_similarity(a: np.ndarray, b: np.ndarray) -> float:
return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))
print("\n2. ู
ุตูููุฉ ุงูุชุดุงุจู:")
print(f"{'':30s}", end="")
for s in sentences_ar:
print(f"{s[:8]:10s}", end="")
print()
for i, (s1, e1) in enumerate(zip(sentences_ar, embeddings)):
print(f"{s1[:30]:30s}", end="")
for j, (s2, e2) in enumerate(zip(sentences_ar, embeddings)):
sim = cosine_similarity(e1, e2)
color = "๐ข" if sim > 0.7 and i != j else ("๐ก" if sim > 0.4 else "โช")
print(f"{color}{sim:.2f} ", end="")
print()
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 3. ุงูุจุญุซ ุงูุฏูุงูู
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
print("\n3. ุงูุจุญุซ ุงูุฏูุงูู:")
# ูุงุนุฏุฉ ู
ุนุฑูุฉ ุตุบูุฑุฉ
knowledge_base = [
{"id": 1, "text": "Python ูู ูุบุฉ ุจุฑู
ุฌุฉ ู
ูุณูุฑุฉ ุนุงููุฉ ุงูู
ุณุชูู"},
{"id": 2, "text": "ุชุนูู
ุงูุขูุฉ ูุณุชุฎุฏู
ุฎูุงุฑุฒู
ูุงุช ูุงุณุชุฎุฑุงุฌ ุงูุฃูู
ุงุท ู
ู ุงูุจูุงูุงุช"},
{"id": 3, "text": "ุงูุดุจูุงุช ุงูุนุตุจูุฉ ู
ุณุชูุญุงุฉ ู
ู ุงูุฏู
ุงุบ ุงูุจุดุฑู"},
{"id": 4, "text": "RAG ูุฑุจุท LLM ุจู
ุตุงุฏุฑ ู
ุนุฑูุฉ ุฎุงุฑุฌูุฉ"},
{"id": 5, "text": "Vector Database ุชุฎุฒู ูุชุจุญุซ ูู ุงูู embeddings ุจููุงุกุฉ"},
{"id": 6, "text": "Transformer architecture ุบููุฑุช ู
ุฌุงู NLP"},
]
kb_texts = [doc["text"] for doc in knowledge_base]
kb_embeddings = model.encode(kb_texts)
def semantic_search(query: str, top_k: int = 3) -> list:
q_emb = model.encode([query])[0]
scores = [cosine_similarity(q_emb, kb_emb) for kb_emb in kb_embeddings]
ranked = sorted(zip(scores, knowledge_base), key=lambda x: -x[0])
return ranked[:top_k]
queries = [
"ููู ุชุนู
ู ุงูุดุจูุงุช ุงูุนุตุจูุฉุ",
"ู
ุง ูู ูุงุนุฏุฉ ุงูุจูุงูุงุช ุงูู
ูุงุณุจุฉ ููู AIุ",
"ู
ุง ุงููุฑู ุจูู RAG ูLLM ุงูุนุงุฏูุ",
]
for query in queries:
print(f"\n๐ ุงูุงุณุชุนูุงู
: '{query}'")
results = semantic_search(query)
for score, doc in results:
print(f" ({score:.3f}) {doc['text']}")
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 4. Chunking ู
ุณุชูุฏ ุทููู
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
print("\n4. Chunking ุงุณุชุฑุงุชูุฌูุฉ:")
def chunk_text(text: str, chunk_size: int = 200, overlap: int = 50) -> list[str]:
chunks = []
start = 0
while start < len(text):
end = start + chunk_size
chunk = text[start:end]
if len(chunk.strip()) > 20:
chunks.append(chunk)
start += chunk_size - overlap
return chunks
long_doc = """ุงูุฐูุงุก ุงูุงุตุทูุงุนู ูู ู
ุฌุงู ูุงุณุน ูุดู
ู ุชุนูู
ุงูุขูุฉ ูุงูุชุนูู
ุงูุนู
ูู.
ุชุนูู
ุงูุขูุฉ ูุณุชุฎุฏู
ุงูุฎูุงุฑุฒู
ูุงุช ูุชุนูู
ุงูุฃูู
ุงุท ู
ู ุงูุจูุงูุงุช ุจุฏูู ุจุฑู
ุฌุฉ ุตุฑูุญุฉ.
ุงูุชุนูู
ุงูุนู
ูู ูุนุชู
ุฏ ุนูู ุดุจูุงุช ุนุตุจูุฉ ุนู
ููุฉ ูุญู ู
ุดุงูู ู
ุนูุฏุฉ.
ูู
ุงุฐุฌ ุงููุบุฉ ุงููุจูุฑุฉ ู
ุซู GPT ูClaude ูู ุชุทุจููุงุช ู
ุชูุฏู
ุฉ ููุชุนูู
ุงูุนู
ูู.
ูุฐู ุงููู
ุงุฐุฌ ุชุฏุฑูุจุช ุนูู ุชุฑูููููุงุช ุงูููู
ุงุช ู
ู ุงูุฅูุชุฑูุช ูุงููุชุจ."""
chunks = chunk_text(long_doc, chunk_size=100, overlap=20)
print(f"ุทูู ุงูู
ุณุชูุฏ: {len(long_doc)} ุญุฑู โ {len(chunks)} chunks")
for i, chunk in enumerate(chunks, 1):
print(f" Chunk {i}: '{chunk[:50].strip()}...'")