-
Notifications
You must be signed in to change notification settings - Fork 0
Vector Search Implementation
Complete vector database infrastructure for semantic search using PostgreSQL pgvector and OpenAI embeddings. This implementation provides production-ready AI-powered search capabilities with comprehensive monitoring, cost tracking, and quality assurance.
Version: v0.7.0 Status: Complete Date: January 31, 2026
β Vector Storage
- PostgreSQL pgvector extension
- 1536-dimensional embeddings (OpenAI)
- HNSW index for fast similarity search
- Automatic embedding triggers
β Embedding Generation
- OpenAI API integration (3 models supported)
- Batch processing (up to 2048 embeddings)
- Automatic deduplication via content hash
- Failed embedding retry logic
β Search Operations
- Semantic similarity search
- Multiple distance metrics (cosine, L2, inner product)
- Channel and user filtering
- Configurable thresholds
β Background Processing
- Continuous queue processing worker
- Periodic maintenance worker
- Automatic index optimization
- Cache cleanup
β Monitoring & Analytics
- Real-time performance metrics
- Quality score tracking
- Cost tracking and reporting
- Cache efficiency monitoring
β Admin Dashboard
- Live coverage statistics
- Job progress tracking
- Performance charts
- Index health metrics
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Admin UI β
β (EmbeddingsDashboard.tsx) β
β - Coverage stats - Job management β
β - Performance charts - Cost tracking β
ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββ
β API Routes β
β - /api/admin/embeddings/generate β
β - /api/admin/embeddings/status β
β - /api/admin/embeddings/stats β
β - /api/admin/embeddings/cancel β
ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββ
β Embedding Pipeline β
β (embedding-pipeline.ts) β
β - Job orchestration - Progress tracking β
β - Batch processing - Error handling β
βββββββ¬ββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββ
β β
βββββββΌββββββββββββββββββββββ βββββββββββββββΌβββββββββββ
β Embedding Service β β Vector Store β
β (embedding-service.ts) β β (vector-store.ts) β
β - OpenAI API client β β - Similarity search β
β - Batch operations β β - Insert/update β
β - Cache management β β - Index health β
β - Cost tracking β β - Coverage stats β
βββββββββββββ¬ββββββββββββββββ ββββββββββββββ¬ββββββββββββ
β β
βββββββββββββΌββββββββββββββββββββββββββββββββββββΌββββββββββββ
β PostgreSQL β
β - nchat_messages.embedding (vector(1536)) β
β - nchat_embedding_cache (deduplication) β
β - nchat_embedding_queue (async processing) β
β - nchat_embedding_jobs (progress tracking) β
β - nchat_embedding_stats (analytics) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
.backend/migrations/
βββ 031_vector_search_infrastructure.sql # Complete migration
βββ pgvector extension setup
βββ Message embedding columns
βββ HNSW index creation
βββ Supporting tables (jobs, queue, cache, stats)
βββ Search functions
βββ Maintenance functions
src/lib/
βββ database/
β βββ vector-store.ts # Vector operations
β βββ VectorStore class
β βββ Similarity search
β βββ Batch operations
β βββ Coverage & health metrics
β βββ Vector math utilities
β
βββ ai/
β βββ embedding-service.ts # OpenAI integration
β β βββ EmbeddingService class
β β βββ Single/batch generation
β β βββ Cache management
β β βββ Cost tracking
β β
β βββ embedding-pipeline.ts # Orchestration
β β βββ EmbeddingPipeline class
β β βββ Job management
β β βββ Progress tracking
β β βββ Retry logic
β β
β βββ embedding-utils.ts # Utilities
β β βββ Vector operations
β β βββ Quality metrics
β β βββ Dimension reduction
β β βββ Monitoring helpers
β β
β βββ embedding-monitor.ts # Monitoring
β βββ EmbeddingMonitor class
β βββ Performance tracking
β βββ Quality metrics
β βββ Alert system
src/workers/
βββ embedding-worker.ts # Queue processor
β βββ Continuous polling
β βββ Batch processing
β βββ Error handling
β βββ Graceful shutdown
β
βββ embedding-maintenance-worker.ts # Maintenance
βββ Queue cleanup
βββ Cache cleanup
βββ Index optimization
βββ Periodic scheduling
src/app/api/admin/embeddings/
βββ generate/
β βββ route.ts # Start embedding jobs
βββ status/
β βββ route.ts # Job status & history
βββ stats/
β βββ route.ts # Comprehensive statistics
βββ cancel/
βββ route.ts # Cancel running jobs
src/components/admin/embeddings/
βββ EmbeddingsDashboard.tsx # Main dashboard
βββ Coverage statistics
βββ Active job monitoring
βββ Performance metrics
βββ Index health
βββ Recent jobs list
docs/
βββ Vector-Search-Setup.md # Setup & operations guide
βββ Vector-Search-Implementation.md # This file
ALTER TABLE nchat.nchat_messages ADD COLUMN:
- embedding vector(1536) -- The embedding vector
- embedding_model VARCHAR(50) -- Model used (e.g., text-embedding-3-small)
- embedding_version VARCHAR(20) -- Version tracking
- embedding_created_at TIMESTAMPTZ -- When generated
- embedding_error TEXT -- Error message if failed
- embedding_retry_count INTEGER -- Number of retriesTracks bulk embedding operations.
- id UUID PRIMARY KEY
- job_type VARCHAR(50) -- initial, reindex, update, repair
- status VARCHAR(20) -- pending, running, completed, failed, cancelled
- total_messages INTEGER
- processed_messages INTEGER
- successful_embeddings INTEGER
- failed_embeddings INTEGER
- error_message TEXT
- started_at TIMESTAMPTZ
- completed_at TIMESTAMPTZ
- metadata JSONB
- created_by UUIDAsynchronous processing queue.
- id UUID PRIMARY KEY
- message_id UUID REFERENCES nchat_messages
- priority INTEGER -- Higher = more urgent
- retry_count INTEGER
- max_retries INTEGER
- last_error TEXT
- scheduled_at TIMESTAMPTZ
- claimed_at TIMESTAMPTZ -- NULL = available
- claimed_by VARCHAR(100) -- Worker IDDeduplication cache.
- id UUID PRIMARY KEY
- content_hash VARCHAR(64) UNIQUE -- SHA-256 hash
- content TEXT
- embedding vector(1536)
- model VARCHAR(50)
- version VARCHAR(20)
- usage_count INTEGER
- last_used_at TIMESTAMPTZDaily statistics.
- id UUID PRIMARY KEY
- date DATE
- model VARCHAR(50)
- total_embeddings INTEGER
- total_tokens INTEGER
- estimated_cost DECIMAL(10,6)
- avg_processing_time_ms INTEGER
- cache_hit_count INTEGER
- cache_miss_count INTEGER
- error_count INTEGER-- HNSW index for fast similarity search (cosine distance)
CREATE INDEX idx_messages_embedding_hnsw
ON nchat.nchat_messages
USING hnsw (embedding vector_cosine_ops)
WHERE embedding IS NOT NULL AND is_deleted = FALSE;
-- Supporting indexes
CREATE INDEX idx_messages_embedding_model ON nchat.nchat_messages(embedding_model);
CREATE INDEX idx_messages_embedding_created ON nchat.nchat_messages(embedding_created_at DESC);
CREATE INDEX idx_embedding_jobs_status ON nchat.embedding_jobs(status, created_at DESC);
CREATE INDEX idx_embedding_queue_scheduled ON nchat.embedding_queue(priority DESC, scheduled_at ASC);
CREATE INDEX idx_embedding_cache_hash ON nchat.embedding_cache(content_hash);-- Semantic search with filters
nchat.search_messages_by_embedding(
query_embedding vector(1536),
match_threshold FLOAT DEFAULT 0.7,
match_count INTEGER DEFAULT 10,
filter_channel_id UUID DEFAULT NULL,
filter_user_id UUID DEFAULT NULL
)
-- Returns: message_id, content, similarity, channel_id, user_id, created_at-- Coverage statistics
nchat.get_embedding_coverage()
-- Returns: total_messages, messages_with_embeddings, coverage_percentage,
-- pending_embeddings, failed_embeddings, oldest_unembedded_message
-- Index health
nchat.get_embedding_index_health()
-- Returns: index_name, index_size, total_vectors, index_efficiency-- Clean stale queue items
nchat.cleanup_embedding_queue()
-- Clean old cache entries
nchat.cleanup_embedding_cache(days_unused INTEGER DEFAULT 90)
-- Optimize vector index
nchat.optimize_embedding_index()-- Auto-queue new messages
CREATE TRIGGER trigger_queue_new_message_embedding
AFTER INSERT ON nchat.nchat_messages
FOR EACH ROW EXECUTE FUNCTION nchat.queue_message_for_embedding();
-- Auto-requeue edited messages
CREATE TRIGGER trigger_requeue_edited_message_embedding
AFTER UPDATE ON nchat.nchat_messages
FOR EACH ROW WHEN (OLD.content IS DISTINCT FROM NEW.content)
EXECUTE FUNCTION nchat.requeue_message_on_edit();Start bulk embedding generation.
Request:
{
"type": "initial", // or "repair"
"userId": "uuid" // optional
}Response:
{
"success": true,
"jobId": "uuid",
"message": "Embedding generation job started"
}Get job status.
Query Parameters:
-
jobId(optional) - Specific job ID -
limit(optional) - Number of recent jobs (default: 10)
Response (single job):
{
"job": {
"id": "uuid",
"job_type": "initial",
"status": "running",
"total_messages": 1000,
"processed_messages": 450,
"successful_embeddings": 448,
"failed_embeddings": 2,
"percentage": 45,
"estimatedTimeRemaining": 120000,
"started_at": "2026-01-31T10:00:00Z"
}
}Response (multiple jobs):
{
"jobs": [
{
"id": "uuid",
"job_type": "initial",
"status": "completed",
"total_messages": 1000,
"processed_messages": 1000,
...
}
]
}Get comprehensive statistics.
Query Parameters:
-
days(optional) - Number of days to include (default: 30)
Response:
{
"coverage": {
"totalMessages": 10000,
"messagesWithEmbeddings": 9500,
"coveragePercentage": 95.0,
"pendingEmbeddings": 450,
"failedEmbeddings": 50
},
"indexHealth": {
"indexName": "idx_messages_embedding_hnsw",
"indexSize": "256 MB",
"totalVectors": 9500,
"indexEfficiency": 95.0
},
"performance": {
"totalEmbeddings": 9500,
"totalTokens": 475000,
"totalCost": "0.0095",
"avgCostPerEmbedding": "0.000001",
"cacheHitRate": "85.5",
"errorRate": "0.5"
},
"queue": {
"pending": 450,
"processing": 10,
"failed": 5
},
"cache": {
"totalEntries": 8000,
"totalUsage": 12000,
"recentlyUsed": 5000,
"avgUsagePerEntry": 1.5
},
"dailyStats": [...]
}Cancel a running job.
Request:
{
"jobId": "uuid"
}Response:
{
"success": true,
"message": "Job cancelled successfully"
}# Run database migration
cd .backend
psql -U postgres -d nself_chat -f migrations/031_vector_search_infrastructure.sql
# Set environment variables
export OPENAI_API_KEY=sk-...
# Start workers
pnpm workers:startimport { embeddingPipeline } from '@/lib/ai/embedding-pipeline'
// Generate all embeddings
const jobId = await embeddingPipeline.generateAllEmbeddings(userId, (progress) => {
console.log(`Progress: ${progress.percentage}%`)
})
// Monitor job
const status = await fetch(`/api/admin/embeddings/status?jobId=${jobId}`)import { embeddingService } from '@/lib/ai/embedding-service'
import { vectorStore } from '@/lib/database/vector-store'
// Generate query embedding
const { embedding } = await embeddingService.generateEmbedding('search query')
// Search messages
const results = await vectorStore.search(embedding, {
threshold: 0.7,
limit: 10,
channelId: 'channel-uuid',
})
// Display results
for (const result of results) {
console.log(`[${(result.similarity * 100).toFixed(1)}%] ${result.content}`)
}import { embeddingMonitor } from '@/lib/ai/embedding-monitor'
// Get report
const report = await embeddingMonitor.getReport(24)
console.log(`Success Rate: ${report.performance.successRate}%`)
console.log(`Cache Hit Rate: ${report.cache.hitRate}%`)
console.log(`Total Cost: $${report.cost.totalCost}`)
// Check alerts
const alerts = embeddingMonitor.getAlerts()
for (const alert of alerts) {
console.warn(`[${alert.level}] ${alert.message}`)
}import { getEmbeddingStats, detectAnomalies } from '@/lib/ai/embedding-utils'
// Check embedding quality
const stats = getEmbeddingStats(embedding)
console.log(`Quality Score: ${stats.qualityScore}/100`)
console.log(`Anomalies: ${stats.anomalies.join(', ')}`)
// Compare embeddings
import { compareEmbeddings } from '@/lib/ai/embedding-utils'
const comparison = compareEmbeddings(embedding1, embedding2)
console.log(`Cosine Similarity: ${comparison.cosineSimilarity}`)# Required
OPENAI_API_KEY=sk-...
# Optional
EMBEDDING_MODEL=text-embedding-3-small
EMBEDDING_VERSION=1.0.0import { EmbeddingPipeline } from '@/lib/ai/embedding-pipeline'
const pipeline = new EmbeddingPipeline({
batchSize: 100, // Messages per batch
maxRetries: 3, // Retry attempts
retryDelayMs: 5000, // Delay between retries
maxConcurrent: 5, // Concurrent batches
})// embedding-worker.ts
const POLL_INTERVAL_MS = 5000 // Poll every 5 seconds
const BATCH_SIZE = 50 // Process 50 messages per batch
const MAX_CONSECUTIVE_ERRORS = 5 // Stop after 5 errors
// embedding-maintenance-worker.ts
const CHECK_INTERVAL_MS = 3600000 // Run every 1 hour
const CACHE_CLEANUP_DAYS = 90 // Clean entries unused for 90+ days| Metric | Value |
|---|---|
| Total embeddings | 1,000,000 |
| Total tokens | 50,000,000 |
| Cost (small model) | $1.00 |
| Processing time (10 workers) | ~2 hours |
| Cache hit rate | 85%+ |
| Index size | ~6 GB |
| Search time (p95) | <50ms |
- Batch Size: 100-500 for optimal throughput
- Workers: 5-10 for parallel processing
- Cache: Maintains 80%+ hit rate over time
- Index: Auto-optimizes daily, manual rebuild if needed
- Costs: Caching reduces costs by 80%+
- Coverage: Target 95%+ embedded messages
- Success Rate: Target 98%+ successful embeddings
- Cache Hit Rate: Target 80%+ cache hits
- Processing Time: Target <2s per embedding
- Cost per Embedding: Track against budget
// Performance alerts
if (successRate < 95%) alert('warning', 'Degraded success rate');
if (successRate < 80%) alert('error', 'Low success rate');
if (avgDuration > 5000) alert('warning', 'Slow performance');
if (avgDuration > 10000) alert('error', 'Very slow performance');
// Quality alerts
if (lowQualityRate > 10%) alert('warning', 'High low-quality rate');
// Cost alerts
if (dailyCost > budget) alert('warning', 'Over budget');See Vector-Search-Setup.md for detailed troubleshooting guide.
Problem: Embeddings not generating
Solution: Check workers (pnpm workers:logs), verify API key
Problem: Slow search
Solution: Rebuild index (SELECT nchat.optimize_embedding_index())
Problem: High costs Solution: Check cache hit rate, adjust batch sizes, filter messages
Problem: Low quality scores Solution: Review content preprocessing, check for system messages
- Multi-model support (switch between small/large)
- Custom embedding models (self-hosted)
- Hybrid search (vector + keyword)
- Query expansion and reranking
- Semantic clustering and tagging
- Real-time embedding updates
- Advanced analytics dashboard
- Cost optimization suggestions
- Dimension reduction for storage optimization
- A/B testing framework for model comparison
- Embedding versioning and migration tools
- Multi-language support
- Query performance profiling
- Automated quality monitoring alerts
- API Key Protection: Store in environment, never commit
- Access Control: Restrict admin endpoints to authorized users
- Rate Limiting: Implement to prevent API abuse
- Data Privacy: Embeddings contain semantic information
- Audit Logging: Track all embedding operations
The vector search infrastructure is production-ready with comprehensive features:
- β Automatic embedding generation
- β Fast similarity search
- β Cost-effective caching
- β Robust error handling
- β Real-time monitoring
- β Admin dashboard
- β Complete documentation
Ready for deployment in v0.7.0!
- Documentation: Vector-Search-Setup.md
-
Migration:
.backend/migrations/031_vector_search_infrastructure.sql -
Workers:
src/workers/embedding-*.ts -
Dashboard:
src/components/admin/embeddings/EmbeddingsDashboard.tsx -
API:
src/app/api/admin/embeddings/
For issues or questions, check the setup guide or review worker logs.
nself-chat v0.3.0 | GitHub | Issues | Discussions | Demo
Edit this page | MIT License | Β© 2026
(See π Security section below for 2FA, PIN Lock, and security audits.)
(Search lives in π Reference below.)
- π¬ Advanced Messaging
- π E2EE Setup
- π Search Setup
- π Call Management
- πΊ Live Streaming
- π₯οΈ Screen Sharing
- πΉ Video Calling
- ποΈ Voice Calling
- π± Mobile Optimization
- π§ͺ Testing
- π i18n
- π API Overview
- π Complete Reference
- π» API Examples
- π€ Bot API
- π Auth API
- π GraphQL Schema
- π Deployment Overview
- π³ Docker
- βΈοΈ Kubernetes
- β Helm Charts
- β Production Checklist
- π Production Validation
- π’ Multi-Tenant
- ποΈ Architecture
- π Diagrams
- ποΈ Database Schema
- π Project Structure
- π TypeScript Types
- π SPORT Reference
- π 2FA
- π¬ Messaging
- π Call Management
- π Call State Machine
- π E2EE
- πΊ Live Streaming
- π± Mobile Calls
- π PIN Lock
- π Polls
- π₯οΈ Screen Sharing
- π Search
- π Social Media
- ποΈ Voice Calling
- π Security Overview
- π‘οΈ Security Audit
- β‘ Performance
- π Best Practices
- π 2FA
- π PIN Lock
- π E2EE
- π‘οΈ E2EE Audit
v1.0.0 β’ 2026