mirror of
https://github.com/semantica-agi/semantica.git
synced 2026-08-29 04:26:20 +00:00
24 KiB
24 KiB
In [ ]:
from semantica.vector_store import VectorStore
from semantica.embeddings import TextEmbedder
import numpy as np
# 1. Initialize Embedder (Select Provider & Model)
# You can choose 'sentence_transformers' or 'fastembed'
embedder = TextEmbedder(method="sentence_transformers", model_name="all-MiniLM-L6-v2")
dimension = embedder.get_embedding_dimension()
# 2. Create vector store
store = VectorStore(backend="faiss", dimension=dimension)
# 3. Generate Real Embeddings
texts = [f"Document {i}" for i in range(100)]
vectors = embedder.embed_batch(texts)
metadata = [
{"text": txt, "category": "science" if i % 2 == 0 else "technology", "year": 2020 + (i % 4)}
for i, txt in enumerate(texts)
]
# 4. Store vectors
vector_ids = store.store_vectors(vectors, metadata=metadata)
print(f"Stored {len(vector_ids)} vectors")
print(f"First 3 IDs: {vector_ids[:3]}")In [ ]:
# Create query vector
query_vector = np.random.rand(768)
# Search for similar vectors
results = store.search_vectors(query_vector, k=10)
print(f"Found {len(results)} similar vectors")
print("\nTop 5 results:")
for i, result in enumerate(results[:5], 1):
print(f"{i}. ID: {result['id']}, Score: {result['score']:.3f}")
print(f" Metadata: {result.get('metadata', {})}")In [ ]:
from semantica.vector_store import VectorIndexer, FAISSAdapter
# Create indexer
indexer = VectorIndexer(backend="faiss", dimension=768)
# Create HNSW index for fast approximate search
adapter = FAISSAdapter(dimension=768)
index = adapter.create_index(index_type="hnsw", metric="L2", m=16)
# Add vectors to index
vectors_array = np.array(vectors).astype('float32')
adapter.add_vectors(index, vectors_array, ids=vector_ids)
# Search using index
query_array = query_vector.astype('float32')
distances, indices = adapter.search(index, query_array, k=10)
print(f"Index search found {len(indices)} results")
print(f"Distances: {distances[:5]}")In [ ]:
from semantica.vector_store import HybridSearch, MetadataFilter
# Create hybrid search
hybrid_search = HybridSearch()
# Create metadata filter
filter = MetadataFilter() \
.eq("category", "science") \
.gt("year", 2021)
# Perform hybrid search
hybrid_results = hybrid_search.search(
query_vector,
vectors,
metadata,
vector_ids,
filter=filter,
k=10
)
print(f"Hybrid search found {len(hybrid_results)} results")
print("\nFiltered results (science, year > 2021):")
for i, result in enumerate(hybrid_results[:5], 1):
meta = result.get('metadata', {})
print(f"{i}. Category: {meta.get('category')}, Year: {meta.get('year')}, Score: {result['score']:.3f}")In [ ]:
from semantica.vector_store import MetadataStore, MetadataSchema
# Create metadata store
meta_store = MetadataStore()
# Store metadata
for i, vec_id in enumerate(vector_ids[:10]):
meta_store.store_metadata(vec_id, metadata[i])
# Query metadata
matching_ids = meta_store.query_metadata(
{"category": "science"},
operator="AND"
)
print(f"Found {len(matching_ids)} vectors with category='science'")
# Define schema for validation
schema = MetadataSchema({
"text": {"type": str, "required": True},
"category": {"type": str, "required": True},
"year": {"type": int, "required": True}
})
# Validate metadata
is_valid = schema.validate(metadata[0])
print(f"\nMetadata validation: {is_valid}")In [ ]:
from semantica.vector_store import SearchRanker
# Create ranker with RRF strategy
ranker = SearchRanker(strategy="reciprocal_rank_fusion")
# Simulate multiple search results
results1 = [
{"id": "vec_1", "score": 0.9},
{"id": "vec_2", "score": 0.8},
{"id": "vec_3", "score": 0.7}
]
results2 = [
{"id": "vec_2", "score": 0.85},
{"id": "vec_4", "score": 0.75},
{"id": "vec_1", "score": 0.7}
]
# Fuse results using RRF
fused_results = ranker.rank([results1, results2], k=60)
print("Fused results using RRF:")
for i, result in enumerate(fused_results, 1):
print(f"{i}. ID: {result['id']}, Fused Score: {result['score']:.3f}")In [ ]:
from semantica.vector_store import NamespaceManager
# Create namespace manager
ns_manager = NamespaceManager()
# Create namespaces for different tenants
ns1 = ns_manager.create_namespace("tenant1", "Tenant 1 vectors")
ns2 = ns_manager.create_namespace("tenant2", "Tenant 2 vectors")
# Add vectors to namespaces
for i in range(5):
ns_manager.add_vector_to_namespace(f"t1_vec_{i}", "tenant1")
ns_manager.add_vector_to_namespace(f"t2_vec_{i}", "tenant2")
# Get namespace vectors
tenant1_vectors = ns_manager.get_namespace_vectors("tenant1")
tenant2_vectors = ns_manager.get_namespace_vectors("tenant2")
print(f"Tenant 1: {len(tenant1_vectors)} vectors")
print(f"Tenant 2: {len(tenant2_vectors)} vectors")
# Set access control
ns1.set_access_control("user1", ["read", "write"])
ns1.set_access_control("user2", ["read"])
print(f"\nUser1 can write: {ns1.has_permission('user1', 'write')}")
print(f"User2 can write: {ns1.has_permission('user2', 'write')}")In [ ]:
from semantica.vector_store import (
store_vectors,
search_vectors,
hybrid_search as hybrid_search_func,
update_vectors,
delete_vectors
)
# Store vectors using convenience function
new_vectors = [np.random.rand(768) for _ in range(10)]
new_metadata = [{"text": f"New doc {i}"} for i in range(10)]
new_ids = store_vectors(new_vectors, metadata=new_metadata, method="default")
print(f"Stored {len(new_ids)} new vectors")
# Search using convenience function
search_results = search_vectors(
query_vector,
new_vectors,
new_ids,
k=5,
method="default"
)
print(f"Search found {len(search_results)} results")
# Update vectors
updated_vectors = [np.random.rand(768) for _ in range(2)]
success = update_vectors(new_ids[:2], updated_vectors, method="default")
print(f"\nUpdated vectors: {success}")
# Delete vectors
success = delete_vectors(new_ids[-2:], method="default")
print(f"Deleted vectors: {success}")In [ ]:
from semantica.vector_store import FAISSAdapter, VectorManager
# FAISS (local)
faiss_adapter = FAISSAdapter(dimension=768)
faiss_index = faiss_adapter.create_index(index_type="flat", metric="L2")
print("Created FAISS index")
# Vector Manager for multi-store management
manager = VectorManager()
faiss_store = manager.create_store("faiss", {"dimension": 768})
print(f"\nCreated store via manager")
# List all stores
stores = manager.list_stores()
print(f"Active stores: {stores}")
# Note: For cloud backends (Pinecone, Weaviate, etc.),
# you would need API keys and endpoints
# Example:
# from semantica.vector_store import PineconeAdapter
# pinecone = PineconeAdapter(api_key="your-key", environment="us-west1-gcp")