Views
No views yet
| Metric | Fine-tuned | Base Model | Improvement |
|---|---|---|---|
| MRR | 0.8439068100358421 | 0.7695340501792116 | +0.0743727598566305 (9.7%) |
| Avg Rank | 1.1849649607135275 | 1.2994876571960874 | Better by 0.11452269648255986 positions |
| Metric | Fine-tuned | Base Model | Improvement |
|---|---|---|---|
| Recall@1 | 0.720 | 0.602 | +0.118 |
| Recall@2 | 0.925 | 0.860 | +0.065 |
| Recall@3 | 0.968 | 0.925 | +0.043 |
| Recall@4 | 0.978 | 0.968 | +0.011 |
| Recall@5 | 1.000 | 0.989 | +0.011 |
MRR optimization pushes correct chunks to top positions:
Before (Base Model):
Rank 1: Related chunk (MRR contribution: 0.0)
Rank 2: Irrelevant (MRR contribution: 0.0)
Rank 3: CORRECT chunk (MRR contribution: 0.33)
After (Fine-tuned):
Rank 1: CORRECT chunk (MRR contribution: 1.0) ⭐
Rank 2: Related chunk (MRR contribution: 0.0)
Rank 3: Irrelevant (MRR contribution: 0.0)
Result: 3x better MRR, users find answers immediately!1from sentence_transformers import SentenceTransformer
2from sklearn.metrics.pairwise import cosine_similarity
3
4# Load MRR-optimized model
5model = SentenceTransformer('ThanhLe0125/e5-math')
6
7# ⚠️ CRITICAL: Must use E5 prefixes
8query = "query: Định nghĩa hàm số đồng biến là gì?"
9chunks = [
10 "passage: Hàm số đồng biến trên khoảng (a;b) là...", # CORRECT
11 "passage: Ví dụ bài tập về hàm đồng biến...", # RELATED
12 "passage: Phương trình bậc hai có dạng..." # IRRELEVANT
13]
14
15# Get MRR-optimized rankings
16query_emb = model.encode([query])
17chunk_embs = model.encode(chunks)
18similarities = cosine_similarity(query_emb, chunk_embs)[0]
19
20# With fine-tuning, correct chunk should be at rank #1
21ranked_indices = similarities.argsort()[::-1]
22print(f"Rank 1: {chunks[ranked_indices[0]][:50]}... (Score: {similarities[ranked_indices[0]]:.3f})")
23
24# Expected: Correct chunk at rank #1 with high score1# Efficient inference - high probability correct chunk is #1
2top_chunk = chunks[similarities.argmax()]
3confidence = similarities.max()
4
5if confidence > 0.7: # High confidence threshold
6 return top_chunk # Likely the correct answer
7else:
8 return chunks[similarities.argsort()[::-1][:3]] # Return top 3 as fallback