|
|
|
|
|
from sentence_transformers import SentenceTransformer |
|
|
from sklearn.metrics.pairwise import cosine_similarity |
|
|
import numpy as np |
|
|
|
|
|
|
|
|
model = SentenceTransformer('ThanhLe0125/ebd-math') |
|
|
|
|
|
|
|
|
query = "query: Định nghĩa hàm số đồng biến" |
|
|
chunks = [ |
|
|
"passage: Hàm số đồng biến trên khoảng (a;b) là hàm số mà với mọi x1 < x2 thì f(x1) < f(x2)", |
|
|
"passage: Ví dụ: Tìm khoảng đồng biến của hàm số y = x^2 - 2x + 1", |
|
|
"passage: Phương trình bậc hai ax^2 + bx + c = 0 có delta = b^2 - 4ac", |
|
|
"passage: Tính đạo hàm của hàm số đa thức", |
|
|
"passage: Giới hạn của dãy số" |
|
|
] |
|
|
|
|
|
|
|
|
query_emb = model.encode([query]) |
|
|
chunk_embs = model.encode(chunks) |
|
|
similarities = cosine_similarity(query_emb, chunk_embs)[0] |
|
|
|
|
|
|
|
|
ranked_indices = similarities.argsort()[::-1] |
|
|
|
|
|
print("MRR-Optimized Rankings:") |
|
|
for rank, idx in enumerate(ranked_indices, 1): |
|
|
chunk_type = "CORRECT" if idx == 0 else ("RELATED" if idx == 1 else "IRRELEVANT") |
|
|
print(f"Rank {rank}: {chunk_type} (Score: {similarities[idx]:.4f})") |
|
|
print(f" {chunks[idx][:80]}...") |
|
|
print() |
|
|
|
|
|
|
|
|
correct_rank = None |
|
|
for rank, idx in enumerate(ranked_indices, 1): |
|
|
if idx == 0: |
|
|
correct_rank = rank |
|
|
break |
|
|
|
|
|
if correct_rank: |
|
|
mrr_score = 1.0 / correct_rank |
|
|
print(f"This query MRR: {mrr_score:.4f} (correct chunk at rank #{correct_rank})") |
|
|
|
|
|
if mrr_score >= 0.5: |
|
|
print("✅ Good! Correct chunk in top 2 positions") |
|
|
else: |
|
|
print("⚠️ Could be better - correct chunk should be higher") |
|
|
|
|
|
|
|
|
print("\nEfficient Inference (top 3 only):") |
|
|
top_3_indices = ranked_indices[:3] |
|
|
for i, idx in enumerate(top_3_indices, 1): |
|
|
print(f"{i}. Score: {similarities[idx]:.4f} - {chunks[idx][:60]}...") |
|
|
|