Ang Retrieval ang Nagtatakda ng Upper Limit ng RAG Quality
Sa 2026, bihira na ang kaso ng "bigla na lang naging mas matalino ang RAG pagkatapos palitan ang generation model mula GPT-4 patungong Claude Opus 4.7." Sa karamihan ng kaso, ang problema ay hindi nakukuha ng Retrieval stage ang kinakailangang impormasyon, o pinipili ang noise na nagre-resulta sa pagkalito ng LLM. Sa pagbabalik-tanaw sa mga RAG projects na sinuportahan ng KGA sa nakaraang 18 buwan, ang Retrieval improvement lamang ay nagpataas ng user-perceived score ng 30–60%, habang ang pagtaas mula sa LLM model changes ay average na 8% lamang.
Sa artikulong ito, aayusin natin ang RAG Retrieval best practices ng 2026 sa limang layers: (1) hybrid search, (2) reranker, (3) query rewriting, (4) chunking strategy, at (5) evaluation metrics.
Layer 1: Hybrid Search (BM25 + Dense)
Ang iisang dense search ay madalas na nagfa-fail sa part numbers ("ZX-450B"), abbreviations ("TLS1.3"), proper nouns, at specific numeric conditions. Ang BM25 naman ay mahina sa semantic paraphrasing. Ang pagsasama ng dalawa gamit ang Reciprocal Rank Fusion (RRF) ay naging industry standard.
Ang RRF ay napaka-simple: i-convert ang rank ng bawat search result sa `1 / (k + rank)` at i-sum (k=60 ang default). Dahil hindi kailangang mag-alala tungkol sa scale differences ng scores, gumagana ito nang universally para sa iba't ibang model combinations.
```python from collections import defaultdict
def rrf_fusion(ranked_lists: list[list[str]], k: int = 60) -> list[tuple[str, float]]: scores = defaultdict(float) for results in ranked_lists: for rank, doc_id in enumerate(results, start=1): scores[doc_id] += 1.0 / (k + rank) return sorted(scores.items(), key=lambda x: -x[1])
bm25_top = bm25_index.search(query, k=50) dense_top = vector_db.search(query_embed, k=50) fused = rrf_fusion([bm25_top, dense_top])[:20] ```
Sa legal search project ng KGA, mula BM25-only na nDCG@10=0.52, Dense-only na 0.61, hanggang RRF hybrid na umabot sa 0.73. Simple ngunit malakas.
Layer 2: Reranker (Cohere Rerank-3, Voyage Rerank-2)
Matapos makuha ang top 50–200 sa hybrid search, ang dalawang-yugto na design ng cross-encoder-type reranker para sa precise scoring ay ang de facto ng 2026. Ang dense search ay bi-encoder structure na independently nag-vi-vectorize ng query at document, na nagre-resulta sa pagkawala ng query-document interaction. Ang reranker ay pinapatunog ang parehong sa parehong Transformer para makuha ang tunay na relevance.
- Cohere Rerank-3 (inilabas Setyembre 2025): 100 languages, 128k context, $2/1k queries
- Voyage Rerank-2: 32k context, nangungunang antas sa MTEB Reranking, $0.5/1k queries
- Jina Reranker v2: OSS-leaning option, isang hakbang sa likod ng Cohere para sa Japanese performance
- BGE-Reranker-v2-m3: MIT license OSS, first choice para sa self-hosted operations
```python import cohere
co = cohere.Client() results = co.rerank( model="rerank-3", query="Mga kinakailangan ng cross-border transfer sa ilalim ng data protection law", documents=[d.text for d in top50], top_n=10, ) reranked = [top50[r.index] for r in results.results] ```
Ang epekto ng reranker ay dramatic — sa average ng KGA, ang nDCG@10 ay tumalon mula 0.65 → 0.82. Ngunit ang latency ay nagdadagdag ng +200–400ms para sa top 50, kaya para sa search UX, kailangan ng async design o design na nagbabalik ng mabilis na response sa first-stage lamang.
Layer 3: Query Rewriting (HyDE, Query2Doc, Multi-Query)
Ang queries ng user ay madalas na maikli at malabo ("cancellation of contract," "memory utilization"). Ang technique ng pagpapalawak ng query gamit ang LLM bago hanapin ay naka-embed na sa Retrieval design ng 2026.
- HyDE (Hypothetical Document Embeddings): Pinagagawa ang LLM na sumulat ng hypothetical answer document at ginagamit ang embedding nito bilang search key
- Query2Doc: Pinagsasama ang query at pseudo-document para makuha ang embedding (variant ng HyDE, mas stable sa maraming kaso)
- Multi-Query: Pinapagawa ang LLM na mag-generate ng 3–5 iba't ibang paraphrase ng parehong intent, parallel search, at RRF fusion
```python def hyde_search(query: str, vector_db, llm): hypothetical = llm.generate( f"Sumulat ng tatlong pangungusap na kathang-isip na sagot sa sumusunod na tanong: {query}" ) combined = query + " " + hypothetical # Query2Doc-ize embed = embedding_model.encode(combined) return vector_db.search(embed, k=50) ```
Ang Multi-Query ang pinaka-cost-effective — sa internal FAQ RAG ng KGA, ang Recall@20 ay bumuti ng 12% kumpara sa single query search. Ang cost ay isang karagdagang LLM call bawat query, ngunit kapag pinatakas gamit ang Claude Haiku / GPT-4.1-mini, wala pang 0.1 yen.
Layer 4: Chunking Strategy
Ang RAG na "1000 character split" lamang ang ginagamit ay lipas na sa panahon sa 2026. Ang chunking method ay direktang nagtatakda ng Retrieval quality.
- Fixed-size: Classic N-character split. Overlap ay 10–20%
- Recursive Character Splitting: Recursive splitting sa paragraph → sentence → word order. Default ng LangChain `RecursiveCharacterTextSplitter`
- Semantic Chunking: Mag-embed ng consecutive sentences at magputol sa mga lugar kung saan biglang nagbabago ang cosine similarity. Gumagawa ng semantically cohesive chunks
- Late Chunking (Jina 2024/2025): Pinapatunog muna ang buong text sa embedding model, kinukuha ang per-token embeddings, pagkatapos ay ina-average ang mga ito para gumawa ng chunks. Dahil pinapanatili ng chunks ang surrounding context, hindi nawawala ang mga pronoun at anaphora
- Hierarchical / Parent-Child: Nagha-hanap gamit ang maliliit na chunks at nagpapasa ng parent chunks para sa generation. Pinagsasama ang accuracy at context volume
Halimbawa ng Late Chunking implementation:
```python from transformers import AutoModel, AutoTokenizer import torch
model = AutoModel.from_pretrained("jinaai/jina-embeddings-v3", trust_remote_code=True) tokenizer = AutoTokenizer.from_pretrained("jinaai/jina-embeddings-v3")
def late_chunking(long_text: str, chunk_boundaries: list[tuple[int, int]]): inputs = tokenizer(long_text, return_tensors="pt", truncation=True, max_length=8192) with torch.no_grad(): token_embeds = model(**inputs).last_hidden_state[0] chunk_embeds = [] for start, end in chunk_boundaries: chunk_embeds.append(token_embeds[start:end].mean(dim=0)) return torch.stack(chunk_embeds) ```
Nang isinulit ng KGA ang Late Chunking sa contract RAG, ang Recall@10 para sa mga dokumentong may maraming cross-references tulad ng "tulad ng nakatakda sa Artikulo 3" ay bumuti mula 71% → 88%.
Layer 5: Evaluation Metrics at Offline Evaluation
Ang Retrieval ay hindi maaaring masuri sa "gumagana" lamang. Kinakailangan ang quantitative metrics at regression tests.
- Recall@k: Proporsyon ng mga tamang dokumento na kasama sa top k. Pinaka-mahalagang metric na nagtatakda ng upper limit ng RAG
- nDCG@10 (Normalized Discounted Cumulative Gain): Isinasaalang-alang pati na rin ang kalidad ng ranking. De facto sa commercial search
- MRR (Mean Reciprocal Rank): Average reciprocal ng rank hanggang sa unang tamang sagot. Malapit sa user perception
- Hit Rate@k: Binary na "may tamang sagot ba sa top k"
Gumawa ng evaluation set na minimum 100 queries, ideally 500 queries. Itago ang mga pares ng query at correct document ID bilang CSV at mag-run ng regression tests sa CI.
```python import numpy as np
def ndcg_at_k(ranked_ids: list[str], relevance: dict[str, int], k: int = 10) -> float: gains = [relevance.get(doc_id, 0) for doc_id in ranked_ids[:k]] dcg = sum((2 g - 1) / np.log2(idx + 2) for idx, g in enumerate(gains)) ideal_gains = sorted(relevance.values(), reverse=True)[:k] idcg = sum((2 g - 1) / np.log2(idx + 2) for idx, g in enumerate(ideal_gains)) return dcg / idcg if idcg > 0 else 0.0 ```
Dahil nino-normalize ng mga frameworks tulad ng LlamaIndex `RetrieverEvaluator`, RAGAS, at Trulens ang mga kalkulasyong ito, mas mabuti na mag-install muna ng RAGAS kaysa gumawa ng sarili — ito ang standard practice ng 2026.
Production Reference Configuration
Ang standard configuration ng production RAG na iminumungkahi ng KGA sa 2026 ay ganito:
- Ingest: Documents → Late Chunking (Jina v3) → parent/child storage
- Index: I-store ang parehong dense + sparse sa pgvector o Qdrant
- Query: Multi-Query (gumawa ng 3 variations gamit ang LLM)
- First-stage: Hybrid BM25 + Dense → RRF fusion para sa top 100
- Second-stage: Compress sa top 10 gamit ang Cohere Rerank-3
- Generation: Ipasa ang top 10 sa Claude Opus 4.7 para sa final answer
- Eval: Weekly CI run ng regression test sa 500 queries, i-block ang mga bumaba sa ibaba ng nDCG@10 / MRR / Recall@20 threshold
Kapag maingat na naitayo ang configuration na ito, ang karanasan ng "nagiging mas matalino ang RAG nang hindi binabago ang LLM" ay aktwal na makikita. Ang Retrieval ang puso ng RAG, at ang pinaka-priority na layer ng project investment sa 2026.