Fragmentación e Ingesta
La ingesta transforma documentos sin procesar en fragmentos buscables con embeddings. El tamaño del fragmento, la superposición y los metadatos afectan directamente la calidad de la recuperación de RAG.
Busca en todas las páginas de la documentación
La ingesta transforma documentos sin procesar en fragmentos buscables con embeddings. El tamaño del fragmento, la superposición y los metadatos afectan directamente la calidad de la recuperación de RAG.
from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = splitter.split_documents(documents)Cuándo usar esto: para indexar PDFs, wikis, repositorios de código o cualquier corpus de documentos para RAG.
"""chunking_ingestion.py - limpiar, fragmentar, incrustar e indexar documentos."""
from __future__ import annotations
import re
import chromadb
from openai import OpenAI
client = OpenAI()
RAW_DOCS = [
{"id": "doc1", "source": "handbook", "text": "# Pruebas con Python\n\nUsa pytest para pruebas unitarias. " * 20},
{"id": "doc2", "source": "handbook", "text": "# FastAPI\n\nCrea APIs con 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"indexados {collection.count()} fragmentos")Lo que esto demuestra: limpieza de texto, fragmentación de tamaño fijo con superposición, metadatos por fragmento y embedding en el momento de la ingesta.
| Tipo de Contenido | Tamaño del Fragmento | Superposición |
|---|---|---|
| Prosa técnica | 500-1000 caracteres | 10-20% |
| Código | Nivel de función/clase | Mínimo |
| Legal/contratos | 200-500 tokens | 20% |
| Registros de chat | Turno completo o párrafo | 0-10% |
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Fragmentos de tamaño fijo | Prosa general | Documentos estructurados con secciones claras |
| Divisor recursivo | Contenido mixto | Código con límites estrictos |
| Fragmentación semántica | Longitudes de sección variables | Documentos simples y uniformes |
| Fragmentos padre-hijo | Necesidad de precisión y contexto | Corpora pequeños |
pymupdf o pdfplumber.doc_id; re-ingestar secciones modificadas.#, ##) para secciones semánticas.doc_id, título, página, sección, created_at, content_hash.Versiones de la pila: Esta página se escribió para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ y uv 0.6+.
Revisado por Chris St. John·Última actualización: 19 jul 2026