
Smart Binary E5-Math Model - MRR: 0.9526 (+0.0414), Hit@3: 1.0000 (+0.0000) - 2025-07-02
18d7e32
verified
# Smart Binary Model: Usage Examples | |
## 1. Basic Retrieval Example | |
```python | |
from sentence_transformers import SentenceTransformer | |
from sklearn.metrics.pairwise import cosine_similarity | |
import numpy as np | |
# Load smart binary model | |
model = SentenceTransformer('ThanhLe0125/e5-math-smart-binary') | |
# Example query và chunks | |
query = "query: Định nghĩa đạo hàm của hàm số" | |
chunks = [ | |
"passage: Đạo hàm của hàm số f(x) tại x₀ là giới hạn của tỉ số...", # Correct | |
"passage: Các quy tắc tính đạo hàm: (xⁿ)' = nxⁿ⁻¹, (sin x)' = cos x...", # Related | |
"passage: Tích phân xác định của hàm số trên đoạn [a,b]...", # Irrelevant | |
"passage: Phương trình vi phân bậc nhất có dạng y' + P(x)y = Q(x)" # Irrelevant | |
] | |
# Smart binary retrieval | |
query_emb = model.encode([query]) | |
chunk_embs = model.encode(chunks) | |
similarities = cosine_similarity(query_emb, chunk_embs)[0] | |
print("Smart Binary Rankings:") | |
ranked_indices = similarities.argsort()[::-1] | |
for rank, idx in enumerate(ranked_indices, 1): | |
chunk_type = ["CORRECT", "RELATED", "IRRELEVANT", "IRRELEVANT"][idx] | |
print(f"Rank {rank}: {chunk_type} (Score: {similarities[idx]:.4f})") | |
print(f" {chunks[idx][:70]}...") | |
print() | |
# Expected smart binary results: | |
# Rank 1: CORRECT (Score: ~0.87) | |
# Rank 2: RELATED (Score: ~0.65) | |
# Rank 3: IRRELEVANT (Score: ~0.25) | |
# Rank 4: IRRELEVANT (Score: ~0.20) | |
``` | |
## 2. Batch Processing Multiple Queries | |
```python | |
# Multiple Vietnamese math queries | |
queries = [ | |
"query: Cách giải phương trình bậc hai", | |
"query: Định nghĩa hàm số đồng biến", | |
"query: Công thức tính thể tích hình cầu" | |
] | |
math_content_pool = [ | |
"passage: Phương trình bậc hai ax² + bx + c = 0 có nghiệm x = (-b ± √Δ)/2a", | |
"passage: Hàm số đồng biến trên khoảng I khi f'(x) > 0 với mọi x ∈ I", | |
"passage: Thể tích hình cầu bán kính R là V = (4/3)πR³", | |
"passage: Diện tích hình tròn bán kính r là S = πr²", | |
"passage: Định lý Pythagoras: a² + b² = c² trong tam giác vuông" | |
] | |
# Process all queries efficiently | |
for query in queries: | |
print(f"\nQuery: {query.replace('query: ', '')}") | |
query_emb = model.encode([query]) | |
chunk_embs = model.encode(math_content_pool) | |
similarities = cosine_similarity(query_emb, chunk_embs)[0] | |
# Get top 3 với smart binary model | |
top_3_indices = similarities.argsort()[::-1][:3] | |
for rank, idx in enumerate(top_3_indices, 1): | |
score = similarities[idx] | |
confidence = "HIGH" if score > 0.8 else "MEDIUM" if score > 0.5 else "LOW" | |
print(f" {rank}. [{confidence}] {score:.3f} - {math_content_pool[idx]}") | |
``` | |
## 3. Production Class Implementation | |
```python | |
class SmartBinaryMathRetriever: | |
def __init__(self, model_name='ThanhLe0125/e5-math-smart-binary'): | |
self.model = SentenceTransformer(model_name) | |
print(f"Smart Binary Model loaded: {model_name}") | |
def retrieve_with_confidence(self, query, chunks, top_k=5, min_confidence=0.3): | |
""" | |
Smart binary retrieval với confidence scoring | |
Args: | |
query: Vietnamese math question | |
chunks: List of educational content | |
top_k: Number of results to return | |
min_confidence: Minimum similarity threshold | |
""" | |
# Ensure E5 format | |
formatted_query = f"query: {query}" if not query.startswith("query:") else query | |
formatted_chunks = [ | |
f"passage: {chunk}" if not chunk.startswith("passage:") else chunk | |
for chunk in chunks | |
] | |
# Encode với smart binary model | |
query_emb = self.model.encode([formatted_query]) | |
chunk_embs = self.model.encode(formatted_chunks) | |
similarities = cosine_similarity(query_emb, chunk_embs)[0] | |
# Filter by confidence và rank | |
results = [] | |
for idx, similarity in enumerate(similarities): | |
if similarity >= min_confidence: | |
results.append({ | |
'chunk_index': idx, | |
'chunk': chunks[idx], | |
'similarity': float(similarity), | |
'confidence_level': self._get_confidence_level(similarity) | |
}) | |
# Sort by similarity và limit | |
results.sort(key=lambda x: x['similarity'], reverse=True) | |
results = results[:top_k] | |
# Add ranking | |
for rank, result in enumerate(results, 1): | |
result['rank'] = rank | |
return results | |
def _get_confidence_level(self, similarity): | |
"""Convert similarity to confidence level""" | |
if similarity >= 0.85: | |
return "VERY_HIGH" | |
elif similarity >= 0.7: | |
return "HIGH" | |
elif similarity >= 0.5: | |
return "MEDIUM" | |
elif similarity >= 0.3: | |
return "LOW" | |
else: | |
return "VERY_LOW" | |
def batch_retrieve(self, queries, chunk_pool, top_k_per_query=3): | |
"""Process multiple queries efficiently""" | |
all_results = {} | |
for query in queries: | |
results = self.retrieve_with_confidence(query, chunk_pool, top_k_per_query) | |
all_results[query] = results | |
return all_results | |
# Usage example | |
retriever = SmartBinaryMathRetriever() | |
# Single query | |
query = "Cách tính đạo hàm của hàm hợp" | |
chunks = [ | |
"Đạo hàm hàm hợp: (f(g(x)))' = f'(g(x)) × g'(x)", | |
"Ví dụ: Tính đạo hàm của (x² + 1)³", | |
"Tích phân từng phần: ∫u dv = uv - ∫v du" | |
] | |
results = retriever.retrieve_with_confidence(query, chunks, top_k=3, min_confidence=0.2) | |
print("Smart Binary Retrieval Results:") | |
for result in results: | |
print(f"Rank {result['rank']}: {result['confidence_level']}") | |
print(f" Similarity: {result['similarity']:.4f}") | |
print(f" Content: {result['chunk'][:60]}...") | |
print() | |
``` | |
## 4. Comparison và Evaluation | |
```python | |
# Compare smart binary với base model | |
def compare_models(query, chunks): | |
# Load models | |
base_model = SentenceTransformer('intfloat/multilingual-e5-base') | |
smart_binary_model = SentenceTransformer('ThanhLe0125/e5-math-smart-binary') | |
# Format query | |
formatted_query = f"query: {query}" | |
formatted_chunks = [f"passage: {chunk}" for chunk in chunks] | |
# Encode với both models | |
query_emb_base = base_model.encode([formatted_query]) | |
query_emb_smart = smart_binary_model.encode([formatted_query]) | |
chunk_embs_base = base_model.encode(formatted_chunks) | |
chunk_embs_smart = smart_binary_model.encode(formatted_chunks) | |
# Calculate similarities | |
similarities_base = cosine_similarity(query_emb_base, chunk_embs_base)[0] | |
similarities_smart = cosine_similarity(query_emb_smart, chunk_embs_smart)[0] | |
# Compare rankings | |
print(f"Query: {query}") | |
print("="*50) | |
for i, chunk in enumerate(chunks): | |
base_score = similarities_base[i] | |
smart_score = similarities_smart[i] | |
improvement = smart_score - base_score | |
print(f"Chunk {i+1}:") | |
print(f" Base Model: {base_score:.4f}") | |
print(f" Smart Binary: {smart_score:.4f}") | |
print(f" Improvement: {improvement:+.4f}") | |
print(f" Content: {chunk[:50]}...") | |
print() | |
# Example comparison | |
compare_models( | |
"Định nghĩa hàm số liên tục", | |
[ | |
"Hàm số f liên tục tại x₀ nếu lim(x→x₀) f(x) = f(x₀)", # Correct | |
"Ví dụ hàm số liên tục: f(x) = x², g(x) = sin(x)", # Related | |
"Phương trình vi phân có nghiệm tổng quát y = Ce^x" # Irrelevant | |
] | |
) | |
``` | |
## 5. Advanced Analytics | |
```python | |
def analyze_smart_binary_performance(queries, chunks, ground_truth): | |
""" | |
Comprehensive performance analysis | |
Args: | |
queries: List of test queries | |
chunks: List of content chunks | |
ground_truth: List of correct chunk indices for each query | |
""" | |
model = SentenceTransformer('ThanhLe0125/e5-math-smart-binary') | |
metrics = { | |
'mrr_scores': [], | |
'hit_at_1': 0, | |
'hit_at_3': 0, | |
'hit_at_5': 0, | |
'total_queries': len(queries) | |
} | |
for i, query in enumerate(queries): | |
# Format và encode | |
formatted_query = f"query: {query}" | |
formatted_chunks = [f"passage: {chunk}" for chunk in chunks] | |
query_emb = model.encode([formatted_query]) | |
chunk_embs = model.encode(formatted_chunks) | |
similarities = cosine_similarity(query_emb, chunk_embs)[0] | |
# Rank chunks | |
ranked_indices = similarities.argsort()[::-1] | |
correct_idx = ground_truth[i] | |
# Find rank of correct answer | |
correct_rank = None | |
for rank, idx in enumerate(ranked_indices, 1): | |
if idx == correct_idx: | |
correct_rank = rank | |
break | |
if correct_rank: | |
# Calculate MRR | |
mrr = 1.0 / correct_rank | |
metrics['mrr_scores'].append(mrr) | |
# Hit@K metrics | |
if correct_rank <= 1: | |
metrics['hit_at_1'] += 1 | |
if correct_rank <= 3: | |
metrics['hit_at_3'] += 1 | |
if correct_rank <= 5: | |
metrics['hit_at_5'] += 1 | |
# Calculate final metrics | |
avg_mrr = np.mean(metrics['mrr_scores']) if metrics['mrr_scores'] else 0 | |
hit_1_rate = metrics['hit_at_1'] / metrics['total_queries'] | |
hit_3_rate = metrics['hit_at_3'] / metrics['total_queries'] | |
hit_5_rate = metrics['hit_at_5'] / metrics['total_queries'] | |
print("Smart Binary Model Performance Analysis:") | |
print(f" MRR (Mean Reciprocal Rank): {avg_mrr:.4f}") | |
print(f" Hit@1 (Accuracy): {hit_1_rate:.4f} ({metrics['hit_at_1']}/{metrics['total_queries']})") | |
print(f" Hit@3: {hit_3_rate:.4f} ({metrics['hit_at_3']}/{metrics['total_queries']})") | |
print(f" Hit@5: {hit_5_rate:.4f} ({metrics['hit_at_5']}/{metrics['total_queries']})") | |
return { | |
'mrr': avg_mrr, | |
'hit_at_1': hit_1_rate, | |
'hit_at_3': hit_3_rate, | |
'hit_at_5': hit_5_rate | |
} | |
# Example usage | |
test_queries = [ | |
"Công thức tính đạo hàm", | |
"Định nghĩa tích phân", | |
"Cách giải phương trình bậc hai" | |
] | |
test_chunks = [ | |
"Đạo hàm của hàm số f(x) = lim[h→0] (f(x+h)-f(x))/h", # For query 1 | |
"Tích phân của f(x) trên [a,b] = ∫[a,b] f(x)dx", # For query 2 | |
"Nghiệm phương trình ax²+bx+c=0 là x = (-b±√Δ)/2a", # For query 3 | |
"Định lý vi phân trung bình", | |
"Công thức Taylor" | |
] | |
ground_truth = [0, 1, 2] # Correct chunk indices | |
performance = analyze_smart_binary_performance(test_queries, test_chunks, ground_truth) | |
``` | |
These examples demonstrate the smart binary model's balanced approach to precision and recall, making it ideal for Vietnamese mathematical content retrieval with optimal user experience. | |