Files
ruflo/docs/ruvector-postgres/examples/v3-demo.sql
T
rUvandClaude Opus 4.5 d1ab350ef1 Checkpoint: File edits
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-17T20:31:13Z
- Changes: 1 file(s)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 20:31:13 +00:00

637 lines
21 KiB
PL/PgSQL

-- ============================================
-- RUVECTOR POSTGRESQL V3 COMPREHENSIVE DEMO
-- ============================================
--
-- Complete demonstration of RuVector PostgreSQL Bridge
-- optimized for Claude-Flow V3 features:
--
-- - HNSW Indexing (150x-12,500x faster search)
-- - SONA Integration (pattern learning)
-- - Multi-agent memory coordination
-- - Neural attention mechanisms
-- - Hyperbolic embeddings (Poincaré ball)
-- - Int8 quantization (3.92x memory reduction)
--
-- Run this script to set up a fully-featured demo environment
-- ============================================
-- PART 1: SCHEMA SETUP
-- ============================================
\echo '======================================'
\echo 'Part 1: Schema Setup'
\echo '======================================'
-- Ensure we're using the correct schema
SET search_path TO claude_flow, public;
-- Enable required extensions
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS pgcrypto;
-- Create enhanced tables for V3 features
-- SONA Trajectories for reinforcement learning
CREATE TABLE IF NOT EXISTS claude_flow.trajectories (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
trajectory_id VARCHAR(255) NOT NULL UNIQUE,
agent_type VARCHAR(50),
task_description TEXT,
status VARCHAR(20) DEFAULT 'in_progress',
steps JSONB DEFAULT '[]',
outcome VARCHAR(20), -- 'success', 'failure', 'partial'
quality_score FLOAT,
started_at TIMESTAMPTZ DEFAULT NOW(),
ended_at TIMESTAMPTZ,
metadata JSONB DEFAULT '{}'
);
-- ReasoningBank patterns with confidence tracking
CREATE TABLE IF NOT EXISTS claude_flow.reasoning_patterns (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
pattern_id VARCHAR(255) NOT NULL UNIQUE,
pattern_type VARCHAR(50),
description TEXT,
embedding vector(384),
confidence FLOAT DEFAULT 0.5,
success_count INT DEFAULT 0,
failure_count INT DEFAULT 0,
last_used TIMESTAMPTZ,
ewc_importance FLOAT DEFAULT 1.0, -- EWC++ importance weight
created_at TIMESTAMPTZ DEFAULT NOW(),
metadata JSONB DEFAULT '{}'
);
-- Hyperbolic embeddings table (Poincaré ball model)
CREATE TABLE IF NOT EXISTS claude_flow.hyperbolic_embeddings (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
content TEXT NOT NULL,
euclidean_embedding vector(384),
poincare_embedding vector(384), -- In Poincaré ball (||x|| < 1)
curvature FLOAT DEFAULT -1.0,
hierarchy_level INT DEFAULT 0,
parent_id UUID REFERENCES claude_flow.hyperbolic_embeddings(id),
created_at TIMESTAMPTZ DEFAULT NOW(),
metadata JSONB DEFAULT '{}'
);
-- Create HNSW indices for optimal V3 performance
CREATE INDEX IF NOT EXISTS idx_reasoning_patterns_hnsw
ON claude_flow.reasoning_patterns
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 100);
CREATE INDEX IF NOT EXISTS idx_hyperbolic_hnsw
ON claude_flow.hyperbolic_embeddings
USING hnsw (euclidean_embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 100);
\echo 'Schema setup complete'
-- ============================================
-- PART 2: SONA TRAJECTORY FUNCTIONS
-- ============================================
\echo ''
\echo '======================================'
\echo 'Part 2: SONA Trajectory Functions'
\echo '======================================'
-- Start a new learning trajectory
CREATE OR REPLACE FUNCTION claude_flow.trajectory_start(
p_task TEXT,
p_agent_type TEXT DEFAULT 'general'
)
RETURNS TEXT AS $$
DECLARE
v_trajectory_id TEXT;
BEGIN
v_trajectory_id := 'traj-' || encode(gen_random_bytes(8), 'hex');
INSERT INTO claude_flow.trajectories (trajectory_id, agent_type, task_description)
VALUES (v_trajectory_id, p_agent_type, p_task);
RETURN v_trajectory_id;
END;
$$ LANGUAGE plpgsql;
-- Record a step in the trajectory
CREATE OR REPLACE FUNCTION claude_flow.trajectory_step(
p_trajectory_id TEXT,
p_action TEXT,
p_result TEXT DEFAULT NULL,
p_quality FLOAT DEFAULT 0.5
)
RETURNS VOID AS $$
BEGIN
UPDATE claude_flow.trajectories
SET steps = steps || jsonb_build_object(
'action', p_action,
'result', p_result,
'quality', p_quality,
'timestamp', NOW()
)::jsonb
WHERE trajectory_id = p_trajectory_id;
END;
$$ LANGUAGE plpgsql;
-- End trajectory and trigger learning
CREATE OR REPLACE FUNCTION claude_flow.trajectory_end(
p_trajectory_id TEXT,
p_success BOOLEAN,
p_feedback TEXT DEFAULT NULL
)
RETURNS TABLE (
trajectory_id TEXT,
total_steps INT,
avg_quality FLOAT,
outcome TEXT
) AS $$
DECLARE
v_steps JSONB;
v_avg_quality FLOAT;
v_outcome TEXT;
BEGIN
-- Update trajectory status
v_outcome := CASE WHEN p_success THEN 'success' ELSE 'failure' END;
UPDATE claude_flow.trajectories t
SET
status = 'completed',
outcome = v_outcome,
ended_at = NOW(),
metadata = metadata || jsonb_build_object('feedback', p_feedback)
WHERE t.trajectory_id = p_trajectory_id
RETURNING t.steps INTO v_steps;
-- Calculate average quality
SELECT AVG((s->>'quality')::FLOAT)
INTO v_avg_quality
FROM jsonb_array_elements(v_steps) AS s;
-- Update quality score
UPDATE claude_flow.trajectories
SET quality_score = v_avg_quality
WHERE trajectories.trajectory_id = p_trajectory_id;
RETURN QUERY
SELECT
p_trajectory_id,
jsonb_array_length(v_steps)::INT,
COALESCE(v_avg_quality, 0.0)::FLOAT,
v_outcome;
END;
$$ LANGUAGE plpgsql;
\echo 'SONA trajectory functions created'
-- ============================================
-- PART 3: REASONINGBANK PATTERN LEARNING
-- ============================================
\echo ''
\echo '======================================'
\echo 'Part 3: ReasoningBank Pattern Learning'
\echo '======================================'
-- Store a pattern with embedding
CREATE OR REPLACE FUNCTION claude_flow.pattern_store(
p_pattern_id TEXT,
p_description TEXT,
p_embedding vector(384),
p_type TEXT DEFAULT 'general',
p_initial_confidence FLOAT DEFAULT 0.5
)
RETURNS UUID AS $$
DECLARE
v_id UUID;
BEGIN
INSERT INTO claude_flow.reasoning_patterns (
pattern_id, pattern_type, description, embedding, confidence
)
VALUES (p_pattern_id, p_type, p_description, p_embedding, p_initial_confidence)
ON CONFLICT (pattern_id) DO UPDATE SET
description = EXCLUDED.description,
embedding = EXCLUDED.embedding,
last_used = NOW()
RETURNING id INTO v_id;
RETURN v_id;
END;
$$ LANGUAGE plpgsql;
-- Search patterns with HNSW (150x faster)
CREATE OR REPLACE FUNCTION claude_flow.pattern_search(
p_query_embedding vector(384),
p_limit INT DEFAULT 5,
p_min_confidence FLOAT DEFAULT 0.3,
p_type_filter TEXT DEFAULT NULL
)
RETURNS TABLE (
pattern_id TEXT,
description TEXT,
similarity FLOAT,
confidence FLOAT,
success_rate FLOAT,
pattern_type TEXT
) AS $$
BEGIN
-- Set HNSW search parameters for optimal recall
SET LOCAL hnsw.ef_search = 100;
RETURN QUERY
SELECT
rp.pattern_id,
rp.description,
(1 - (rp.embedding <=> p_query_embedding))::FLOAT AS sim,
rp.confidence,
CASE
WHEN (rp.success_count + rp.failure_count) > 0
THEN rp.success_count::FLOAT / (rp.success_count + rp.failure_count)
ELSE 0.5
END AS success_rate,
rp.pattern_type
FROM claude_flow.reasoning_patterns rp
WHERE rp.embedding IS NOT NULL
AND rp.confidence >= p_min_confidence
AND (p_type_filter IS NULL OR rp.pattern_type = p_type_filter)
ORDER BY rp.embedding <=> p_query_embedding
LIMIT p_limit;
END;
$$ LANGUAGE plpgsql;
-- Update pattern confidence with EWC++ inspired importance weighting
CREATE OR REPLACE FUNCTION claude_flow.pattern_feedback(
p_pattern_id TEXT,
p_success BOOLEAN,
p_quality FLOAT DEFAULT 0.5
)
RETURNS VOID AS $$
DECLARE
v_current_confidence FLOAT;
v_learning_rate FLOAT := 0.1;
v_ewc_lambda FLOAT := 0.5; -- EWC++ regularization strength
BEGIN
SELECT confidence INTO v_current_confidence
FROM claude_flow.reasoning_patterns
WHERE pattern_id = p_pattern_id;
-- Update with EWC++-inspired update rule
UPDATE claude_flow.reasoning_patterns
SET
confidence = GREATEST(0.0, LEAST(1.0,
v_current_confidence +
v_learning_rate * ewc_importance * (p_quality - v_current_confidence)
)),
success_count = success_count + CASE WHEN p_success THEN 1 ELSE 0 END,
failure_count = failure_count + CASE WHEN NOT p_success THEN 1 ELSE 0 END,
last_used = NOW(),
-- Increase importance for frequently used patterns
ewc_importance = LEAST(2.0, ewc_importance + 0.1)
WHERE pattern_id = p_pattern_id;
END;
$$ LANGUAGE plpgsql;
\echo 'ReasoningBank functions created'
-- ============================================
-- PART 4: HYPERBOLIC EMBEDDINGS
-- ============================================
\echo ''
\echo '======================================'
\echo 'Part 4: Hyperbolic Embeddings'
\echo '======================================'
-- Convert Euclidean to Poincaré ball embedding
CREATE OR REPLACE FUNCTION claude_flow.euclidean_to_poincare(
p_euclidean vector(384),
p_curvature FLOAT DEFAULT -1.0
)
RETURNS vector(384) AS $$
DECLARE
v_norm FLOAT;
v_scale FLOAT;
v_result FLOAT[];
v_dim INT := 384;
BEGIN
-- Get L2 norm
SELECT sqrt(SUM(val * val))
INTO v_norm
FROM unnest(p_euclidean::float[]) AS val;
-- Map to Poincaré ball: x / (1 + sqrt(1 + |c| * ||x||^2))
v_scale := 1.0 / (1.0 + sqrt(1.0 + abs(p_curvature) * v_norm * v_norm));
SELECT array_agg(val * v_scale)
INTO v_result
FROM unnest(p_euclidean::float[]) AS val;
RETURN v_result::vector(384);
END;
$$ LANGUAGE plpgsql IMMUTABLE;
-- Poincaré distance (geodesic in hyperbolic space)
CREATE OR REPLACE FUNCTION claude_flow.poincare_distance(
p_x vector(384),
p_y vector(384),
p_curvature FLOAT DEFAULT -1.0
)
RETURNS FLOAT AS $$
DECLARE
v_x_norm_sq FLOAT;
v_y_norm_sq FLOAT;
v_diff_norm_sq FLOAT;
v_numerator FLOAT;
v_denominator FLOAT;
BEGIN
-- ||x||^2
SELECT SUM(val * val) INTO v_x_norm_sq
FROM unnest(p_x::float[]) AS val;
-- ||y||^2
SELECT SUM(val * val) INTO v_y_norm_sq
FROM unnest(p_y::float[]) AS val;
-- ||x - y||^2
SELECT SUM((a - b) * (a - b)) INTO v_diff_norm_sq
FROM unnest(p_x::float[], p_y::float[]) AS t(a, b);
-- Poincaré distance formula
v_numerator := 2.0 * v_diff_norm_sq;
v_denominator := (1.0 - v_x_norm_sq) * (1.0 - v_y_norm_sq);
IF v_denominator <= 0 THEN
RETURN 999999.0; -- Points outside ball
END IF;
RETURN (1.0 / sqrt(abs(p_curvature))) *
acosh(1.0 + v_numerator / v_denominator);
END;
$$ LANGUAGE plpgsql IMMUTABLE;
-- Search in hyperbolic space (for hierarchical data)
CREATE OR REPLACE FUNCTION claude_flow.hyperbolic_search(
p_query_embedding vector(384),
p_limit INT DEFAULT 10,
p_curvature FLOAT DEFAULT -1.0
)
RETURNS TABLE (
id UUID,
content TEXT,
euclidean_distance FLOAT,
poincare_distance FLOAT,
hierarchy_level INT,
metadata JSONB
) AS $$
DECLARE
v_query_poincare vector(384);
BEGIN
-- Convert query to Poincaré space
v_query_poincare := claude_flow.euclidean_to_poincare(p_query_embedding, p_curvature);
RETURN QUERY
SELECT
he.id,
he.content,
(he.euclidean_embedding <=> p_query_embedding)::FLOAT AS euc_dist,
claude_flow.poincare_distance(he.poincare_embedding, v_query_poincare, p_curvature) AS poinc_dist,
he.hierarchy_level,
he.metadata
FROM claude_flow.hyperbolic_embeddings he
WHERE he.euclidean_embedding IS NOT NULL
ORDER BY he.euclidean_embedding <=> p_query_embedding -- Use HNSW for initial filtering
LIMIT p_limit * 2 -- Fetch more for re-ranking
)
-- Re-rank by Poincaré distance
ORDER BY poinc_dist
LIMIT p_limit;
END;
$$ LANGUAGE plpgsql;
\echo 'Hyperbolic embedding functions created'
-- ============================================
-- PART 5: AGENT MEMORY COORDINATION
-- ============================================
\echo ''
\echo '======================================'
\echo 'Part 5: Agent Memory Coordination'
\echo '======================================'
-- Multi-agent memory sharing
CREATE OR REPLACE FUNCTION claude_flow.share_agent_memory(
p_source_agent TEXT,
p_target_agents TEXT[],
p_knowledge_filter JSONB DEFAULT NULL
)
RETURNS TABLE (
target_agent TEXT,
patterns_shared INT,
similarity_threshold FLOAT
) AS $$
DECLARE
v_source_embedding vector(384);
v_target TEXT;
v_shared_count INT;
BEGIN
-- Get source agent's memory embedding
SELECT memory_embedding INTO v_source_embedding
FROM claude_flow.agents
WHERE agent_id = p_source_agent;
IF v_source_embedding IS NULL THEN
RAISE EXCEPTION 'Source agent % not found or has no memory', p_source_agent;
END IF;
-- Share with each target agent
FOREACH v_target IN ARRAY p_target_agents LOOP
-- Find relevant patterns from source
WITH relevant_patterns AS (
SELECT embedding, confidence
FROM claude_flow.reasoning_patterns
WHERE (1 - (embedding <=> v_source_embedding)) > 0.5
AND (p_knowledge_filter IS NULL OR metadata @> p_knowledge_filter)
ORDER BY embedding <=> v_source_embedding
LIMIT 10
)
-- Update target agent's memory (weighted average)
UPDATE claude_flow.agents
SET
memory_embedding = (
SELECT AVG(embedding)::vector(384)
FROM (
SELECT memory_embedding AS embedding FROM claude_flow.agents WHERE agent_id = v_target
UNION ALL
SELECT embedding FROM relevant_patterns
) combined
),
last_active = NOW()
WHERE agent_id = v_target;
GET DIAGNOSTICS v_shared_count = ROW_COUNT;
target_agent := v_target;
patterns_shared := v_shared_count;
similarity_threshold := 0.5;
RETURN NEXT;
END LOOP;
END;
$$ LANGUAGE plpgsql;
-- Find agents with complementary knowledge
CREATE OR REPLACE FUNCTION claude_flow.find_complementary_agents(
p_task_embedding vector(384),
p_exclude_agents TEXT[] DEFAULT ARRAY[]::TEXT[],
p_limit INT DEFAULT 3
)
RETURNS TABLE (
agent_id TEXT,
agent_type TEXT,
relevance_score FLOAT,
complementary_score FLOAT,
combined_score FLOAT
) AS $$
BEGIN
RETURN QUERY
WITH agent_relevance AS (
SELECT
a.agent_id,
a.agent_type,
a.memory_embedding,
(1 - (a.memory_embedding <=> p_task_embedding))::FLOAT AS relevance
FROM claude_flow.agents a
WHERE a.memory_embedding IS NOT NULL
AND a.agent_id != ALL(p_exclude_agents)
),
agent_pairs AS (
SELECT
ar1.agent_id,
ar1.agent_type,
ar1.relevance,
-- Complementary = different from already selected
COALESCE(
1 - MAX(1 - (ar1.memory_embedding <=> ar2.memory_embedding)),
1.0
)::FLOAT AS complementary
FROM agent_relevance ar1
LEFT JOIN agent_relevance ar2 ON ar2.agent_id = ANY(p_exclude_agents)
GROUP BY ar1.agent_id, ar1.agent_type, ar1.relevance, ar1.memory_embedding
)
SELECT
ap.agent_id,
ap.agent_type,
ap.relevance,
ap.complementary,
(0.6 * ap.relevance + 0.4 * ap.complementary)::FLOAT AS combined
FROM agent_pairs ap
ORDER BY combined DESC
LIMIT p_limit;
END;
$$ LANGUAGE plpgsql;
\echo 'Agent coordination functions created'
-- ============================================
-- PART 6: DEMO DATA
-- ============================================
\echo ''
\echo '======================================'
\echo 'Part 6: Loading Demo Data'
\echo '======================================'
-- Insert sample embeddings with realistic metadata
INSERT INTO claude_flow.embeddings (content, metadata) VALUES
('Implementing JWT authentication with refresh token rotation',
'{"category": "security", "language": "typescript", "complexity": "medium", "agent": "security-architect"}'),
('Building a RESTful API with Express and TypeScript',
'{"category": "backend", "language": "typescript", "complexity": "low", "agent": "coder"}'),
('Setting up PostgreSQL with pgvector for semantic search',
'{"category": "database", "language": "sql", "complexity": "medium", "agent": "architect"}'),
('Implementing HNSW indexing for fast vector similarity search',
'{"category": "performance", "language": "sql", "complexity": "high", "agent": "perf-engineer"}'),
('Creating a React component with TDD London School approach',
'{"category": "frontend", "language": "typescript", "complexity": "medium", "agent": "tester"}'),
('Setting up CI/CD pipeline with GitHub Actions',
'{"category": "devops", "language": "yaml", "complexity": "medium", "agent": "cicd-engineer"}'),
('Implementing rate limiting with sliding window algorithm',
'{"category": "security", "language": "typescript", "complexity": "high", "agent": "security-architect"}'),
('Building a multi-agent swarm with hierarchical coordination',
'{"category": "ai", "language": "typescript", "complexity": "high", "agent": "architect"}'),
('Optimizing database queries with EXPLAIN ANALYZE',
'{"category": "database", "language": "sql", "complexity": "medium", "agent": "perf-engineer"}'),
('Implementing EWC++ for continual learning without forgetting',
'{"category": "ai", "language": "python", "complexity": "high", "agent": "ml-developer"}')
ON CONFLICT DO NOTHING;
-- Insert sample agents
INSERT INTO claude_flow.agents (agent_id, agent_type, state) VALUES
('coder-001', 'coder', '{"specializations": ["typescript", "react"], "tasks_completed": 42}'),
('architect-001', 'architect', '{"specializations": ["system-design", "ddd"], "tasks_completed": 28}'),
('tester-001', 'tester', '{"specializations": ["tdd", "integration"], "tasks_completed": 35}'),
('security-001', 'security-architect', '{"specializations": ["auth", "crypto"], "tasks_completed": 15}'),
('perf-001', 'perf-engineer', '{"specializations": ["database", "caching"], "tasks_completed": 22}')
ON CONFLICT (agent_id) DO UPDATE SET
state = EXCLUDED.state,
last_active = NOW();
-- Insert sample reasoning patterns
INSERT INTO claude_flow.reasoning_patterns (pattern_id, pattern_type, description, confidence) VALUES
('auth-jwt-refresh', 'security', 'JWT with refresh token rotation pattern', 0.92),
('api-rest-design', 'architecture', 'RESTful API design with proper status codes', 0.88),
('db-index-btree', 'performance', 'B-tree index for range queries', 0.85),
('db-index-hnsw', 'performance', 'HNSW index for vector similarity', 0.95),
('tdd-london-mock', 'testing', 'London School TDD with mocks first', 0.82),
('swarm-hierarchical', 'coordination', 'Hierarchical swarm with queen coordinator', 0.90)
ON CONFLICT (pattern_id) DO NOTHING;
\echo 'Demo data loaded'
-- ============================================
-- PART 7: VERIFICATION QUERIES
-- ============================================
\echo ''
\echo '======================================'
\echo 'Part 7: Verification'
\echo '======================================'
-- Count records
SELECT 'embeddings' AS table_name, COUNT(*) AS count FROM claude_flow.embeddings
UNION ALL
SELECT 'patterns', COUNT(*) FROM claude_flow.patterns
UNION ALL
SELECT 'agents', COUNT(*) FROM claude_flow.agents
UNION ALL
SELECT 'reasoning_patterns', COUNT(*) FROM claude_flow.reasoning_patterns
UNION ALL
SELECT 'trajectories', COUNT(*) FROM claude_flow.trajectories;
-- Show indices
SELECT indexname, indexdef
FROM pg_indexes
WHERE schemaname = 'claude_flow'
AND indexdef LIKE '%hnsw%';
\echo ''
\echo '======================================'
\echo 'RuVector V3 Demo Setup Complete!'
\echo '======================================'
\echo ''
\echo 'Available functions:'
\echo ' - claude_flow.semantic_search(embedding, limit, threshold)'
\echo ' - claude_flow.rag_retrieve(embedding, coarse_limit, final_limit)'
\echo ' - claude_flow.hybrid_search(embedding, keyword, limit)'
\echo ' - claude_flow.trajectory_start(task, agent_type)'
\echo ' - claude_flow.trajectory_step(id, action, result, quality)'
\echo ' - claude_flow.trajectory_end(id, success, feedback)'
\echo ' - claude_flow.pattern_store(id, desc, embedding, type)'
\echo ' - claude_flow.pattern_search(embedding, limit, confidence)'
\echo ' - claude_flow.pattern_feedback(id, success, quality)'
\echo ' - claude_flow.hyperbolic_search(embedding, limit, curvature)'
\echo ' - claude_flow.share_agent_memory(source, targets, filter)'
\echo ' - claude_flow.find_complementary_agents(task_embedding)'
\echo ''