
Implémentation de l'indice hiérarchique des petits mondes navigables (HNSW) sur HollowDB.
Installez le package:
yarn add hollowdb-vector
pnpm add hollowdb-vector
npm install hollowdb-vectorVous pouvez créer le vectordb comme suit:
import HollowDBVector from "hollowdb-vector" ;
import { WarpFactory , defaultCacheOptions } from "warp-contracts" ;
import { SetSDK } from "hollowdb" ;
import { Redis } from "ioredis" ;
import { RedisCache } from "warp-contracts-redis" ;
// connect to Redis
const redis = new Redis ( ) ;
// create Warp instance with Redis cache
const warp = WarpFactory . forMainnet ( ) . useKVStorageFactory (
( contractTxId : string ) =>
new RedisCache ( { ... defaultCacheOptions , dbLocation : ` ${ contractTxId } ` } , { client : redis } ) ,
) ;
// create HollowDB SDK
const wallet = JSON . parse ( readFileSync ( "./path/to/wallet.json" , "utf-8" ) ) ;
const contractTxId = "your-contract-tx-id" ;
const hollowdb = new SetSDK < string > ( wallet , contractTxId , warp ) ;
// create HollowDB Vector
const vectordb = new HollowDBVector ( hollowdb ) ;Avec cela, vous pouvez insérer un nouveau point:
const point = [ - 0.28571999073028564 /* and many more... */ , 0.13964000344276428 ] ;
// any object
const metadata = {
name : "My favorite vector!" ,
} ;
// insert a point
await vectordb . insert ( point , metadata ) ; Les métadonnées sont facultatives et vous pouvez la laisser de côté pendant insert . Si vous souhaitez le définir plus tard, vous pouvez toujours faire:
vectordb . db . set_metadata ( index , metadata ) ; Note
La complexité de l'insertion d'un point peut augmenter avec plus de points dans la DB.
Vous pouvez obtenir un vecteur par son index, qui renvoie sa valeur ponctuelle et ses métadonnées:
const { point , metadata } = await vectordb . get_vector ( index ) ;Vous pouvez faire une requête et retourner les K des résultats pertinents:
// a query point
const query = [ - 0.28571999073028564 /* and many more... */ , 0.13964000344276428 ] ;
// number of top results to return
const K = 10 ;
// make a KNN search
const results = await vectordb . knn_search ( query , K ) ;
// each result contains the vector id, its distance to query, and metadata
const { id , distance , metadata } = results [ 0 ] ; HollowDB Vector exporte une fonction statique qui vous permet à deux de déployer un nouveau contrat que vous possédez. En supposant que vous avez un wallet et une instance warp comme décrit ci-dessus, vous pouvez créer un nouveau contrat avec:
const { contractTxId } = await HollowDBVector . deploy ( wallet , warp ) ;
console . log ( "Deployed at:" , contractTxId ) ; Pour la configuration locale de ce dépôt, le clonez d'abord.
git clone https://github.com/firstbatchxyz/hollowdb-vectorEnsuite, installez les packages:
pnpm installLes dépendances par les pairs doivent être installées automatiquement.
Nous incluons le protobuf pré-compilé dans le dépôt, mais si vous deviez changer le protobuf plus tard, vous pouvez générer le code compilé comme suit:
# HNSW protobufs
pnpm proto:code:hnsw # generate js code
pnpm proto:type:hnsw # generate types
# Request protobufs
pnpm proto:code:req # generate js code
pnpm proto:type:req # generate types Les tests sont passés sur quelques cas pour un ensemble fixe de
pnpm test Avertissement
Vous avez besoin d'un serveur Redis en direct pour que le test HollowDB fonctionne. De plus, les tests HollowDB peuvent prendre un certain temps.
Vérifiez le formatage avec:
pnpm formatPeluche tout avec:
pnpm lintVous pouvez également vérifier les types avec:
pnpm checkHollowDB Vector remplace Danny, pour le code hérité, veuillez vous référer à cette branche.
Le vecteur HollowDB est sous licence sous Apache 2.0.