Lesson 49 — Intermediate

Chunking Strategies

Embedding model ek poore 50-page document ko agar seedha vector bana de toh retrieval ka target itna bada ho jaata hai ki chhota sawaal bhi usme doob jaata hai. Is lesson mein hum documents ko kyun todte hain, kaunsi chunking strategy kab lagti hai, aur size-overlap-boundaries ke knobs kaise tune karte hain dekhenge.

⏱ 20 min• Intermediate• Data Ingestion & Document Processing

Documents ko split kyun karna padta hai

Kya hai?

Chunking matlab document ko chhote retrieval units mein todna — har chunk ka apna embedding, apna metadata. Chunk hi wo cheez hai jo top-k search mein aati hai aur LLM ko context ke roop mein milti hai.

Kab kaam aata hai?

Hamesha — ingestion ke baad aur embedding se pehle. Ek bada FAQ, manual ya contract ko kabhi bhi poora embed nahi karte; har section ka apna chunk banta hai.

Kahan milta hai?

Splitter functions mein (fixed, recursive, semantic), document loaders ke andar, ya RAG frameworks ke ingestion pipeline mein. Tum khud bhi 20-line splitter likh sakte ho.

# Poora doc ek chunk = retrieval target bahut bada
doc = open("policy.txt").read()
print(len(doc), "chars in ONE retrieval unit")
# -> chhote sawaal ke liye poora doc embed hota hai,
#    relevance dilute, context bhi zyada kharch
Do wajah se: (1) Har embedding model apne input ko limited length mein leta hai — usse zyada text truncate ya kabhi kabhi reject hota hai. (2) Chhota precise chunk seedhe sawaal se match karta hai — bada chunk mein se model ko khud dhoondhna padta hai, wohi toh retrieval tha.

Fixed aur recursive chunking

def fixed_chunks(text: str, size: int = 800, overlap: int = 120) -> list:
    step = size - overlap
    return [text[i:i + size] for i in range(0, len(text), step)]

# problem: beech mein sentence/paragraph aadha kat jaata hai

SEPARATORS = ["\n\n", "\n", ". ", " "]

def recursive_chunks(text, size=800, seps=None):
    seps = SEPARATORS if seps is None else seps
    if len(text) <= size:
        return [text]
    if not seps:
        return [text[:size], text[size:]]   # hard cut last resort
    head, rest = seps[0], seps[1:]
    if head not in text:
        return recursive_chunks(text, size, rest)
    out = []
    for part in text.split(head):
        out.extend(recursive_chunks(part, size, rest))
    return out
Recursive default rakho: Naye project mein recursive + paragraph-first separators se shuru karo. Fixed tab jab tumhe predictable size chahiye (billing, quotas) ya corpus plain text jaisa uniform ho.

Structural aur semantic chunking

import re

def heading_chunks(md_text: str, size: int = 1200) -> list:
    # headings ke baad todo (markdown/DOCX heading style se)
    parts = re.split(r"(?m)^#{1,3} ", md_text)
    chunks = [p.strip() for p in parts if p.strip()]
    return [c if len(c) <= size else c[:size] for c in chunks]

# semantic: adjacent sentences ka embedding similarity dekho,
# jahan meaning gap aaye wahan boundary maaro
def semantic_chunks(sents, embs, threshold=0.3):
    chunks, buf = [], [sents[0]]
    for i in range(1, len(sents)):
        if cosine(embs[i], embs[i - 1]) < threshold:
            chunks.append(" ".join(buf)); buf = []
        buf.append(sents[i])
    chunks.append(" ".join(buf))
    return chunks

Size, overlap aur boundaries

SIZE, OVERLAP = 500, 100        # rule of thumb: overlap ~10-20% of size

for s in [200, 500, 1200]:
    ch = fixed_chunks(raw, size=s, overlap=s // 5)
    print(s, "->", len(ch), "chunks")
Size guess mat karo: Ek chhota test set banao (15-20 sawaal jinke gold chunks hain) aur size/overlap ko uspe compare karo. Chhota corpus ho toh parent-child bhi chalega: chhote chunk se search karo, bada parent LLM ko bhejo.

Precise chunks vs context-rich chunks

# parent-child: chhote chunk se search, bade parent ko LLM ko bhejo
child  = {"id": "p12-c3", "text": "...", "parent_id": "p12"}
parent = {"id": "p12", "text": "poora section (bada)"}

hits = search(child_index, k=3)                        # precise match
context = [parent[h["parent_id"]] for h in hits]       # rich answer
Sweet spot: Har chunk itna bada ho ki wo akela padhne mein samajh aaye, aur itna chhota ki uski embedding ek specific idea ko represent kare. Ye do goal hamesha tension mein hain — isliye tune karna padta hai, default koi magic number nahi.

Exercise

Question: Boundary ke aas-paas context bachaane wala chhota extra hissa kya kehlata hai?

Question: Headings aur sections ke hisaab se chunk banane wali strategy ka naam? (structural / semantic)

Question: Adjacent sentences ki meaning-gap se boundary dhoondne wali chunking kya kehlata hai?

Question: Recursive chunking mein sabse pehle kaunsa separator try hota hai — paragraph, sentence ya word?

Common mistakes

Desi example: Shifting ke dabbe

Ghar shift karte ho toh saman chhote dabbon mein jaata hai — fragile alag, har dabbe pe label (metadata), aur upar se tape jo do dabbon ko jodti hai (overlap). Poora kamra ek dabbe mein daaloge toh uthana hi nahi hoga:

text
kamra (document)
  -> dabbe (chunks)     : size decide karo
  -> label (metadata)   : doc_id, heading, page
  -> tape (overlap)     : boundary wala saman bacha
  -> shelf (vector DB)  : dabbe search hote hain
Interview angle — yahan se sawaal aate hain
  • Q: Chunking kyun zaroori hai? — Embedding limits, retrieval precision, aur prompt context dono ke liye: chhota target, behtar match.
  • Q: Fixed vs recursive mein farq? — Fixed blind cut karta hai, recursive separators (paragraph/newline/sentence) se structure bachata hai.
  • Q: Chunk size badhane ke do trade-offs? — Zyada context milta hai par relevance dilute + tokens zyada; chhota ulta.
  • Q: Small-to-big retrieval kya hai? — Chhote chunk se search, uska bada parent context ke roop mein bhejna — precision aur richness dono.
Lesson complete?

Chunking clear — size, overlap aur strategy ka trade-off samajh aa gaya. Agla lesson — Embeddings Fundamentals — mein dekhenge in chunks ko vector kaise banaate hain aur model kaise choose karte hain.

Popular courses: Data Science Course in Lucknow · AI Course in Lucknow · Python Course in Lucknow · Power BI Course · Data Analytics Course