Em aplicações 4D, documentos grandes são comuns: relatórios financeiros, diretrizes internas, manuais técnicos… Procurar uma palavra-chave exacta muitas vezes não é suficiente. Percorrer relatórios de 30 páginas para encontrar um parágrafo não é apenas demorado, mas também propenso a erros. É aqui que a IA pode ajudar.
A abordagem semântica baseada em vectores, introduzida em 4D 20 R10, já torna possível encontrar um documento 4D Write Pro relevante mesmo quando são usadas palavras diferentes (por exemplo, “inserir imagem” vs. “adicionar imagem”).
Mas o que acontece quando um documento se estende por múltiplas páginas e cobre vários subtópicos? Mesmo que todo o texto possa ser convertido num único vetor, os resultados são frequentemente melhores quando trabalhamos a uma escala mais fina. É esta a ideia subjacente ao chunking: dividir um documento em segmentos coerentes, cada um representado pelo seu próprio vetor.
É precisamente isto que nos permite ir mais longe: recuperar não só o documento certo, mas também a passagem exacta que corresponde à pesquisa.
Dividir para pesquisar melhor: a estratégia de fragmentação
Em vez de indexar um documento inteiro como um único vetor, dividimo-lo em segmentos coerentes (chunks), normalmente um parágrafo ou um bloco de 400 a 800 caracteres.
Cada pedaço é armazenado com:
- um identificador de bloco único,
- o identificador do documento,
- a sua posição no texto (startOffset, endOffset) utilizada para um realce preciso
- a sua incorporação vetorial,
- e, opcionalmente, um extrato de texto curto para uma verificação rápida.
Este nível de granularidade abre novas possibilidades:
- Pesquisa mais precisa,
- Seleção direta da passagem relevante,
- Destaque contextual em 4D Write Pro.
Fluxo de trabalho ilustrado: Da busca ao destaque automático
Aqui está como o processo de pesquisa se desenrola da perspetiva do utilizador:
1. Consulta do usuário
O usuário digita algum texto (por exemplo, formação profissional) e aciona uma busca de documento.
2. Pesquisa vetorial
O texto é vectorizado e comparado com os embeddings armazenados. O sistema devolve os k pedaços mais próximos (por exemplo, docID=42, chunkID=3, startOffset=1200, endOffset=1600).
3. Apresentação de parágrafos relevantes
A aplicação mostra uma lista de parágrafos relevantes, juntamente com o nome do documento e o excerto.
4. Visualização automática e seleção do parágrafo
Ao clicar num excerto da lista, o utilizador é redireccionado para o documento completo e vê a passagem destacada, rodeada pelos parágrafos vizinhos. Graças aos desvios de texto armazenados, é possível selecionar a parte exacta do documento.
Porque é que esta abordagem é eficaz
- Desempenho: as incorporações são mais precisas em fragmentos curtos do que num texto inteiro.
- Experiência do utilizador: o utilizador é levado diretamente para a passagem de interesse, poupando tempo e evitando percorrer dezenas de páginas.
- Flexibilidade: o chunking pode ser ajustado (tamanho fixo, por parágrafo, com ou sem sobreposição de 10-15%).
- Escalabilidade: este método funciona eficazmente mesmo com centenas ou milhares de documentos.
Detalhes técnicos
Uma base de dados de demonstração mostra esta caraterística usando vários documentos 4D Write Pro.
1. Dividindo um documento em pedaços
Cada pedaço corresponde a um intervalo de texto dentro de um documento.
Para cada pedaço, armazenamos:
- o seu vetor de embedding: embedding,
- a sua referência de documento: ID_Document,
- um identificador único: ID,
- os seus limites de texto: startOffset, endOffset.

Ao salvar um documento 4D Write Pro, 4D calcula os diferentes vetores que compõem o documento:
$colRange:=WP Get elements($doc.WP; wk type paragraph)
// For each paragraph, create a chunk
For each ($paragraph; $colRange)
$chunk :=ds.Chunk.new()
$chunk .ID_Document:=$doc.ID
$chunk .startOffset:=WP Paragraph range($paragraph).start
$chunk.endOffset:=WP Paragraph range($paragraph).end
$chunk.textExtract:=WP Get text($paragraph)
// Generate vector embedding using AIManagement
$chunk .embedding:=cs.AIManagement.new($apiKey).generateVector($chunk.textExtract)
$chunk .save()
End for each
2. Pesquisa vetorial em blocos
Comparamos o prompt do utilizador com todos os vectores da tabela de pedaços:
// Generate a vector from the custom prompt using the AIManagement class
var $vector:=cs.AIManagement.new($apiKey).generateVector($prompt)
// Sort entity by cosine similarity
return ds.Chunk.all().orderByFormula(Formula(This.embedding.cosineSimilarity($vector)); dk descending).slice(0; 5)
Limitamos os resultados aos cinco parágrafos mais relevantes.
3. Selecione o parágrafo encontrado no 4D Write Pro
Quando o usuário seleciona uma passagem na caixa de listagem, 4D mostra o documento na área 4D Write Pro e destaca o parágrafo correspondente:
Case of
: (Form event code=On Selection Change)
// Load the selected document in the 4D Write Pro area
WParea :=WP New(Form.currentItem.document.WP)
GOTO OBJECT (WParea)
// Select the text range defined by startOffset and endOffset
WP SELECT (WParea; Form.currentItem.startOffset; Form.currentItem.endOffset)
End case
Conclusão
Esta abordagem combina o melhor dos dois mundos: a pesquisa semântica identifica os documentos relevantes, enquanto a granularidade dos pedaços permite identificar a passagem exacta. O resultado é um assistente de pesquisa 4D Write Pro que não só encontra um bom documento, mas guia o utilizador diretamente para a resposta que precisa.
Imagine o tempo poupado e a experiência melhorada do utilizador quando a sua equipa pode saltar diretamente para a passagem relevante. Como é que este nível de precisão pode mudar a forma como você ou os seus utilizadores exploram e interagem com o seu conteúdo? Partilhe os seus pensamentos no Fórum 4D!
