Divisão em Chunks e Ingestão
A ingestão transforma documentos brutos em chunks pesquisáveis com embeddings. O tamanho do chunk, a sobreposição e os metadados afetam diretamente a qualidade da recuperação RAG.
Busque em todas as páginas da documentação
A ingestão transforma documentos brutos em chunks pesquisáveis com embeddings. O tamanho do chunk, a sobreposição e os metadados afetam diretamente a qualidade da recuperação RAG.
from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = splitter.split_documents(documents)Quando usar isso: indexar PDFs, wikis, repositórios de código ou qualquer corpus de documentos para RAG.
"""chunking_ingestion.py - limpa, divide em chunks, embuti e indexa documentos."""
from __future__ import annotations
import re
import chromadb
from openai import OpenAI
client = OpenAI()
RAW_DOCS = [
{"id": "doc1", "source": "handbook", "text": "# Testes em Python\n\nUse pytest para testes unitários. " * 20},
{"id": "doc2", "source": "handbook", "text": "# FastAPI\n\nConstrua APIs com type hints. " * 20},
]
def clean_text(text: str) -> str:
text = re.sub(r"\s+", " ", text).strip()
return text
def chunk_text(text: str, size: int = 400, overlap: int = 80) -> list[str]:
chunks = []
start = 0
while start < len(text):
chunks.append(text[start:start + size])
start += size - overlap
return chunks
chroma = chromadb.Client()
collection = chroma.get_or_create_collection("handbook")
for doc in RAW_DOCS:
cleaned = clean_text(doc["text"])
for i, chunk in enumerate(chunk_text(cleaned)):
chunk_id = f"{doc['id']}_chunk_{i}"
emb = client.embeddings.create(model="text-embedding-3-small", input=[chunk])
collection.add(
ids=[chunk_id],
documents=[chunk],
embeddings=[emb.data[0].embedding],
metadatas=[{"source": doc["source"], "doc_id": doc["id"], "chunk_index": i}],
)
print(f"indexou {collection.count()} chunks")O que isso demonstra: limpeza de texto, divisão em chunks de tamanho fixo com sobreposição, metadados por chunk e embedding no momento da ingestão.
| Tipo de Conteúdo | Tamanho do Chunk | Sobreposição |
|---|---|---|
| Prosa técnica | 500-1000 caracteres | 10-20% |
| Código | Nível de função/classe | Mínimo |
| Jurídico/contratos | 200-500 tokens | 20% |
| Logs de chat | Turno completo ou parágrafo | 0-10% |
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Chunks de tamanho fixo | Prosa geral | Documentos estruturados com seções claras |
| Divisor recursivo | Conteúdo misto | Código com limites rígidos |
| Chunking semântico | Comprimentos de seção variáveis | Documentos simples e uniformes |
| Chunks pai-filho | Precisa de precisão e contexto | Corpora pequenos |
pymupdf ou pdfplumber.#, ##) para seções semânticas.Versões da Stack: Esta página foi escrita para Python 3.14.0 (3.14 estável, 3.13 em manutenção), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ e uv 0.6+.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026