Dies ist eine WASM -Version (WebAssembly) der in C ++ geschriebenen HNSWLIB -Indexbibliothek. Dieser WASM -Port wurde von @shravansunder mit dem EMCC -WASM -Compiler erstellt, siehe das Repository hier.
Inspiriert von der Bibliothek HNSWLIB-NODE. @yoshoku hat eine wundervolle Dokumentation für HNSWLIB-NODE bereitgestellt. Danke, @yoshoku!
Hinweis: Diese Bibliothek befindet sich noch in den frühen Tagen! Es wird für einen Anwendungsfall erstellt, bei dem HNSWLIB im Browser ausgeführt werden muss.
hnswlib-wasm liefert WASM-Bindungen für HNSWLIB, die die ungefähre Suche nach der nächsten Nachbarn auf der Grundlage hierarchische Graphen der kleinen Welt implementiert. Es funktioniert in Browsern und wird mit Emscripten zusammengestellt.
$ yarn add hnswlib-wasmSiehe das NPM -Paket hier.
indexedDB (im Browser) und verwendet FS von EMSCIPTEN, um den Index über das virtuelle Dateisystem und die IDBFS zu speichern und zu laden.hnswlib-node .Erstellen Sie zunächst eine Laufzeitinstanz der Bibliothek:
import { loadHnswlib } from 'hnswlib-wasm' ;
const lib = await loadHnswlib ( ) ;Hier ist ein vollständiges Beispiel für das Laden eines Index, wenn er existiert, oder ein neuer Index zu erstellen, wenn es nicht vorhanden ist:
const filename = 'ghost.dat' ;
const { loadHnswlib } = await import ( 'hnswlib-wasm' ) ;
this . hnswlib = await loadHnswlib ( ) ;
this . hnswlib . EmscriptenFileSystemManager . setDebugLogs ( true ) ;
this . vectorHnswIndex = new this . hnswlib . HierarchicalNSW ( 'cosine' , 1536 ) ;
await syncFileSystem ( 'read' ) ;
const exists = this . hnswlib . EmscriptenFileSystemManager . checkFileExists ( filename ) ;
if ( ! exists ) {
this . vectorHnswIndex . initIndex ( 100000 , 48 , 128 , 100 ) ;
this . vectorHnswIndex . setEfSearch ( 32 ) ;
this . vectorHnswIndex . writeIndex ( 'ghost.dat' ) ;
} else {
this . vectorHnswIndex . readIndex ( filename , 100000 , true ) ;
this . vectorHnswIndex . setEfSearch ( 32 ) ;
}Sie können den Index erstellen und ihn so verwenden.
// Here you're creating a new index with the L2 distance metric and 1000 as the max number of elements
const hnswIndex = lib . HierarchicalNSW ( 'l2' , 100 ) ;
// Initialize the index with the dimensions (1536), m, efConstruction. See the section below on parameters for more details. These cannot be changed after the index is created.
index . initIndex ( 1536 , 36 , 16 , 200 ) ;
// Set efSearch parameters. This can be changed after the index is created.
index . setEfSearch ( efSearch ) ;
// Now you can add items to the index, labels are returned as an array for the vectors. It will reuse deleted labels if possible based on the second parameter.
const labels = index . addItems ( vectors , true ) ;
// Now you can search the index
const result1 = index . searchKnn ( vectors [ 10 ] , 10 , undefined ) ;
// You can also search the index with a label filter
const labelFilter = ( label : number ) => {
return label >= 10 && label < 20 ;
}
const result2 = index . searchKnn ( testVectorData . vectors [ 10 ] , 10 , labelFilter ) ;Weitere Nutzungsbeispiele, die hinzugefügt werden müssen.
Sehen Sie sich vorerst in der Datei
HierarchicalNSW.test.tsim Ordner Tests an und finden Sie in der HNSWLIB-NODE-API-Dokumentation.
Die hnswlib-wasm Bibliothek unterstützt IndexedDB (IDBFS) erweitert, um den Suchindex im Browser zu speichern und zu verwalten. Auf diese Weise können Sie den Suchindex einfach in einer Webumgebung speichern und laden und müssen keine Daten vom EMCC -Dateisystem in den JavaScript -Speicher verschieben. Es verwendet das FS von EMSCIPTEN, um den Index über das virtuelle Dateisystem zu speichern und zu laden. Das virtuelle Dateisystem wird mit IDBFS synchronisiert.
Um den Suchindex zu speichern, verwenden Sie die writeIndex -Methode:
await index . writeIndex ( 'savedIndex' ) ; Verwenden Sie zum Laden eines zuvor gespeicherten Suchindex die readIndex -Methode:
await index . readIndex ( 'savedIndex' , false ) ; Die syncFs -Methode wird verwendet, um das EMSCIPTEN -Dateisystem mit den persistenten Speicher -IDBFs zu synchronisieren. Sie können diese Methode verwenden, um Daten aus der persistenten Quelle des Dateisystems zu speichern oder zu lesen.
await lib . EmscriptenFileSystemManager . syncFS ( true , emscripten :: val :: undefined ( ) ) ; // Read data from the persistent source
await lib . EmscriptenFileSystemManager . syncFS ( false , emscripten :: val :: undefined ( ) ) ; // Save data to the persistent source Dieser Abschnitt bietet einen Überblick über die HNSW-Algorithmusparameter und deren Auswirkungen auf die Leistung bei der Verwendung der HNSWLIB-WASM-Bibliothek. HNSW (Hierarchical Navigable Small World) ist eine graphbasierte Indexstruktur für eine effiziente Ähnlichkeitssuche in hochdimensionalen Räumen.
Bild von pnecone.io
Es verfügt über mehrere Parameter, die eingestellt werden können, um den Kompromiss zwischen Suchqualität und Indexgröße oder Bauzeit zu steuern. Hier sind einige der Schlüsselparameter.
EFSEARCH ist die Größe der dynamischen Liste für die nächsten während der Suche verwendeten Nachbarn. Höhere EFSearch -Werte führen zu genaueren, aber langsameren Suchvorgängen. EFSearch kann nicht niedriger als die Anzahl der am nächsten Nachbarn K.
M ist die Anzahl der bidirektionalen Links, die für jedes neue Element während der Indexkonstruktion erstellt wurden. Ein vernünftiger Bereich für M beträgt 2-100. Höhere M -Werte funktionieren bei Datensätzen mit hoher intrinsischer Dimensionalität und/oder hohem Rückruf besser, während niedrigere M -Werte für Datensätze mit geringer intrinsischer Dimensionalität und einem geringen Rückruf besser funktionieren. Der Parameter bestimmt auch den Speicherverbrauch von Algorithmen, der ungefähr 8-10 Bytes pro gespeichertem Element entspricht.
EFConstruction kontrolliert die Indexkonstruktionszeit und Genauigkeit. Größere EFConstruction -Werte führen zu längeren Bauzeiten, aber zu einer besseren Indexqualität. Irgendwann verbessert die Erhöhung der EFKonstruktion die Qualität des Index nicht. Um zu prüfen, ob der ausgewählte EFConstruction -Wert angemessen ist, messen Sie die Rückruf für M am nächsten nach Nachbarn, wenn eFSearch = eFconstruction. Wenn der Rückruf niedriger als 0,9 ist, gibt es Raum für Verbesserungen.
Bei Verwendung von HNSWLIB-WASM ist es wichtig, geeignete Werte für M, EFSearch und EFConstruction basierend auf der Größe und Dimensionalität Ihrer Datensätze auszuwählen. Da HNSWLIB-WASM im Browser ausgeführt wird, sollten Sie die verfügbaren Speicher- und Leistungsbeschränkungen berücksichtigen. Hier sind einige Empfehlungen:
Wählen Sie einen Wert im Bereich von 12-48, da er für die meisten Anwendungsfälle gut funktioniert. Möglicherweise müssen Sie experimentieren, um den optimalen Wert für Ihren spezifischen Datensatz zu finden.
Beginnen Sie mit einem Wert in der Nähe von M und passen Sie ihn anhand Ihres gewünschten Kompromisses zwischen Suchgeschwindigkeit und Genauigkeit an. Niedrigere Werte sind schneller, aber weniger genau, während höhere Werte genauer, aber langsamer sind.
Setzen Sie diesen Wert unter Berücksichtigung des erwarteten Abfragevolumens. Wenn Sie ein niedriges Abfragevolumen erwarten, können Sie einen höheren Wert für die EFConstruction festlegen, um den Rückruf mit minimalen Auswirkungen auf die Suchzeit zu verbessern, insbesondere wenn Sie niedrigere M -Werte verwenden.
Denken Sie daran, dass höhere M-Werte die Speicherverwendung des Index erhöhen. Daher sollten Sie die Leistung und Speicherbeschränkungen ausgleichen, wenn Sie Ihre Parameter für HNSWLIB-WASM auswählen.
Lernen Sie HNSW durch Tinecone
Vektorindizes nach Tinecone
Bilder von pnecone.io
HNSWLIB-WASM ist unter den Bestimmungen der Apache-2.0-Lizenz als Open Source verfügbar.
Zu bauen
yarn install
make rebuild
yarn build
Zu testen
yarn test
Kontaktieren Sie zuerst @shravansunder!