mirror of
https://github.com/semantica-agi/semantica.git
synced 2026-08-29 04:26:20 +00:00
13 KiB
13 KiB
In [ ]:
!pip install semantica
In [ ]:
from semantica.embeddings import TextEmbedder
# Choose provider and model
embedder = TextEmbedder(method="fastembed", model_name="BAAI/bge-small-en-v1.5")
dimension = embedder.get_embedding_dimension()
print(f"Selected model: {embedder.get_model_info()['model_name']}")
print(f"Embedding dimension: {dimension}")
In [ ]:
from semantica.vector_store import FAISSStore
import numpy as np
# Create some example vectors (like document embeddings)
vectors = np.random.rand(5000, 768).astype('float32')
query = np.random.rand(768).astype('float32')
adapter = FAISSStore(dimension=768)
# HNSW Index - Best for most cases
index = adapter.create_index(index_type="hnsw", metric="L2", m=16)
adapter.add_vectors(vectors, ids=[f"doc_{i}" for i in range(len(vectors))])
# Search for similar vectors
results = adapter.search_similar(query, k=5)
print("Found 5 most similar documents:")
for i, result in enumerate(results, 1):
print(f" {i}. Document {result['id']} (distance: {result['distance']:.3f})")In [ ]:
from semantica.vector_store import HybridSearch, MetadataFilter
import numpy as np
# Create sample documents with metadata
documents = [
{"id": 0, "text": "AI in Healthcare", "category": "Technology", "year": 2024},
{"id": 1, "text": "Machine Learning Basics", "category": "Technology", "year": 2023},
{"id": 2, "text": "Business Strategy", "category": "Business", "year": 2024},
{"id": 3, "text": "Data Science Guide", "category": "Technology", "year": 2024},
{"id": 4, "text": "Marketing Tips", "category": "Business", "year": 2023},
]
# Create vectors for each document
vectors = [np.random.rand(768) for _ in documents]
metadata = [{"category": d["category"], "year": d["year"]} for d in documents]
vector_ids = [f"doc_{d['id']}" for d in documents]
# Create search
search = HybridSearch()
query = np.random.rand(768)
# Example 1: Find Technology articles from 2024
filter1 = MetadataFilter().eq("category", "Technology").eq("year", 2024)
results = search.search(query, vectors, metadata, vector_ids, filter=filter1, k=10)
print("Technology articles from 2024:")
for r in results:
doc_id = int(r['id'].split('_')[1])
print(f" - {documents[doc_id]['text']}")
# Example 2: Find any article from 2024
filter2 = MetadataFilter().eq("year", 2024)
results2 = search.search(query, vectors, metadata, vector_ids, filter=filter2, k=10)
print("\nAll articles from 2024:")
for r in results2:
doc_id = int(r['id'].split('_')[1])
print(f" - {documents[doc_id]['text']} ({documents[doc_id]['category']})")In [ ]:
from semantica.vector_store import SearchRanker
# Simulate two different searches
# Search 1: Recent documents
recent_results = [
{"id": "doc_3", "score": 0.95, "source": "recent"},
{"id": "doc_0", "score": 0.90, "source": "recent"},
{"id": "doc_2", "score": 0.85, "source": "recent"},
]
# Search 2: Popular documents
popular_results = [
{"id": "doc_1", "score": 0.92, "source": "popular"},
{"id": "doc_3", "score": 0.88, "source": "popular"},
{"id": "doc_4", "score": 0.80, "source": "popular"},
]
# Method 1: Fair combination (RRF)
ranker = SearchRanker(strategy="reciprocal_rank_fusion")
combined = ranker.rank([recent_results, popular_results])
print("Combined results (fair ranking):")
for i, result in enumerate(combined[:3], 1):
doc_id = int(result['id'].split('_')[1])
print(f" {i}. {documents[doc_id]['text']} (score: {result['score']:.3f})")
# Method 2: Prefer recent documents (70% recent, 30% popular)
weighted_ranker = SearchRanker(strategy="weighted_average")
weighted_combined = weighted_ranker.rank(
[recent_results, popular_results],
weights=[0.7, 0.3]
)
print("\nCombined results (prefer recent):")
for i, result in enumerate(weighted_combined[:3], 1):
doc_id = int(result['id'].split('_')[1])
print(f" {i}. {documents[doc_id]['text']} (score: {result['score']:.3f})")In [ ]:
from semantica.vector_store import NamespaceManager
# Create manager
manager = NamespaceManager()
# Create separate spaces for each company
company_a = manager.create_namespace("company_a", "Company A's documents")
company_b = manager.create_namespace("company_b", "Company B's documents")
# Add documents to Company A
for i in range(10):
manager.add_vector_to_namespace(f"company_a_doc_{i}", "company_a")
# Add documents to Company B
for i in range(15):
manager.add_vector_to_namespace(f"company_b_doc_{i}", "company_b")
# Get each company's documents
a_docs = manager.get_namespace_vectors("company_a")
b_docs = manager.get_namespace_vectors("company_b")
print(f"Company A has {len(a_docs)} documents")
print(f"Company B has {len(b_docs)} documents")
# Set permissions (who can access what)
company_a.set_access_control("admin@companya.com", ["read", "write", "delete"])
company_a.set_access_control("user@companya.com", ["read"]) # Read-only
# Check permissions
print(f"\nAdmin can delete: {company_a.has_permission('admin@companya.com', 'delete')}")
print(f"User can delete: {company_a.has_permission('user@companya.com', 'delete')}")