Pular para o conteúdo principal

AI ContextRetrievalChunker

Utilitário de divisão de texto em blocos (chunks) para recuperação de contexto em pipelines RAG (Retrieval-Augmented Generation).

Divide documentos Markdown, texto simples ou texto extraído de PDF em blocos de tamanho controlado, com sobreposição configurável, preservando a estrutura do documento para melhor qualidade de recuperação semântica.

Características principais:

  • Segmentação estrutural: cabeçalhos, parágrafos, blocos de código, tabelas, listas e citações são reconhecidos e nunca partidos ao acaso
  • Contexto hierárquico: cada bloco recebe a árvore completa de cabeçalhos (# Guia > ## Instalação > ### Windows)
  • Orçamento em caracteres ou em tokens reais (BPE cl100k_base / o200k_base)
  • Blocos de código maiores que o limite são partidos por linhas com a marcação reaberta em cada parte
  • Tabelas maiores que o limite repetem o cabeçalho em cada parte
  • Sobreposição semântica por frases, nunca a meio de uma palavra
  • Sem perda de texto: todos os blocos do documento pertencem exatamente a um chunk
  • Determinístico: a mesma entrada produz sempre os mesmos chunks e os mesmos id, o que permite reingestão idempotente
// Exemplo básico
const chunker = _ai.contextRetrievalChunker()
const chunks = chunker.markdown(documentoMD)

for (const chunk of chunks.listOfValues()) {
_log.info(`Chunk ${chunk.getInt('index')}: ${chunk.getString('breadcrumb')}`)
_log.info(`Texto: ${chunk.getString('text')}`)
}

// Orçamento em tokens reais e ingestão no vector store
const client = _ai.client()
const vector = _ai.vector('default')

const blocos = _ai.contextRetrievalChunker()
.unit('tokens')
.chunkSize(320)
.overlap(48)
.source('manual-v1')
.markdown(documentoMD)

for (const bloco of blocos.listOfValues()) {
const resposta = client.embeddings('embeddinggemma:latest', bloco.getString('text'))
const embedding = resposta.getValues('data').getValues(0).getValues('embedding')
vector.add('netuno', bloco.getString('id'), embedding, bloco.getString('text'), bloco.getValues('metadata'))
}


chunk


chunk(conteudo: string) : Values

Descrição

Divide um documento em blocos, detetando automaticamente se o conteúdo é Markdown ou texto corrido. É o ponto de entrada a usar quando a origem do conteúdo não é conhecida à partida.

Como Usar
const chunks = chunker.chunk(conteudo)

for (const chunk of chunks.listOfValues()) {
_log.info(chunk.getString('text'))
}
Atributos
NOMETIPODESCRIÇÃO
conteudostringTexto a dividir em blocos.
Retorno

( Values )

Lista de blocos. Ver a descrição dos campos em markdown.


chunk(content: string, chunkSize: int, overlap: int) : Values

Atributos
NOMETIPODESCRIÇÃO
contentstring
chunkSizeint
overlapint
Retorno

( Values )


chunk(conteudo: string, opcoes: Values) : Values

Descrição

Divide um documento em blocos com opções, detetando automaticamente se o conteúdo é Markdown ou texto corrido.

Como Usar
const chunks = chunker.chunk(conteudo, _val.map()
.set('unit', 'tokens')
.set('chunkSize', 320)
.set('overlap', 48))
Atributos
NOMETIPODESCRIÇÃO
conteudostringTexto a dividir em blocos.
opcoesValuesOpções que sobrepõem a configuração da instância. Ver a lista completa em markdown.
Retorno

( Values )

Lista de blocos. Ver a descrição dos campos em markdown.


chunkSize


chunkSize(tamanhoDoBloco: int) : ContextRetrievalChunker

Descrição

Define o tamanho máximo de cada bloco, na unidade escolhida em unit. Valor predefinido: 1024 caracteres, ou 256 quando a unidade é tokens e o tamanho não foi definido explicitamente.

Como Usar
const chunks = chunker.chunkSize(1500).markdown(documento)
Atributos
NOMETIPODESCRIÇÃO
tamanhoDoBlocointTamanho máximo de cada bloco, limitado a [32, 200000].
Retorno

( ContextRetrievalChunker )

A própria instância, para encadear configurações.


contextualize


contextualize(cliente: Client, documento: string, blocos: Values) : Values

Descrição

Preenche o campo context de cada bloco com uma nota de recuperação, gerada pelo modelo a partir do documento completo, e reconstrói o campo text com essa nota incluída. É a técnica de contextual retrieval: um bloco que diz apenas "o valor subiu 3%" passa a dizer também de que empresa e de que trimestre se trata, o que reduz muito as falhas de recuperação.

A nota tem duas partes, porque uma pesquisa chega em duas formas. Duas ou três frases situam o bloco nomeando o produto, a tarefa e as condições que o bloco dá como garantidas, para responder a quem descreve o problema por palavras suas. A seguir, uma linha de termos reúne o vocabulário exato: nomes, identificadores, chaves de configuração, comandos, códigos de erro, siglas com o respetivo significado, sinónimos e, em documentos que não estejam em inglês, o termo inglês ao lado do original. É isto que encontra quem cola uma mensagem de erro ou o nome de um parâmetro.

É uma operação paga: faz uma chamada ao modelo por bloco. Correr apenas na fase de ingestão, nunca por pedido.

As chamadas são sequenciais de propósito, porque o Client mantém estado de sessão e de contabilização de tokens que não é seguro partilhar entre chamadas em paralelo. Um erro num bloco não interrompe os restantes: fica registado no log, o context desse bloco fica vazio e o processamento continua.

Opções aceites: model, temperature (0 por omissão, para o resultado ser reproduzível), documentMaxChars (trunca documentos muito grandes), template (marcadores {document}, {chunk}, {breadcrumb} e {heading}), system (mensagem de sistema), skipIfPresent (não repete blocos que já tenham contexto) e failFast.

Como Usar
const client = _ai.client()
const chunks = chunker.markdown(documento)

chunker.contextualize(client, documento, chunks)

for (const chunk of chunks.listOfValues()) {
_log.info(chunk.getString('context'))
// text já inclui o contexto, é o que se deve embeber
}
Atributos
NOMETIPODESCRIÇÃO
clienteClientCliente de IA usado para gerar o contexto.
documentostringDocumento completo, o mesmo que originou os blocos.
blocosValuesLista de blocos devolvida por markdown, text, pdf ou chunk.
Retorno

( Values )

A mesma lista de blocos, com context e text atualizados.


contextualize(cliente: Client, documento: string, blocos: Values, opcoes: Values) : Values

Descrição

Preenche o campo context de cada bloco com opções. Ver a descrição completa e a lista de opções em contextualize.

Como Usar
chunker.contextualize(client, documento, chunks, _val.map()
.set('model', 'gpt-4o-mini')
.set('documentMaxChars', 40000))
Atributos
NOMETIPODESCRIÇÃO
clienteClientCliente de IA usado para gerar o contexto.
documentostringDocumento completo, o mesmo que originou os blocos.
blocosValuesLista de blocos devolvida por markdown, text, pdf ou chunk.
opcoesValuesOpções da geração de contexto.
Retorno

( Values )

A mesma lista de blocos, com context e text atualizados.


countTokens


countTokens(texto: string) : int

Descrição

Conta os tokens de um texto com a codificação configurada em encoding, usando o mesmo algoritmo BPE dos modelos. Útil para orçamentar prompts e para verificar que um bloco cabe no limite do modelo de embeddings.

Como Usar
_log.info('Tokens: '+ chunker.countTokens(texto))
Atributos
NOMETIPODESCRIÇÃO
textostringTexto a medir.
Retorno

( int )

Número de tokens do texto.


countTokens(texto: string, codificacao: string) : int

Descrição

Conta os tokens de um texto com uma codificação específica, ou com a codificação deduzida do nome de um modelo.

Atributos
NOMETIPODESCRIÇÃO
textostringTexto a medir.
codificacaostringNome da codificação, como cl100k_base ou o200k_base, ou nome de um modelo.
Retorno

( int )

Número de tokens do texto.


embed


embed(embeber: string) : ContextRetrievalChunker

Descrição

Define o que entra no campo text, que é sempre a cadeia destinada a ser embebida. O campo content mantém sempre o bloco real e é o que uma pesquisa deve devolver.

  • full, predefinido: cabeçalho de contexto, contexto gerado e corpo do bloco
  • context: apenas cabeçalho e contexto gerado, deixando o corpo de fora
  • content: apenas o corpo, sem cabeçalho nem contexto

O modo context indexa a nota gerada em vez do bloco. A nota é prosa densa, enquanto o corpo traz blocos de código, canos de tabelas e marcação que diluem o vetor. Em troca, um termo exato que exista no corpo e não na nota deixa de ser pesquisável, por isso este modo só faz sentido depois de correr contextualize. Enquanto o contexto estiver vazio, o corpo é usado na mesma, para não se indexar um cabeçalho sozinho.

Como Usar
// Indexar o contexto, devolver o texto real
const chunks = chunker.embed('context').markdown(documento)
chunker.contextualize(client, documento, chunks)

for (const chunk of chunks.listOfValues()) {
const resposta = client.embeddings(modelo, chunk.getString('text'))
const embedding = resposta.getValues('data').getValues(0).getValues('embedding')
vector.add('docs', chunk.getString('id'), embedding, chunk.getString('content'), metadados)
}
Atributos
NOMETIPODESCRIÇÃO
embeberstringfull, context ou content.
Retorno

( ContextRetrievalChunker )

A própria instância, para encadear configurações.


encoding


encoding(codificacao: string) : ContextRetrievalChunker

Descrição

Define a codificação usada na contagem de tokens: cl100k_base (predefinida), o200k_base, p50k_base, r50k_base, ou o nome de um modelo OpenAI, de onde a codificação é deduzida.

Atributos
NOMETIPODESCRIÇÃO
codificacaostringNome da codificação ou do modelo.
Retorno

( ContextRetrievalChunker )

A própria instância, para encadear configurações.


getChunkSize


getChunkSize() : int

Retorno

( int )


getEmbed


getEmbed() : string

Retorno

( string )


getEncoding


getEncoding() : string

Retorno

( string )


getMetadata


getMetadata() : Values

Retorno

( Values )


getMinChunkSize


getMinChunkSize() : int

Retorno

( int )


getOverlap


getOverlap() : int

Retorno

( int )


getSource


getSource() : string

Retorno

( string )


getUnit


getUnit() : string

Retorno

( string )


headingPath


headingPath(arvoreDeCabecalhos: boolean) : ContextRetrievalChunker

Descrição

Define se o cabeçalho de contexto usa a árvore completa de cabeçalhos, ativo por omissão, ou apenas o cabeçalho mais próximo. A árvore completa dá muito melhor recuperação em documentos com secções aninhadas, porque um bloco sob ### Windows mantém também # Guia e ## Instalação.

Atributos
NOMETIPODESCRIÇÃO
arvoreDeCabecalhosbooleanUsar a árvore completa ou apenas o cabeçalho mais próximo.
Retorno

( ContextRetrievalChunker )

A própria instância, para encadear configurações.


isHeadingPath


isHeadingPath() : boolean

Retorno

( boolean )


isPrependHeading


isPrependHeading() : boolean

Retorno

( boolean )


isSplitOnHeadings


isSplitOnHeadings() : boolean

Retorno

( boolean )


isStripDataUri


isStripDataUri() : boolean

Retorno

( boolean )


isStripHtmlComments


isStripHtmlComments() : boolean

Retorno

( boolean )


markdown


markdown(markdown: string) : Values

Descrição

Divide um documento Markdown em blocos, usando a configuração da instância.

O documento é primeiro segmentado em blocos atómicos, respeitando a marcação: cabeçalhos, parágrafos, blocos de código, tabelas, listas e citações. Um # comentário dentro de um bloco de código nunca é confundido com um cabeçalho, porque a deteção é feita com estado de marcação. Os blocos são depois agrupados até ao orçamento, preferindo começar num cabeçalho.

Cada bloco recebe a árvore de cabeçalhos em vigor, prefixada ao campo text, o que melhora substancialmente a recuperação semântica em documentos com secções aninhadas.

Como Usar
const chunks = chunker.markdown('# Título\n\nConteúdo do documento...')

for (const chunk of chunks.listOfValues()) {
_log.info(chunk.getString('breadcrumb') +' -> '+ chunk.getInt('tokens') +' tokens')
_log.info(chunk.getString('text'))
}
Atributos
NOMETIPODESCRIÇÃO
markdownstringTexto em formato Markdown a dividir em blocos.
Retorno

( Values )

Lista de blocos, cada um com os campos: id (identificador estável, próprio para reindexação idempotente), hash (resumo do conteúdo), index e total (posição e total), start e end (posições no texto normalizado), length e tokens (tamanho em caracteres e em tokens), heading e headingLevel (cabeçalho mais próximo e nível), path (lista da árvore de cabeçalhos), breadcrumb (a mesma árvore em texto), sections (todas as secções que o bloco toca), header (cabeçalho de contexto já renderizado), content (corpo do bloco), context (nota de recuperação, frases de situação mais termos, preenchida por contextualize), text (a cadeia a embeber, composta segundo embed), embed (modo usado), type (markdown, text ou pdf), blocks (tipos de bloco presentes), overlap (caracteres repetidos do bloco anterior), page (página em que o bloco começa) e pages (todas as páginas que o bloco atravessa), ambos apenas em PDF paginado, metadata (metadados configurados) e synthetic (verdadeiro quando o corpo não é uma fatia literal da origem, por reabertura de marcação de código ou repetição de cabeçalho de tabela).


markdown(markdown: string, tamanhoDoBloco: int, sobreposicao: int) : Values

Descrição

Divide um documento Markdown em blocos com tamanho e sobreposição explícitos, na unidade configurada em unit.

Como Usar
// Blocos de 1500 caracteres com sobreposição de 200
const chunks = chunker.markdown(markdown, 1500, 200)
Atributos
NOMETIPODESCRIÇÃO
markdownstringTexto em formato Markdown a dividir em blocos.
tamanhoDoBlocointTamanho máximo de cada bloco.
sobreposicaointSobreposição entre blocos consecutivos, limitada a metade do tamanho do bloco.
Retorno

( Values )

Lista de blocos. Ver a descrição dos campos em markdown.


markdown(markdown: string, opcoes: Values) : Values

Descrição

Divide um documento Markdown em blocos com opções, que sobrepõem a configuração da instância apenas nesta chamada.

Opções aceites: chunkSize, overlap, minChunkSize, unit (chars ou tokens), embed (full, context ou content), encoding, prependHeading, headingPath, splitOnHeadings, stripDataUri, stripHtmlComments, source e metadata.

Como Usar
const chunks = chunker.markdown(markdown, _val.map()
.set('unit', 'tokens')
.set('chunkSize', 320)
.set('overlap', 48)
.set('source', 'manual-v1')
.set('metadata', _val.map().set('idioma', 'pt')))
Atributos
NOMETIPODESCRIÇÃO
markdownstringTexto em formato Markdown a dividir em blocos.
opcoesValuesOpções que sobrepõem a configuração da instância.
Retorno

( Values )

Lista de blocos. Ver a descrição dos campos em markdown.


metadata


metadata(metadados: Values) : ContextRetrievalChunker

Descrição

Define metadados aplicados a todos os blocos, copiados para o campo metadata e prontos a passar diretamente a vector.add.

Como Usar
const chunks = chunker
.metadata(_val.map().set('origem', 'manual').set('versao', 3))
.markdown(documento)
Atributos
NOMETIPODESCRIÇÃO
metadadosValuesMetadados aplicados a todos os blocos.
Retorno

( ContextRetrievalChunker )

A própria instância, para encadear configurações.


minChunkSize


minChunkSize(tamanhoMinimo: int) : ContextRetrievalChunker

Descrição

Define o tamanho mínimo de um bloco. Blocos abaixo deste valor são absorvidos por um vizinho, para evitar micro-blocos órfãos que poluem o vector store. Valor predefinido: um quarto do tamanho do bloco.

Atributos
NOMETIPODESCRIÇÃO
tamanhoMinimointTamanho mínimo de um bloco.
Retorno

( ContextRetrievalChunker )

A própria instância, para encadear configurações.


overlap


overlap(sobreposicao: int) : ContextRetrievalChunker

Descrição

Define a sobreposição entre blocos consecutivos, na unidade escolhida em unit. A sobreposição é construída a partir das últimas frases do bloco anterior, nunca a meio de uma palavra, e é limitada a metade do tamanho do bloco. Valor predefinido: 128 caracteres.

Como Usar
const chunks = chunker.chunkSize(1500).overlap(200).markdown(documento)
Atributos
NOMETIPODESCRIÇÃO
sobreposicaointSobreposição entre blocos consecutivos, limitada a metade do tamanho do bloco.
Retorno

( ContextRetrievalChunker )

A própria instância, para encadear configurações.


pdf


pdf(textoDoPdf: string) : Values

Descrição

Divide texto extraído de um PDF em blocos, aplicando antes a limpeza específica desta origem: junção de palavras cortadas por hífen no fim da linha, remoção de cabeçalhos e rodapés repetidos entre páginas, e remoção de linhas que são apenas o número da página. Quando o texto traz separadores de página, cada bloco recebe também o campo page.

Como Usar
const texto = _pdf.toText(_storage.filesystem('server', 'docs', 'manual.pdf'))
const chunks = chunker.source('manual.pdf').pdf(texto)

for (const chunk of chunks.listOfValues()) {
_log.info('Página '+ chunk.getInt('page') +': '+ chunk.getString('content'))
}
Atributos
NOMETIPODESCRIÇÃO
textoDoPdfstringTexto extraído de um PDF.
Retorno

( Values )

Lista de blocos. Ver a descrição dos campos em markdown.


pdf(pdfText: string, chunkSize: int, overlap: int) : Values

Atributos
NOMETIPODESCRIÇÃO
pdfTextstring
chunkSizeint
overlapint
Retorno

( Values )


pdf(textoDoPdf: string, opcoes: Values) : Values

Descrição

Divide texto extraído de um PDF em blocos com opções. Ver a lista de opções aceites em markdown.

Atributos
NOMETIPODESCRIÇÃO
textoDoPdfstringTexto extraído de um PDF.
opcoesValuesOpções que sobrepõem a configuração da instância.
Retorno

( Values )

Lista de blocos. Ver a descrição dos campos em markdown.


prependHeading


prependHeading(prefixarCabecalho: boolean) : ContextRetrievalChunker

Descrição

Define se o cabeçalho de contexto é prefixado ao campo text de cada bloco. Ativo por omissão. O campo content mantém sempre o corpo do bloco sem o cabeçalho.

Atributos
NOMETIPODESCRIÇÃO
prefixarCabecalhobooleanPrefixar ou não o cabeçalho de contexto.
Retorno

( ContextRetrievalChunker )

A própria instância, para encadear configurações.


source


source(origem: string) : ContextRetrievalChunker

Descrição

Define o identificador da origem do documento, usado para construir o id de cada bloco. Com a mesma origem e o mesmo conteúdo os id são sempre iguais, o que permite reindexar um documento sem duplicar registos no vector store.

Como Usar
const chunks = chunker.source('manual-v1').markdown(documento)
// id -> manual-v1#0-3f2a1c9d
Atributos
NOMETIPODESCRIÇÃO
origemstringIdentificador da origem do documento.
Retorno

( ContextRetrievalChunker )

A própria instância, para encadear configurações.


splitOnHeadings


splitOnHeadings(cortarNosCabecalhos: boolean) : ContextRetrievalChunker

Descrição

Define se um novo bloco começa preferencialmente num cabeçalho, ativo por omissão. É isto que alinha os blocos com as secções do documento.

Atributos
NOMETIPODESCRIÇÃO
cortarNosCabecalhosbooleanCortar ou não preferencialmente nos cabeçalhos.
Retorno

( ContextRetrievalChunker )

A própria instância, para encadear configurações.


stripDataUri


stripDataUri(removerDataUri: boolean) : ContextRetrievalChunker

Descrição

Define se as imagens embebidas em data: são reduzidas ao tipo de conteúdo, ativo por omissão. Um único PNG em base64 pode ocupar centenas de milhares de caracteres sem qualquer valor semântico.

Atributos
NOMETIPODESCRIÇÃO
removerDataUribooleanReduzir ou não as imagens embebidas.
Retorno

( ContextRetrievalChunker )

A própria instância, para encadear configurações.


stripHtmlComments


stripHtmlComments(removerComentarios: boolean) : ContextRetrievalChunker

Descrição

Define se os comentários HTML são removidos do Markdown, ativo por omissão. Comentários dentro de blocos de código são sempre preservados.

Atributos
NOMETIPODESCRIÇÃO
removerComentariosbooleanRemover ou não os comentários HTML.
Retorno

( ContextRetrievalChunker )

A própria instância, para encadear configurações.


text


text(texto: string) : Values

Descrição

Divide texto corrido em blocos, agrupando parágrafos inteiros e cortando por frases apenas quando um parágrafo ultrapassa o orçamento. Títulos numerados, no formato 3.1 Instalação, são reconhecidos como cabeçalhos e alimentam a árvore de contexto.

Como Usar
const chunks = chunker.text(textoSimples)
Atributos
NOMETIPODESCRIÇÃO
textostringTexto corrido a dividir em blocos.
Retorno

( Values )

Lista de blocos. Ver a descrição dos campos em markdown.


text(text: string, chunkSize: int, overlap: int) : Values

Atributos
NOMETIPODESCRIÇÃO
textstring
chunkSizeint
overlapint
Retorno

( Values )


text(texto: string, opcoes: Values) : Values

Descrição

Divide texto corrido em blocos com opções. Ver a lista de opções aceites em markdown.

Atributos
NOMETIPODESCRIÇÃO
textostringTexto corrido a dividir em blocos.
opcoesValuesOpções que sobrepõem a configuração da instância.
Retorno

( Values )

Lista de blocos. Ver a descrição dos campos em markdown.


unit


unit(unidade: string) : ContextRetrievalChunker

Descrição

Define a unidade de medida do orçamento: chars para caracteres ou tokens para tokens reais, contados com o mesmo algoritmo BPE dos modelos. Medir em tokens é o que garante que nenhum bloco ultrapassa o limite do modelo de embeddings.

Quando se passa para tokens sem ter definido chunkSize e overlap explicitamente, os valores predefinidos passam a 256 e 32 tokens.

Como Usar
const chunks = chunker.unit('tokens').chunkSize(320).markdown(documento)
Atributos
NOMETIPODESCRIÇÃO
unidadestringchars ou tokens.
Retorno

( ContextRetrievalChunker )

A própria instância, para encadear configurações.