En las aplicaciones 4D, los documentos de gran tamaño son habituales: informes financieros, directrices internas, manuales técnicos… Buscar una palabra clave exacta a menudo no es suficiente. Desplazarse por informes de 30 páginas para encontrar un párrafo no sólo lleva mucho tiempo, sino que también es susceptible a errores. Aquí es donde la IA puede ayudar.
El enfoque semántico basado en vectores, introducido en 4D 20 R10, ya permite encontrar un documento 4D Write Pro relevante incluso cuando se utilizan palabras diferentes (por ejemplo, «insertar imagen» frente a «añadir imagen»).
Pero, ¿qué ocurre cuando un documento abarca varias páginas y cubre varios subtemas? Aunque todo el texto pueda convertirse en un único vector, los resultados suelen ser mejores cuando se trabaja a una escala más fina. Esta es la idea que subyace al chunking: dividir un documento en segmentos coherentes, cada uno representado por su propio vector.
Esto es precisamente lo que nos permite ir más allá: recuperar no sólo el documento correcto, sino también el pasaje exacto que coincide con la búsqueda.
Dividir para buscar mejor: la estrategia Chunking
En lugar de indexar un documento entero como un único vector, lo dividimos en segmentos coherentes (chunks), normalmente un párrafo o un bloque de 400 a 800 caracteres.
Cada trozo se almacena con
- un identificador único de trozo,
- el identificador del documento,
- su posición en el texto (startOffset, endOffset), utilizada para resaltar con precisión,
- su incrustación vectorial,
- y, opcionalmente, un breve extracto del texto para una verificación rápida.
Este nivel de granularidad abre nuevas posibilidades:
- Búsqueda más precisa,
- Selección directa del pasaje relevante,
- Resaltado contextual en 4D Write Pro.
Flujo de trabajo ilustrado: De la búsqueda al resaltado automático
Aquí cómo se desarrolla el proceso de búsqueda desde la perspectiva del usuario:
1. Consulta del usuario
El usuario introduce un texto (por ejemplo, formación profesional) y activa la búsqueda de un documento.
2. Búsqueda vectorial
El texto se vectoriza y se compara con las incrustaciones almacenadas. El sistema devuelve los k trozos más cercanos (por ejemplo, docID=42, chunkID=3, startOffset=1200, endOffset=1600).
3. Visualización de los párrafos relevantes
La aplicación muestra una lista de los párrafos relevantes, junto con el nombre del documento y el fragmento.
4. Visualización automática y selección del párrafo
Al hacer clic en un fragmento de la lista, el usuario es redirigido al documento completo y ve el pasaje resaltado, rodeado de sus párrafos vecinos. Gracias a los desplazamientos de texto almacenados, se puede seleccionar la parte exacta del documento.
Por qué es eficaz este método
- Rendimiento: los vectores son más precisos en fragmentos cortos que en un texto entero.
- Experiencia del usuario: el usuario es conducido directamente al pasaje que le interesa, lo que ahorra tiempo y evita tener que desplazarse por decenas de páginas.
- Flexibilidad: el chunking puede ajustarse (tamaño fijo, por párrafos, con o sin solapamiento del 10-15%).
- Escalabilidad: este método funciona eficazmente incluso con cientos o miles de documentos.
Detalles técnicos
Una base de datos de demostración muestra esta función utilizando varios documentos de 4D Write Pro.
1. Dividir un documento en trozos
Cada chunk corresponde a un intervalo de texto dentro de un documento.
Para cada trozo, almacenamos
- su vector de integración: integration,
- su referencia documental: ID_Document,
- un identificador único: ID,
- sus límites textuales: startOffset, endOffset.

Al guardar un documento 4D Write Pro, 4D calcula los diferentes vectores que componen el 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. Búsqueda vectorial en los chunks
Comparamos el prompt del usuario con todos los vectores de la tabla Chunk:
// 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 los resultados a los cinco párrafos más relevantes.
3. Seleccionar el párrafo encontrado en 4D Write Pro
Cuando el usuario selecciona un pasaje en el listbox, 4D muestra el documento en el área 4D Write Pro y resalta el párrafo correspondiente:
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
Conclusión
Este enfoque combina lo mejor de dos mundos: la búsqueda semántica identifica los documentos pertinentes, mientras que la granularidad de los trozos permite localizar el pasaje exacto. El resultado es un asistente de búsqueda 4D Write Pro que no se limita a encontrar un buen documento, sino que guía al usuario directamente a la respuesta que necesita.
Imagine el ahorro de tiempo y la mejora de la experiencia del usuario cuando su equipo puede saltar directamente al pasaje relevante. ¿Cómo podría este nivel de precisión cambiar la forma en que usted o sus usuarios exploran e interactúan con su contenido? Comparta sus ideas en el Foro 4D.
