AgentSkillsCN

@ruvector/core

通过 Rust NAPI 绑定,HNSW 向量索引引擎每秒可完成 5 万次以上插入操作。适用于用户需要在 Node.js 中构建高性能向量搜索、创建 HNSW 索引、批量执行向量运算,或在后端应用中集成相似度搜索功能。

SKILL.md
--- frontmatter
name: "@ruvector/core"
description: "HNSW vector indexing engine with 50k+ inserts/sec via Rust NAPI bindings. Use when the user needs to build high-performance vector search in Node.js, create HNSW indexes, perform batch vector operations, or integrate similarity search into backend applications."

@ruvector/core

High-performance vector database core with HNSW indexing delivering 50k+ inserts/sec, built in Rust with Node.js NAPI bindings for AI/ML similarity search workloads.

Quick Command Reference

TaskCode
Create databaseconst db = new VectorDB({ dimensions: 384 })
Insert vectorawait db.insert(id, vector, metadata)
Batch insertawait db.batchInsert(items)
Searchawait db.search(queryVector, { topK: 10 })
Build HNSW indexawait db.buildIndex({ efConstruction: 200 })
Get statsawait db.stats()
Delete vectorawait db.delete(id)
Persist to diskawait db.save('./data')

Installation

Hub install (recommended): npx ruvector@latest includes this package. Standalone: npx @ruvector/core@latest See Installation Guide for the full ecosystem.

Core API

VectorDB Constructor

typescript
import { VectorDB } from '@ruvector/core';

const db = new VectorDB({
  dimensions: 384,           // Required: vector dimensionality
  metric: 'cosine',          // 'cosine' | 'euclidean' | 'dot'
  efConstruction: 200,       // HNSW build quality
  m: 16,                     // HNSW max connections per layer
  persistPath: './data',     // Optional: persistence directory
});

Constructor Options:

ParameterTypeDescriptionDefault
dimensionsnumberVector dimensionality (required)-
metric'cosine' | 'euclidean' | 'dot'Distance metric'cosine'
efConstructionnumberHNSW construction parameter200
mnumberMax connections per HNSW layer16
persistPathstringPath for disk persistenceundefined
maxElementsnumberPre-allocate capacity10000

Insert Methods

typescript
// Single insert
await db.insert(id: string, vector: Float32Array | number[], metadata?: Record<string, any>);

// Batch insert (50k+ inserts/sec)
await db.batchInsert(items: Array<{ id: string; vector: number[]; metadata?: object }>);

// Upsert (insert or update)
await db.upsert(id: string, vector: number[], metadata?: object);

Parameters:

ParameterTypeDescription
idstringUnique vector identifier
vectorFloat32Array | number[]Vector data
metadataRecord<string, any>Optional metadata

Search Methods

typescript
// Basic search
const results = await db.search(queryVector: number[], options?: SearchOptions);

// Search with filter
const results = await db.search(queryVector, {
  topK: 10,
  efSearch: 100,
  filter: { category: 'science' },
  includeMetadata: true,
  includeVectors: false,
  threshold: 0.7,
});

SearchOptions:

ParameterTypeDescriptionDefault
topKnumberNumber of results10
efSearchnumberHNSW search quality50
filterobjectMetadata filterundefined
includeMetadatabooleanReturn metadatatrue
includeVectorsbooleanReturn vectorsfalse
thresholdnumberMinimum similarity0.0

Returns: SearchResult[]

typescript
interface SearchResult {
  id: string;
  score: number;         // Similarity score
  metadata?: object;     // If includeMetadata
  vector?: number[];     // If includeVectors
}

Index Management

typescript
// Build HNSW index
await db.buildIndex({ efConstruction: 200, m: 16 });

// Optimize for recall target
await db.optimizeIndex({ targetRecall: 0.99 });

// Get index info
const info = await db.indexInfo();
// { built: true, elements: 50000, efConstruction: 200, m: 16 }

Persistence

typescript
// Save to disk
await db.save('./data');

// Load from disk
const db = await VectorDB.load('./data');

// Auto-persist on changes
const db = new VectorDB({ dimensions: 384, persistPath: './data' });

Delete and Update

typescript
// Delete single vector
await db.delete(id: string);

// Delete multiple vectors
await db.deleteMany(ids: string[]);

// Update metadata only
await db.updateMetadata(id: string, metadata: object);

Statistics

typescript
const stats = await db.stats();
// { count: 50000, dimensions: 384, metric: 'cosine', indexBuilt: true, memoryUsageMB: 128 }

Common Patterns

RAG Pipeline Integration

typescript
import { VectorDB } from '@ruvector/core';
import { embed } from './embeddings';

const db = new VectorDB({ dimensions: 384 });
// Index documents
for (const doc of documents) {
  const vector = await embed(doc.text);
  await db.insert(doc.id, vector, { text: doc.text, source: doc.source });
}
await db.buildIndex();
// Query
const queryVec = await embed("What is HNSW?");
const results = await db.search(queryVec, { topK: 5 });

Streaming Batch Insert

typescript
const items = largeDataset.map(d => ({
  id: d.id,
  vector: d.embedding,
  metadata: { label: d.label }
}));
await db.batchInsert(items); // 50k+/sec with Rust NAPI

Filtered Similarity Search

typescript
const results = await db.search(queryVector, {
  topK: 10,
  filter: { category: 'science', year: { $gte: 2023 } },
  threshold: 0.8,
});

Key Options

FeatureValue
Insert throughput50,000+ vectors/sec
Search latency (10k vectors)< 1ms
Supported metricscosine, euclidean, dot product
Max dimensions4096
PersistenceDisk-backed with memory-mapped I/O

RAN DDD Context

Bounded Context: Data Infrastructure

References