Это версия Webassembly (WASM) библиотеки индекса HNSWLIB, написанная в C ++. Этот порт WASM был создан @shravansunder с использованием компилятора EMCC WASM, см. Репозиторий здесь.
Вдохновленный библиотекой Hnswlib-Node. @yoshoku предоставил замечательную документацию для Hnswlib-Node. Спасибо, @yoshoku!
Примечание: эта библиотека все еще в первые дни! Он строится для использования, который требует запуска hnswlib в браузере.
hnswlib-wasm обеспечивает привязки WASM для Hnswlib, который реализует приблизительный поиск ближайшего соседа на основе иерархических навигационных малых графиков мира. Он работает в браузерах и составлен с Emscripten.
$ yarn add hnswlib-wasmСмотрите пакет NPM здесь.
indexedDB (в браузере) и использует FS от Emscripten для сохранения и загрузки индекса через виртуальную файловую систему и IDBFS.hnswlib-node для получения более подробной информации @yoshoku Changelog.Во -первых, создайте экземпляр времени выполнения библиотеки:
import { loadHnswlib } from 'hnswlib-wasm' ;
const lib = await loadHnswlib ( ) ;Вот полный пример загрузки индекса, если он существует или создает новый индекс, если он не существует:
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 ) ;
}Вы можете создать индекс и использовать его так.
// 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 ) ;Больше примеров использования, которые будут добавлены.
На данный момент см. Файл
HierarchicalNSW.test.tsв папке Tests и обратитесь к документации API Hnswlib Node.
Библиотека hnswlib-wasm обеспечивает расширенную поддержку IndexedDB (IDBFS) для хранения и управления индексом поиска в браузере. Это позволяет легко сохранять и загружать индекс поиска в веб -среде, и вам не нужно перемещать данные из файловой системы EMCC в память JavaScript. Он использует FS от Emscripten для сохранения и загрузки индекса через виртуальную файловую систему. Виртуальная файловая система синхронизируется с IDBFS.
Чтобы сохранить индекс поиска, используйте метод writeIndex :
await index . writeIndex ( 'savedIndex' ) ; Чтобы загрузить ранее сохраненный индекс поиска, используйте метод readIndex :
await index . readIndex ( 'savedIndex' , false ) ; Метод syncFs используется для синхронизации файловой системы Emscripten с постоянным хранилищами IDBF. Вы можете использовать этот метод для сохранения или прочтения данных из постоянного источника файловой системы.
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 В этом разделе будет представлен обзор параметров алгоритма HNSW и их влияния на производительность при использовании библиотеки HNSWLIB-WASM. HNSW (иерархический судоходный маленький мир) является структурой индекса на основе графика для эффективного поиска сходства в высокоразмерных пространствах.
Изображение от pinecone.io
Он имеет несколько параметров, которые можно настроить для контроля компромисса между качеством поиска и размером индекса или временем строительства. Вот некоторые из ключевых параметров.
Efsearch - это размер динамического списка для ближайших соседей, используемых во время поиска. Более высокие значения EFSearch приводят к более точным, но более медленным поискам. EFSearch не может быть установлен ниже, чем количество запрошенных ближайших соседей K, и может быть любое значение между K и размером набора данных.
M-это количество двунаправленных ссылок, созданных для каждого нового элемента во время конструкции индекса. Разумный диапазон для М составляет 2-100. Более высокие значения M лучше работают на наборах данных с высокой внутренней размерностью и/или высоким отзывами, в то время как более низкие значения M работают лучше для наборов данных с низкой внутренней размерностью и/или низким отзывами. Параметр также определяет потребление памяти алгоритмов, которое примерно M * 8-10 байтов на сохраненный элемент.
EFConstruction контролирует время и точность построения индекса. Большие значения EFConstruction приводят к более длительному времени строительства, но лучшее качество индекса. В какой -то момент увеличение эф -конструкции не улучшает качество индекса. Чтобы проверить, подходит ли выбранное значение EFConstruction, измерьте отзыв для M ближайшего соседнего поиска, когда Efsearch = EFConstruction. Если отзыв ниже 0,9, есть место для улучшения.
При использовании hnswlib-wasm важно выбрать соответствующие значения для M, EFSearch и EFConstruction на основе размера и размерности ваших наборов данных. Поскольку Hnswlib-Wasm работает в браузере, вам следует рассмотреть доступные ограничения памяти и производительности. Вот несколько рекомендаций:
Выберите значение в диапазоне 12-48, так как оно хорошо работает для большинства вариантов использования. Вам может потребоваться экспериментировать, чтобы найти оптимальное значение для вашего конкретного набора данных.
Начните со значения, близкого к M и настраивайте его на основе желаемого компромисса между скоростью поиска и точностью. Более низкие значения будут быстрее, но менее точными, в то время как более высокие значения будут более точными, но медленными.
Установите это значение, учитывая ожидаемый объем запроса. Если вы ожидаете низкого объема запроса, вы можете установить более высокое значение для EFConstruction, чтобы улучшить отзыв с минимальным влиянием на время поиска, особенно при использовании более низких значений M.
Помните, что более высокие значения M увеличат использование памяти индекса, поэтому вы должны сбалансировать производительность и ограничения памяти при выборе параметров для hnswlib-pasm.
Учитесь HNSW по Pinecone
Векторные индексы по PineCone
Изображения из pinecone.io
Hnswlib-Wasm доступен в качестве открытого исходного кода в соответствии с условиями лицензии Apache-2.0.
Построить
yarn install
make rebuild
yarn build
Чтобы проверить
yarn test
Свяжитесь с @shravansunder сначала!