RAG ingestion/chunking
Você construirá uma coleção de trechos a partir de política estruturada, comparando decisões de segmentação. Antes do código, tente definir quais frases precisam aparecer juntas para sustentar uma resposta correta. A avaliação será baseada em perguntas concretas.
Use texto fictício primeiro. Se acrescentar PDF ou HTML real, preserve o original e compare a extração visualmente. Execute loaders apenas com versões e dependências documentadas. O exemplo local demonstra estrutura, não processamento externo.
JavaScriptRAGAo terminar esta aula
- Ingestão determina o que pode ser recuperado.
- Chunking equilibra precisão e contexto.
- Origem e versão acompanham cada trecho.
Antes de continuar: Leitura: RAG ingestion/chunking
Inspecionar original e definir perguntas
FundamentosCrie política com título, regra, exceção e tabela de estados. Escreva perguntas que dependam de cada elemento. Marque a evidência mínima antes de segmentar. Tente responder usando uma cópia sem a exceção para perceber o erro que o pipeline produziria. Essa atividade retoma groundedness: uma resposta pode ser fiel ao texto extraído e ainda incorreta porque a extração perdeu parte do original. Registre critérios de parsing e mantenha referência ao documento para verificar números e relações de tabela.
Comparar segmentações
FundamentosImplemente uma divisão simples por tamanho como controle e a divisão por seção do exemplo. Observe onde regra e exceção ficam em cada opção. Acrescente um título longo e uma tabela para testar fronteiras. Se usar overlap, registre conteúdo repetido e estime volume duplicado. Não escolha a opção com mais trechos por presumir granularidade melhor. Compare a evidência recuperável e o contexto necessário para interpretar. A decisão deve incluir orçamento do gerador e limite do embedding, cuja contagem exata depende do modelo escolhido.
Construir metadata e vínculo pai
FundamentosExecute o exemplo e acrescente origem, ordem e identificador de versão ao parentId. Teste um vínculo inexistente e outro de versão antiga; ambos precisam de diagnóstico. Implemente expansão que confira escopo antes de devolver a seção. Em atualização, remova ou invalide filhos antigos de forma coerente com o pai. Retome idempotência da ingestão: repetir o mesmo lote não deve criar cópias indefinidas. O armazenamento local pode usar Map para o exercício, mas o relatório precisa indicar as garantias que um banco real deve oferecer.
Avaliar ponta a ponta
FundamentosPara cada pergunta, anote trechos esperados e contexto devolvido. Avalie regra, exceção e tabela separadamente. Quando o resultado falhar, percorra original, parsing, chunking e relacionamento antes de culpar geração. Compare custo de trecho maior com expansão por pai: o primeiro simplifica a consulta, o segundo pode oferecer precisão com contexto sob demanda. A rubrica exige evidência suficiente, origem verificável e ausência de mistura de versões. Feche com relatório de documentos aceitos, rejeitados e passos externos não executados.
Preparar citações rastreáveis
FundamentosA unidade indexada precisa permitir uma citação que o leitor possa verificar. Acrescente título, origem e localização, como seção ou página quando o formato permitir. A resposta final liga cada afirmação ao trecho correspondente, e a interface permite abrir o original autorizado. Se a extração não preserva paginação, não invente número de página; use uma referência existente. Teste uma citação cujo trecho não sustenta a frase para mostrar que presença de link não garante evidência. Mantenha relação entre trecho, pai e documento em atualização. Essa preparação sustenta o assistente RAG das próximas semanas e reduz o risco de produzir respostas convincentes com referências decorativas. A rubrica exige conteúdo fiel e caminho verificável até a fonte.
Caso adicional para diagnóstico e decisão
FundamentosAtualize a política removendo uma seção e alterando outra. Tente definir o que acontece com filhos, pais e citações antigas antes de executar a ingestão. A política de versionamento deve impedir que um filho novo expanda para um pai antigo e que um trecho removido continue recuperável como vigente. Faça uma ingestão repetida do mesmo lote e conte registros, depois uma ingestão da versão seguinte e confira vigência. A rubrica adicional exige identidade estável, ausência de duplicação e referências coerentes. Compare conservar versões históricas autorizadas com substituir fisicamente o conteúdo. A primeira ajuda auditoria, mas requer filtros e retenção; a segunda simplifica consulta atual, mas pode dificultar explicar respostas anteriores. Escolha segundo finalidade e registre como o assistente cita uma versão específica sem apresentar histórico como política atual.
↗ LangChain ParentDocumentRetriever↗ Document loader integrations
Execução, inspeção e diagnóstico
FundamentosExecute a coleção e consulte o pai. Depois remova a exceção do trecho e verifique quais perguntas deixam de ser respondíveis. Acrescente um parentId inválido para confirmar que a expansão não devolve silenciosamente um contexto vazio tratado como sucesso.
const secoes = [
{id:"s1",titulo:"Ativação",texto:"Acesso após confirmação. Exceção: análise manual pode ser necessária."},
{id:"s2",titulo:"Contato",texto:"Use o canal oficial para consultar o estado."}
];
const chunks = secoes.map((s,i)=>({id:"c"+i,parentId:s.id,
documentoId:"politica-1",versao:2,tenant:"A",
texto:s.titulo+"\n"+s.texto}));
console.log(chunks);
console.log("pai",secoes.find(s=>s.id===chunks[0].parentId));Perda no parser exige corrigir extração. Separação inadequada exige rever chunking ou expansão. Duplicatas pedem identidade e política de ingestão. Um prompt mais longo não restaura informação que nunca chegou à coleção.
Exercício aplicado
Entregue pipeline local de segmentação com metadata, relação pai e avaliação de perguntas.
- Tente definir evidências mínimas.
- Compare tamanho, estrutura e overlap.
- Valide vínculos e versões.
- Avalie perguntas e registre origem das falhas.
Abrir resolução comentada
A solução compara segmentação por tamanho com segmentação por estrutura usando perguntas sobre regra e exceção. Seleciona a opção que preserva evidência e orçamento no corpus, registrando compromissos. Parent retrieval acrescenta a seção quando um trecho curto não basta.
O relatório identifica parsing não executado e operações locais realizadas. Uma etapa real de ingestão registra origem e falhas, remove versões anteriores conforme política e verifica que a exceção sobre análise manual não desapareceu no processamento.
A resolução privilegia preservação de significado e rastreabilidade. O tamanho escolhido é justificado pelo corpus e perguntas, não por um número universal.
A implementação realiza ingestão idempotente de seções, vincula filho e pai a documento, versão e escopo e rejeita vínculo inexistente ou incompatível. A comparação por tamanho e overlap usa caracteres como unidade didática, não tokens reais. A avaliação testa a evidência mínima para regra e exceção e mostra que expansão estrutural conserva a relação. Não foram executados parsing de PDF, embeddings ou banco; esses adaptadores seguem as verificações ensinadas no corpo.
import assert from "node:assert/strict";
const pais=new Map(),filhos=new Map();
const politica={id:"politica-1",versao:2,tenant:"A",secoes:[
{id:"ativacao",texto:"Acesso após confirmação. Exceção: análise manual pode ser necessária."},
{id:"contato",texto:"Consulte o canal oficial para verificar o estado."}]};
function ingerir(documento){
for(const secao of documento.secoes){const parentId=JSON.stringify([documento.tenant,documento.id,documento.versao,secao.id]);
pais.set(parentId,{...secao,tenant:documento.tenant,documentoId:documento.id,versao:documento.versao});
filhos.set(parentId+":0",{id:parentId+":0",parentId,tenant:documento.tenant,
documentoId:documento.id,versao:documento.versao,texto:secao.texto});
}
}
function expandir(id,ctx,versao){
const filho=filhos.get(id);if(!filho)throw new Error("FILHO_AUSENTE");
if(filho.tenant!==ctx.tenant)throw new Error("SEM_PERMISSAO");
const pai=pais.get(filho.parentId);if(!pai)throw new Error("PAI_AUSENTE");
if(pai.tenant!==ctx.tenant)throw new Error("SEM_PERMISSAO");
if(pai.versao!==versao||filho.versao!==versao)throw new Error("VERSAO_INCOMPATIVEL");
return pai;
}
function porTamanho(texto,tamanho,overlap){
if(tamanho<=overlap||overlap<0)throw new Error("JANELA_INVALIDA");
const trechos=[];for(let i=0;i<texto.length;i+=tamanho-overlap)trechos.push(texto.slice(i,i+tamanho));
return trechos;
}
ingerir(politica);const quantidade=filhos.size;ingerir(politica);assert.equal(filhos.size,quantidade);
const id=[...filhos.keys()][0],pai=expandir(id,{tenant:"A"},2);
assert.ok(pai.texto.includes("Exceção"));
assert.throws(()=>expandir(id,{tenant:"B"},2),/SEM_PERMISSAO/);
assert.throws(()=>expandir(id,{tenant:"A"},1),/VERSAO_INCOMPATIVEL/);
filhos.set("quebrado",{parentId:"inexistente",tenant:"A",versao:2});
assert.throws(()=>expandir("quebrado",{tenant:"A"},2),/PAI_AUSENTE/);filhos.delete("quebrado");
const semOverlap=porTamanho(pai.texto,25,0),comOverlap=porTamanho(pai.texto,25,8);
assert.ok(comOverlap.join("").length>=semOverlap.join("").length);
// Regra e exceção ficam no mesmo pai, mesmo se uma janela pequena perde a relação.
const evidenciaMinima=["confirmação","análise manual"];
const suficiente=texto=>evidenciaMinima.every(x=>texto.includes(x));
assert.ok(suficiente(pai.texto));assert.equal(suficiente("Acesso após confirmação."),false);
const perguntas=[{id:"q1",precisa:"confirmação"},{id:"q2",precisa:"análise manual"}];
const avaliacao=perguntas.map(q=>({id:q.id,sustentada:pai.texto.includes(q.precisa),origem:pai.id}));
assert.ok(avaliacao.every(x=>x.sustentada));
console.log({status:"aprovado",trechosEstruturados:quantidade,
semOverlap:semOverlap.length,comOverlap:comOverlap.length,avaliacao});Como conferir seu resultado
- Regra e exceção permanecem recuperáveis.
- Vínculos pai respeitam versão e escopo.
- Ingestão repetida não cria duplicatas sem controle.
Aplique em um problema novo
Primeiro resolva sem consultar a resposta. Explique suas decisões e guarde a evidência. A conclusão de leitura é independente desta autoavaliação.
Confira seus pré-requisitos
- Preservar documento/versão/tenant.
- Relacionar chunk e pai.
Política B v3 tem duas seções com ids estáveis. Ingira-a duas vezes. Um filho é ligado ao pai v2 e outro a pai inexistente. Compare chunk por caracteres com a evidência de regra 20 dias/exceção 2 dias.
Conferir raciocínio e critérios de domínio
A reingestão da mesma versão conserva dois filhos, não quatro. Perguntas sobre perecíveis exigem recuperar a exceção 2 junto da regra 20.
Filho v3/pai v2 é VERSAO_INCOMPATIVEL; pai inexistente é PAI_AUSENTE. Nenhum vínculo quebrado autoriza preencher contexto por invenção.
Uma janela só com 20 não sustenta resposta sobre perecíveis; expansão estrutural que reúne 2 e20 preserva a decisão. Caracteres não são medida real de tokens.
Evidências para autoavaliação ou revisão por pares
- Idempotência da ingestão: A reingestão da mesma versão conserva dois filhos, não quatro. Perguntas sobre perecíveis exigem recuperar a exceção 2 junto da regra 20.
- Integridade pai/filho: Filho v3/pai v2 é VERSAO_INCOMPATIVEL; pai inexistente é PAI_AUSENTE. Nenhum vínculo quebrado autoriza preencher contexto por invenção.
- Evidência e unidades: Uma janela só com 20 não sustenta resposta sobre perecíveis; expansão estrutural que reúne 2 e20 preserva a decisão. Caracteres não são medida real de tokens.
Um erro frequente
Quantidade inserida prova qualidade.
Qualidade exige conteúdo íntegro e evidência recuperável.
Teste sua compreensão
Responda com suas palavras antes de abrir o comentário. Saber explicar uma decisão é parte do domínio.
1. Loader garante extração correta?
Não.
Conexão com a fonte e preservação de significado são verificações diferentes.
2. Mais overlap sempre melhora?
3. Pai recuperado pode ignorar filtro de escopo?
Não.
A autorização deve ser preservada na expansão de contexto.
Seu progresso fica salvo neste navegador. Concluir a leitura não substitui demonstrar o domínio nos exercícios.
Referências e aprofundamento
Documentação oficial e trabalhos originais. As referências registram o escopo e as limitações para você conferir o que sustentam.
- Document loader integrations
LangChain • consulta: 2026-10-06
FundamentosParsing e carga de documentos de formatos diferentes antes de indexar.
Limites: Documentação dinâmica; fixar a versão usada no laboratório e conferir compatibilidade antes de executar.
- OpenAI Retrieval
OpenAI • consulta: 2026-10-06
OpenAIIngestion, chunking/overlap, metadata/filtros, ranking e reescrita de consultas em vector stores.
Limites: Implementação gerenciada OpenAI; defaults não são melhores escolhas universais para pgvector.
- Text splitter integrations
LangChain • consulta: 2026-10-06
FundamentosDivisão de documentos em chunks por caracteres, tokens e estrutura.
Limites: Chunk size e overlap são hiperparâmetros a avaliar; parser e OCR podem precisar bibliotecas específicas.
- Qdrant Points
Qdrant • consulta: 2026-10-06
FundamentosPontos com vetores, IDs, payloads e operações de armazenamento.
Limites: Documentação dinâmica; fixar a versão usada no laboratório e conferir compatibilidade antes de executar.
- LangChain ParentDocumentRetriever
LangChain • consulta: 2026-10-06
FundamentosIndexar chunks pequenos e recuperar documentos/pais maiores para preservar contexto.
Limites: Referência do pacote langchain-classic; consulta web recusou content-type, página foi obtida por HTTP 200 e conteúdo examinado via Invoke-WebRequest.