
Implementación del índice jerárquico de pequeños mundos navegables (HNSW) sobre HollowDB.
Instale el paquete:
yarn add hollowdb-vector
pnpm add hollowdb-vector
npm install hollowdb-vectorPuede crear el vectordb de la siguiente manera:
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 ) ;Con esto, puede insertar un nuevo punto:
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 ) ; Los metadatos son opcionales, y puede dejarlo fuera durante insert . Si desea establecerlo más tarde, siempre puede hacer:
vectordb . db . set_metadata ( index , metadata ) ; Nota
La complejidad de insertar un punto puede aumentar con más puntos en el DB.
Puede obtener un vector por su índice, que devuelve su valor de punto y metadatos:
const { point , metadata } = await vectordb . get_vector ( index ) ;Puede hacer una consulta y devolver los resultados relevantes de Top K:
// 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 exporta una función estática que les permite dos implementar un nuevo contrato que posee. Suponiendo que tiene una wallet y una instancia warp como se describe anteriormente, puede crear un nuevo contrato con:
const { contractTxId } = await HollowDBVector . deploy ( wallet , warp ) ;
console . log ( "Deployed at:" , contractTxId ) ; Para la configuración local de este repositorio, primero clona.
git clone https://github.com/firstbatchxyz/hollowdb-vectorLuego, instale paquetes:
pnpm installLas dependencias de pares deben instalarse automáticamente.
Incluimos el ProtoBuf pre-compilado dentro del repositorio, pero si cambió el ProtoBuf más tarde, puede generar el código compilado de la siguiente manera:
# 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 Las pruebas se ejecutan en algunos casos para un conjunto fijo de
pnpm test Advertencia
Necesita un servidor Redis en vivo para que funcione la prueba HollowDB. Además, las pruebas HollowDB pueden llevar algún tiempo.
Verifique el formato con:
pnpm formatPelusa todo con:
pnpm lintTambién puede verificar los tipos con:
pnpm checkHollowDB Vector reemplaza a Danny, para el código heredado, consulte esta rama.
HollowDB Vector tiene licencia bajo Apache 2.0.