Semantic Chunking
A divisão semântica em segmentos separa documentos nos pontos em que o tema muda, medindo a semelhança entre embeddings de frases adjacentes, para que cada segmento contenha uma ideia.
O agrupamento semântico divide documentos em segmentos para geração aumentada por recuperação (RAG) e busca nos pontos em que o tópico muda, identificados pela comparação dos embeddings de frases adjacentes, em vez de dividir a cada número fixo de caracteres ou tokens. Cada segmento trata então de uma ideia, de modo que seu único vetor no banco de dados vetorial represente bem essa ideia, e um segmento recuperado forneça ao modelo de linguagem grande (LLM) um pensamento completo, em vez do fim de uma seção e do início da seguinte.
Como funciona o agrupamento semântico#
O algoritmo comum, popularizado pelos tutoriais de divisão de texto de Greg Kamradt e implementado como SemanticChunker no LangChain, tem quatro etapas. O texto é dividido em frases e cada frase, geralmente agrupada com as vizinhas para suavizar o ruído, recebe um embedding. A similaridade de cosseno entre cada par de frases consecutivas é convertida em uma distância. Um limiar marca pontos de divisão onde a distância é excepcionalmente alta: por padrão, o LangChain usa o percentil 95 de todas as distâncias do documento e também oferece limiares de desvio padrão, intervalo interquartil e gradiente. As frases entre os pontos de divisão formam um segmento. O separador semântico do LlamaIndex usa o mesmo ponto de divisão baseado em percentil.
import numpy as np
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
sentences = [
"The XR-12 coolant pump circulates water through the press line.",
"Inspect the XR-12 pump seals for leaks every week.",
"A worn pump bearing grinds loudly before it fails.",
"The staff cafeteria now opens for breakfast at 7:00.",
"The cafeteria menu adds vegetarian lunches in May.",
]
# Distância de cosseno entre cada frase e a seguinte
embeddings = model.encode(sentences, normalize_embeddings=True)
distances = 1 - np.sum(embeddings[:-1] * embeddings[1:], axis=1)
# Iniciar um novo segmento quando a distância ultrapassar o percentil 95
threshold = np.percentile(distances, 95)
chunks = [[sentences[0]]]
for sentence, distance in zip(sentences[1:], distances):
if distance > threshold:
chunks.append([])
chunks[-1].append(sentence)
print(np.round(distances, 2))
print(*[" ".join(chunk) for chunk in chunks], sep="\n")As distâncias entre frases vizinhas são 0,56, 0,64, 0,98 e 0,62; assim, o único ponto de divisão ocorre no salto de 0,98, entre o rolamento da bomba e a cafeteria, e a saída é um segmento de três frases sobre a bomba XR-12 e outro de duas frases sobre a cafeteria.
Comparação de estratégias de agrupamento#
- Agrupamento de tamanho fixo: Divide a cada N tokens, normalmente com alguma sobreposição entre segmentos vizinhos. É rápido e previsível, mas ignora os limites entre tópicos.
- Divisão recursiva: Divide nas quebras de parágrafo, depois nas quebras de linha e, em seguida, nas frases, até que cada parte caiba em um limite de tamanho. O LangChain recomenda seu divisor recursivo de caracteres para textos genéricos.
- Divisão sensível à estrutura: Segue títulos, seções Markdown, elementos HTML ou o layout de página de um PDF.
- Agrupamento semântico: Segue as mudanças de significado, mas exige criar embeddings de cada frase durante a indexação e produz segmentos de tamanhos muito variados; por isso, as implementações acrescentam comprimentos mínimo e máximo.
- Agrupamento tardio e recuperação contextual: Resolvem o problema de um segmento sem contexto do restante do documento, como um pronome cujo referente está em um segmento anterior, e podem ser combinados com qualquer um dos métodos de delimitação acima.
O agrupamento de ações em robótica só compartilha o nome: nesse caso, uma política prevê uma sequência de comandos motores futuros como uma unidade.
Agrupamento semântico além do texto#
As transcrições de sistemas de fala para texto não têm quebras de parágrafo; por isso, os pontos de divisão baseados em embeddings são uma forma comum de detectar quando uma reunião ou podcast muda de assunto. Também é possível agrupar vídeos por conteúdo, de modo que cada clipe mostre um evento para compreensão de vídeo ou RAG multimodal, em vez de um trecho arbitrário de 10 segundos. O Ultralytics YOLO26 fornece esses limites para cenas com pessoas e veículos: o modo de rastreamento atribui a cada objeto detectado um ID persistente entre quadros, permitindo que um pipeline abra um clipe quando um novo ID entra na cena e o feche quando todos os IDs rastreados saem.
O agrupamento semântico melhora a recuperação?#
Os limites baseados em tópicos são mais importantes quando assuntos não relacionados aparecem lado a lado sem títulos, como em transcrições, páginas da web extraídas e notas concatenadas. Os segmentos semânticos também dependem do modelo de embedding e do limiar; por isso, o mesmo documento é segmentado de outra forma se qualquer um deles mudar, e ambos devem ser ajustados com base na revocação em consultas reais. O estudo O agrupamento semântico vale o custo computacional? (2024) comparou o agrupamento semântico e o de tamanho fixo na recuperação de documentos e evidências, bem como na geração de respostas baseada em recuperação, e constatou que o custo computacional adicional do agrupamento semântico não trouxe ganhos consistentes em relação aos segmentos de tamanho fixo.










