mirror of
https://github.com/semantica-agi/semantica.git
synced 2026-08-29 04:26:20 +00:00
Add a Cite Us section to the README with BibTeX citation info, and align it with docs/citation.md (author/organization: Semantica, 2026). Update LICENSE and docs/project-license.md copyright holder to Semantica, and replace the stale Hawksight-AI GitHub org slug with semantica-agi across READMEs, plugin manifests, cookbook notebooks, and GitHub templates.
17 KiB
17 KiB
In [ ]:
!pip install -q semantica
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 [ ]:
from semantica.vector_store import VectorIndexer, FAISSStore
import numpy as np
# We use the first vector from the dataset as a sample query
if 'query_vector' not in locals():
if 'vectors' in locals() and len(vectors) > 0:
query_vector = vectors[0]
else:
# Fallback if vectors are also missing (safety check)
query_vector = np.random.rand(dimension).astype('float32')
# Create indexer
indexer = VectorIndexer(backend="faiss", dimension=dimension)
# Create HNSW index for fast approximate search
adapter = FAISSStore(dimension=dimension)
index = adapter.create_index(index_type="hnsw", metric="L2", m=16)
# Add vectors to index
vectors_array = np.array(vectors).astype('float32')
# FIX: Removed 'index' argument. The adapter uses its internal self.index
adapter.add_vectors(vectors_array, ids=vector_ids)
# Search using index
query_array = np.array(query_vector).astype('float32')
# FIX: Call search on the 'index' object directly, not the adapter
distances, indices = index.search(query_array.reshape(1, -1), k=10)
print(f"Index search found {len(indices[0])} results")
print(f"Distances: {distances[0][:5]}")In [ ]:
from semantica.vector_store import VectorIndexer, FAISSStore
# Get dimension from vectors to ensure consistency
dimension = len(vectors[0]) if len(vectors) > 0 else 384
# Create indexer
indexer = VectorIndexer(backend="faiss", dimension=dimension)
# Create HNSW index for fast approximate search
adapter = FAISSStore(dimension=dimension)
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(vectors_array, ids=vector_ids)
# Search using index
query_array = query_vector.astype('float32')
distances, indices = index.search(query_array.reshape(1, -1), k=10)
print(f"Index search found {len(indices[0])} results")
print(f"Distances: {distances[0][:5]}")In [ ]:
from semantica.vector_store import HybridSearch, MetadataFilter
import numpy as np
# Create hybrid search
hybrid_search = HybridSearch()
# Create metadata filter
filter = MetadataFilter() \
.eq("category", "science") \
.gt("year", 2021)
# Perform hybrid search
# Ensure vectors and metadata are available
if 'vectors' not in locals() or 'metadata' not in locals() or 'vector_ids' not in locals():
print("Warning: vectors, metadata, or vector_ids are missing. Please run previous cells.")
else:
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')}")