In 4D-Anwendungen sind umfangreiche Dokumente an der Tagesordnung: Finanzberichte, interne Richtlinien, technische Handbücher… Die Suche nach einem exakten Schlüsselwort ist oft nicht ausreichend. Das Blättern durch 30-seitige Berichte, um einen Absatz zu finden, ist nicht nur zeitaufwändig, sondern auch fehleranfällig. An dieser Stelle kann KI helfen.
Der in 4D 20 R10 eingeführte semantische Ansatz, der auf Vektoren basiert, ermöglicht es bereits, ein relevantes 4D Write Pro Dokument zu finden, selbst wenn unterschiedliche Formulierungen verwendet werden (z. B. „Bild einfügen“ vs. „Bild hinzufügen“).
Aber was passiert, wenn ein Dokument über mehrere Seiten geht und verschiedene Unterthemen abdeckt? Auch wenn der gesamte Text in einen einzigen Vektor umgewandelt werden kann, sind die Ergebnisse oft besser, wenn wir in einem feineren Maßstab arbeiten. Das ist die Idee hinter dem Chunking: die Aufteilung eines Dokuments in kohärente Segmente, die jeweils durch einen eigenen Vektor dargestellt werden.
Das ist genau das, was es uns ermöglicht, weiter zu gehen: nicht nur das richtige Dokument zu finden, sondern auch die genaue Passage, die der Suche entspricht.
Aufteilen, um besser zu suchen: die Chunking-Strategie
Anstatt ein ganzes Dokument als einen einzigen Vektor zu indizieren, teilen wir es in zusammenhängende Segmente (Chunks) auf, typischerweise einen Absatz oder einen Block von 400 bis 800 Zeichen.
Jeder Chunk wird gespeichert mit:
- einem eindeutigen Chunk-Bezeichner,
- dem Dokumentenkennzeichen,
- seiner Position im Text (startOffset, endOffset), die zur genauen Hervorhebung verwendet wird,
- seine Vektoreinbettung,
- und optional einen kurzen Textauszug zur schnellen Überprüfung.
Dieser Grad an Granularität eröffnet neue Möglichkeiten:
- Präzisere Suche,
- Direkte Auswahl der relevanten Passage,
- kontextuelle Hervorhebung in 4D Write Pro.
Illustrierter Workflow: Von der Suche zur automatischen Hervorhebung
Hier sehen Sie, wie der Suchprozess aus der Sicht des Benutzers abläuft:
1. Benutzerabfrage
Der Benutzer gibt einen Text ein (z. B. „Berufsausbildung“) und löst eine Dokumentensuche aus.
2. Vektorsuche
Der Text wird vektorisiert und mit den gespeicherten Einbettungen verglichen. Das System gibt die k nächstgelegenen Chunks zurück (z.B. docID=42, chunkID=3, startOffset=1200, endOffset=1600).
3. Anzeige relevanter Absätze
Die Anwendung zeigt eine Liste relevanter Absätze an, zusammen mit dem Dokumentnamen und dem Snippet.
4. Automatische Anzeige und Auswahl des Absatzes
Durch Anklicken eines Ausschnitts in der Liste wird der Benutzer zum vollständigen Dokument weitergeleitet und sieht die Passage hervorgehoben, umgeben von den benachbarten Absätzen. Dank der gespeicherten Textabstände kann der genaue Teil des Dokuments ausgewählt werden.
Warum dieser Ansatz effektiv ist
- Leistung: Die Einbettung ist bei kurzen Fragmenten genauer als bei einem ganzen Text.
- Benutzerfreundlichkeit: Der Benutzer wird direkt zu der Stelle geführt, die ihn interessiert, was Zeit spart und das Scrollen durch Dutzende von Seiten vermeidet.
- Flexibilität: Das Chunking kann angepasst werden (feste Größe, absatzweise, mit oder ohne 10-15 % Überlappung).
- Skalierbarkeit: Diese Methode funktioniert auch bei Hunderten oder Tausenden von Dokumenten effizient.
Technische Einzelheiten
Eine Demo-Datenbank veranschaulicht diese Funktion anhand mehrerer 4D Write Pro Dokumente.
1. Aufteilung eines Dokuments in Chunks
Jeder Chunk entspricht einem Textintervall innerhalb eines Dokuments.
Für jeden Chunk speichern wir:
- seine Vektoreinbettung: Einbettung,
- seine Dokumentenreferenz: ID_Document,
- einen eindeutigen Bezeichner: ID,
- seine Textgrenzen: startOffset, endOffset.

Beim Speichern eines 4D Write Pro Dokuments berechnet 4D die verschiedenen Vektoren, aus denen das Dokument besteht:
$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. Vektorsuche innerhalb von Chunks
Wir vergleichen die Eingabeaufforderung des Benutzers mit allen Vektoren in der Chunk-Tabelle:
// 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)
Wir beschränken die Ergebnisse auf die fünf relevantesten Absätze.
3. Auswahl des gefundenen Absatzes in 4D Write Pro
Wenn der Benutzer eine Passage in der Listbox auswählt, zeigt 4D das Dokument im 4D Write Pro Bereich an und hebt den entsprechenden Absatz hervor:
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
Schlussfolgerung
Dieser Ansatz kombiniert das Beste aus beiden Welten: Die semantische Suche identifiziert die relevanten Dokumente, während die Granularität der Chunks es ermöglicht, die genaue Passage zu lokalisieren. Das Ergebnis ist ein 4D Write Pro Suchassistent, der nicht nur ein gutes Dokument findet, sondern den Nutzer direkt zu der Antwort führt, die er braucht.
Stellen Sie sich die Zeitersparnis und das verbesserte Benutzererlebnis vor, wenn Ihr Team direkt zu der relevanten Passage springen kann. Wie könnte dieses Maß an Präzision die Art und Weise verändern, wie Sie oder Ihre Nutzer Ihre Inhalte erkunden und mit ihnen interagieren? Teilen Sie Ihre Gedanken im 4D Forum mit!
