De volta ao blog

Chunking Semântico para RAG: Construir um Pipeline de Dados da Web

Emily Chen
Emily Chen

Advanced Data Extraction Specialist

24-Sep-2026

TL;DR:

  • A segmentação semântica agrupa texto usando mudanças de significado. Ela precisa de um método de segmentação definido, um modelo de incorporação e uma regra para decidir onde um segmento termina.
  • Texto fonte limpo é parte da qualidade da recuperação. Menus de navegação e banners repetidos podem distorcer os segmentos antes que o recuperador os veja.
  • Cada segmento deve reter sua origem e posição. A proveniência torna um trecho recuperado útil para citações e diagnósticos.
  • Um divisor semântico precisa de uma comparação básica. Trabalho extra de incorporação não garante respostas melhores do que uma estratégia de divisão mais simples.
  • Livre para começar. Use o crédito da conta Scrapeless para avaliar a etapa de coleta upstream em um pequeno conjunto de documentos aprovados.

Introdução: A Recuperação Começa Antes do Armazenamento Vetorial

Um recuperador só pode retornar os trechos armazenados em seu índice. Em geração aumentada por recuperação, as evidências recuperadas formam parte da entrada de geração. Se um trecho contém metade de uma explicação ou combina uma declaração de política com texto de navegação não relacionado, o gerador de respostas recebe um contexto incompleto, mesmo quando o escore de similaridade parece forte.

A segmentação semântica muda onde esses trechos começam e terminam. Em vez de cortar apenas em um comprimento fixo, o divisor compara representações de sentenças vizinhas e cria um limite quando seus significados divergem o suficiente. Um limite de tamanho ainda é importante porque um tópico coerente pode ser mais longo do que o modelo downstream pode aceitar.

Este artigo descreve um pipeline web-para-RAG com Scrapeless como a camada de aquisição e um divisor Python transparente como a camada de transformação. Ele complementa extração estruturada com um modelo de linguagem: a extração produz campos de tarefa, enquanto a segmentação prepara trechos para recuperação posterior.

O que a Segmentação Semântica Faz

A segmentação semântica usa uma representação de significado para escolher limites de texto. Uma implementação comum divide um documento em sentenças, incorpora essas sentenças, compara vetores adjacentes e inicia um novo grupo em uma mudança suficientemente grande.

Métodos de incorporação de sentenças mapeiam o texto da sentença em vetores que podem ser comparados em termos de similaridade. O significado de um escore de similaridade depende do modelo e da entrada, portanto, um limite numérico é um parâmetro a ser avaliado em vez de uma definição universal de mudança de tópico.

Estratégia Regra de limite Ponto de partida útil Principal compromisso
Tamanho fixo Um comprimento configurado Uma linha de base simples Pode cortar uma explicação
Consciente da estrutura Títulos e quebras de parágrafo Páginas de referência organizadas Depende da estrutura limpa do documento
Semântico Mudanças na similaridade de incorporação Texto com mudanças de tópico Adiciona computação e ajuste do modelo
Híbrido Estrutura, checagens semânticas e limites Coleções de documentos mistas Mais configuração para avaliar

Títulos, tabelas, blocos de código e listas precisam de tratamento especial. Um divisor de sentenças pode danificar uma tabela ao desapegar um valor de seu rótulo de coluna. Preserve essas unidades durante a pré-processamento ou envie-as para um caminho consciente da estrutura.

Pipeline em Um Olhar

O pipeline converte um documento da web capturado em trechos indexados que mantêm sua origem. Suas etapas são aquisição → normalização de texto → segmentação de sentenças → incorporação → formação de segmentos → avaliação de recuperação.

Desbloqueador Web Scrapeless lida com a solicitação alvo. Seu aplicativo limpa o conteúdo retornado, gera incorporações através de um modelo selecionado e armazena os trechos resultantes. A aquisição web não cria em si um índice vetorial nem escolhe a estratégia de segmentação correta.

Salve a resposta original antes da transformação. Mantenha a URL solicitada, qualquer URL canônica estabelecida, hora de coleta, título da página e um hash do texto normalizado. Uma URL canônica deve vir de evidências de origem; não a fabrique deletando segmentos de caminho.

Pré-requisitos

Você precisa de um conjunto aprovado de páginas-fonte públicas, uma chave de API Scrapeless para aquisição, Python para processamento e um modelo de incorporação que você possa executar localmente ou através do seu fornecedor escolhido. O fornecedor ou modelo determina a configuração de incorporação e os requisitos de acesso.

O divisor deste tutorial consome um sentences.json arquivo com uma string source_url, uma lista ordenada sentences e uma lista embeddings contendo um vetor numérico por sentença. Não se assume um modelo hospedado particular ou dimensão vetorial. O mesmo modelo deve ser usado para cada sentença em uma execução.
A aquisição de página autenticada e a geração de incorporação são pré-requisitos que não foram executados de ponta a ponta para este exemplo. O divisor pode ser verificado de forma independente, mas as verificações de algoritmo local não estabelecem qualidade de recuperação ou integração de modelo bem-sucedida.

Etapa 1: Captura e Limpeza do Documento Fonte

Um documento útil começa com o conteúdo da página pretendido em vez de uma página de desafio, formulário de login ou estrutura de navegação. Adquira a página através da interface de solicitação Web Unlocker e verifique se o conteúdo esperado está presente antes de extrair o texto.

Para cada página aceita, remova scripts, estilos, navegação repetida e blocos promocionais não relacionados. Preserve títulos e limites de parágrafo. Se a página for renderizada dinamicamente, use a configuração de renderização documentada e verifique se o conteúdo retornado inclui o texto relevante.

Armazene o conteúdo bruto e normalizado separadamente. Isso torna possível diagnosticar se um trecho recuperado ruim veio da coleta, limpeza, segmentação ou do modelo de incorporação. Os relacionamentos de proveniência entre os dados fonte e derivados são úteis aqui: o fragmento é derivado de uma versão específica do documento normalizado.

Não combine silenciosamente o corpo de uma página com um título ou data de publicação de outra. Se um campo não estiver disponível, mantenha-o sem definir. O tempo de coleta da página e o tempo de publicação da fonte são campos de metadados diferentes.

Etapa 2: Segmentação de Frases e Geração de Incorporações Consistentes

A segmentação de frases produz as unidades de texto ordenadas que o divisor semântico irá comparar. Use um segmentador apropriado à língua e inspecione seu tratamento de abreviações, decimais, títulos e listas com marcadores em seus documentos de amostra.

Evite afirmar que uma simples divisão por ponto funciona para cada página. Um parágrafo contendo uma abreviação ou um exemplo de código pode se dividir em fragmentos enganosos. Para páginas de referência curtas, limites de títulos e parágrafos podem já fornecer estrutura suficiente sem uma passagem semântica.

Gere uma incorporação para cada frase e preserve a ordem exata. Registre o identificador do modelo, configurações de normalização e hash do texto-fonte ao lado dos vetores. Rejeite vetores ausentes, dimensões inconsistentes ou valores não finitos antes de calcular similaridades.

Uma janela de contexto em nível de parágrafo pode melhorar algumas representações de frases, mas altera o experimento. Mantenha essa configuração fixa ao comparar regras de divisão para que uma mudança de entrada de incorporação não seja erroneamente atribuída ao algoritmo de limite.

Comece a Extrair com Scrapeless

Potencialize seu fluxo de trabalho de web scraping e automação com o Scrapeless!
Inscreva-se hoje e receba $5 em crédito gratuito — sem necessidade de cartão de crédito.

Reivindique seu crédito gratuito agora no Painel do Scrapeless.

Etapa 3: Crie Fragmentos Semânticos Limitados

O divisor abaixo inicia um novo fragmento quando a similaridade de frases adjacentes cai abaixo de um limite configurado ou o orçamento de caracteres seria excedido. Salve-o como chunk_sentences.py.

Nota: Este script requer um arquivo real sentences.json gerado a partir do seu texto capturado e modelo de incorporação. A geração de incorporação continua sendo um pré-requisito; o exemplo não inclui um conjunto de vetores fabricados nem reivindica uma melhoria de recuperação medida.

python Copy
import json
import math
import os
from pathlib import Path

source = json.loads(Path("sentences.json").read_text())
sentences = source["sentences"]
vectors = source["embeddings"]
threshold = float(os.environ["SIMILARITY_THRESHOLD"])
max_chars = int(os.environ["MAX_CHUNK_CHARS"])
if not -1 <= threshold <= 1 or max_chars <= 0:
    raise ValueError("Invalid chunking configuration")
if not sentences or len(sentences) != len(vectors):
    raise ValueError("Each sentence needs one embedding")
dimension = len(vectors[0])
if not dimension:
    raise ValueError("Embeddings must not be empty")
for text, vector in zip(sentences, vectors):
    if not isinstance(text, str) or not text.strip():
        raise ValueError("Sentence text must be nonempty")
    if len(text) > max_chars:
        raise ValueError("Segment oversized sentences before chunking")
    if len(vector) != dimension or not all(math.isfinite(v) for v in vector):
        raise ValueError("Invalid embedding dimension or value")
    if sum(v * v for v in vector) == 0:
        raise ValueError("A zero vector has no cosine direction")

def cosine(a, b):
    numerator = sum(x * y for x, y in zip(a, b))
    denominator = math.sqrt(sum(x*x for x in a) * sum(y*y for y in b))
    return max(-1.0, min(1.0, numerator / denominator))

chunks, start, current = [], 0, []
for index, sentence in enumerate(sentences):
    topic_change = index > 0 and cosine(vectors[index-1], vectors[index]) < threshold
    too_long = len(" ".join(current + [sentence])) > max_chars
    if current and (topic_change or too_long):
        chunks.append({"start_sentence": start, "end_sentence": index,
                       "text": " ".join(current)})
        current, start = [], index
    current.append(sentence)
chunks.append({"start_sentence": start, "end_sentence": len(sentences),
               "text": " ".join(current)})
records = [dict(chunk, source_url=source["source_url"], chunk_index=index)
           for index, chunk in enumerate(chunks)]
Path("chunks.json").write_text(json.dumps(records, ensure_ascii=False, indent=2))
print(json.dumps({"chunk_count": len(records)}))

O intervalo de frases usa um início inclusivo e um fim exclusivo. Essa convenção torna possível reconstruir exatamente quais frases de entrada produziram um fragmento. Entradas vazias e vetores inválidos falham explicitamente em vez de produzir um índice aparentemente bem-sucedido e vazio.

O limite de tamanho aqui conta caracteres. Não é um limite de token. Se seu sistema de incorporação ou geração tiver um orçamento de tokens, meça os tokens com o tokenizador desse sistema antes de enviar o texto. O código rejeita uma frase grande demais para que o segmentador anterior possa lidar com ela deliberadamente.

Esta implementação é intencionalmente simples: ela compara vetores de frases vizinhas. Não implementa agrupamento em partes distantes de um documento, limites percentuais adaptativos ou um classificador de limites treinado. Esses são abordagens separadas que precisam de sua própria avaliação.

Etapa 4: Indexe Trechos Sem Perder Sua Fonte

A indexação deve preservar metadados suficientes para reconectar um fragmento recuperado ao seu documento fonte. Armazene o texto do fragmento, URL da fonte, hash do texto, índice do fragmento, faixa de frases, tempo de coleta e identificador do modelo de incorporação.
Crie incorporações de chunk a partir do texto final do chunk se essa for a representação que seu recuperador utiliza. Fazer a média das incorporações de sentenças é uma escolha de design diferente; não presuma que isso produz a mesma classificação de recuperação que incorporar a passagem montada.

Quando um documento de origem muda, mantenha as versões antiga e nova distinguíveis. Reutilizar o mesmo identificador de chunk enquanto altera o texto subjacente pode tornar as citações armazenadas ambíguas. Uma chave de versão baseada no hash de origem normalizado ajuda a separar as observações.

Um armazenamento vetorial é apenas um possível índice. Uma pequena avaliação pode recuperar passagens na memória. Comece com o arranjo mais simples que permita inspecionar o texto retornado para cada pergunta.

Etapa 5: Compare a Recuperação, Não Apenas a Aparência do Chunk

O particionamento semântico deve ser avaliado com base nas perguntas que a aplicação precisa responder. Um conjunto visualmente organizado de passagens não prova que o recuperador retornará a evidência correta.

Construa um pequeno conjunto de perguntas com passagens de suporte marcadas nos documentos originais. Execute uma linha de base de tamanho fixo, uma linha de base ciente da estrutura e o divisor semântico contra o mesmo conteúdo normalizado. Mantenha o modelo de incorporação, as configurações de recuperação e a avaliação da resposta constantes.

Medida Pergunta que responde
Recuperação de passagem de suporte A evidência necessária foi recuperada?
Texto recuperado não relacionado Quanto contexto foi desperdiçado?
Suporte à resposta A resposta gerada segue a evidência?
Tempo de processamento Quanto custou a segmentação e a incorporação operacionalmente?
Volume de entrada Quanto texto chegou a cada etapa do modelo?

A pesquisa sobre compensações computacionais do particionamento semântico apoia o tratamento do método como uma escolha empírica. O trabalho extra não produz consistentemente uma melhoria em todas as tarefas e conjuntos de dados.

Inspecione as falhas por estágio. A falta de evidência na captura bruta é um problema de aquisição. Parágrafos quebrados são um problema de limpeza. Uma passagem relevante classificada abaixo de passagens irrelevantes pode apontar para a configuração de incorporação ou recuperação. Esses problemas requerem mudanças diferentes.

Acompanhe o componente de aquisição separadamente através da precificação Scrapeless. Os custos de incorporação e indexação pertencem à pilha a jusante; não devem ser reportados como uso do Web Unlocker.

Conclusão: Escolha o Divisor que Recupera Melhores Evidências

O particionamento semântico é útil quando o significado muda dentro dos documentos de maneiras que fronteiras mais simples falham em capturar. O fluxo de trabalho prático é preservar o texto de origem limpo, produzir incorporações consistentes, impor limites de passagem e comparar a recuperação contra alternativas mais simples.

Mantenha os metadados de origem anexados ao longo de todo o processo. Uma passagem recuperada torna-se muito mais útil quando a aplicação pode mostrar de onde veio e qual versão do documento representa.

Pronto para Construir Seu Pipeline de Dados da Web?

Junte-se a desenvolvedores que trabalham na coleta de dados da web no Discord e Telegram.

Crie uma conta Scrapeless e adapte o fluxo de trabalho para suas próprias fontes de dados aprovadas.

FAQ

Q: O particionamento semântico é sempre melhor do que o particionamento de tamanho fixo?

Não. Seu benefício depende dos documentos, do modelo de incorporação, das configurações de recuperação e da tarefa. Compare estratégias em um conjunto de avaliação compartilhado antes de escolher uma.

Q: O Scrapeless gera as incorporações neste fluxo de trabalho?

Não. O Scrapeless fornece a etapa de acesso à web upstream. Seu modelo de incorporação e índice selecionados lidam com a representação e recuperação a jusante.

Q: Como as tabelas e blocos de código devem ser particionados?

Preserve sua estrutura ou direcione-os através de um divisor ciente da estrutura dedicado. Somente os limites de sentença podem desconectar valores de cabeçalhos ou quebrar o contexto do código.

Q: E se uma página adquirida contiver um desafio ou HTML diferente?

Rejeite o conteúdo que não atende ao contrato de origem e inspecione a fase de aquisição ou parser. A similaridade semântica não pode reparar um documento de origem incorreto.

Q: A coleta precisa de um proxy separado?

Use as opções de roteamento de sua solicitação Web Unlocker escolhida. Não inferir requisitos de proxy a partir do algoritmo de particionamento, que roda após a coleta.

Q: O pipeline pode funcionar sem um agente de IA?

Sim. Uma aplicação pode adquirir documentos e executar o particionamento baseado em incorporação sem um agente autônomo. Um modelo de incorporação ainda é necessário para a comparação semântica.

Q: Quais limites devem ser aplicados à coleta de fontes paralelas?
Comece com uma coleção delimitada, como não mais do que três trabalhadores por host, e respeite limites de alvo e conta mais rigorosos. Lotes de incorporação têm limites específicos para cada modelo.

P: Alguma página pública pode ser adicionada a um índice RAG?

A disponibilidade pública sozinha não estabelece permissão para toda coleção ou reutilização. Revise os termos de origem, direitos aplicáveis e o tratamento de dados pretendido antes da ingestão.

Na Scorretless, acessamos apenas dados disponíveis ao público, enquanto cumprem estritamente as leis, regulamentos e políticas de privacidade do site aplicáveis. O conteúdo deste blog é apenas para fins de demonstração e não envolve atividades ilegais ou infratoras. Não temos garantias e negamos toda a responsabilidade pelo uso de informações deste blog ou links de terceiros. Antes de se envolver em qualquer atividade de raspagem, consulte seu consultor jurídico e revise os termos de serviço do site de destino ou obtenha as permissões necessárias.

Artigos mais populares

Catálogo