🧩 Exercícios: Bancos Vetoriais de Alta Performance
Extra Inteligencia Artificial • Trilha Progressiva em 4 Níveis
🧭 Navegação Pedagógica
-
📖 Teoria do Capítulo 💻 Exemplos 📊 Slides 🧠 Quiz
🎯 Nível 1: Fundamentos
Problema 05.1 — Armazenamento e Consulta em Memória de Índices Vetoriais
Contexto: Armazenamento e Consulta em Memória de Índices Vetoriais no contexto de Bancos Vetoriais de Alta Performance.
Requisitos de Execução:
- Criar classe de banco vetorial com métodos
insert(id, text, vector)equery(vector, top_k). - Retornar resultados com pontuações calculadas.
Resultado Esperado
Inseridos 3 vetores na base.
Consulta top_k=1 -> Documento retornado: 'PostgreSQL e pgvector'
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_05_1_SeuNome - Envie na tarefa:
Atividade Cap 05 - Bancos Vetoriais de Alta Performance
🔑 Gabarito de Código & Solução Comentada
# in_memory_vectordb.py
import math
class SimpleVectorStore:
def __init__(self):
self.registros = []
def insert(self, doc_id, texto, vetor):
self.registros.append({"id": doc_id, "texto": texto, "vetor": vetor})
def query(self, vetor_busca, top_k=1):
def cos_sim(v1, v2):
dot = sum(a * b for a, b in zip(v1, v2))
n1 = math.sqrt(sum(a**2 for a in v1))
n2 = math.sqrt(sum(b**2 for b in v2))
return dot / (n1 * n2)
scores = [(cos_sim(vetor_busca, r["vetor"]), r) for r in self.registros]
scores.sort(reverse=True, key=lambda x: x[0])
return scores[:top_k]
db = SimpleVectorStore()
db.insert(1, "PostgreSQL e pgvector", [0.9, 0.8])
db.insert(2, "Design de Interfaces UI", [0.1, 0.9])
resultado = db.query([0.95, 0.75], top_k=1)
print(f"Top 1: {resultado[0][1]['texto']} (Score: {resultado[0][0]:.2f})")
🔍 Nível 2: Prática
Problema 05.2 — Indexação Inverted File Index (IVF) com Partições de Centróides
Contexto: Indexação Inverted File Index (IVF) com Partições de Centróides no contexto de Bancos Vetoriais de Alta Performance.
Requisitos de Execução:
- Particionar vetores em 2 centróides (Voronoi Cells).
- Durante a busca, consultar apenas a partição do centróide mais próximo para acelerar a query.
Resultado Esperado
Vetor atribuído ao Centróide 1 (Cluster de Backend).
Busca restrita a 2 candidatos em vez de varrer base total.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_05_2_SeuNome - Envie na tarefa:
Atividade Cap 05 - Bancos Vetoriais de Alta Performance
🔑 Gabarito de Código & Solução Comentada
# ivf_indexing.py
import math
def dist(u, v): return math.sqrt(sum((a-b)**2 for a, b in zip(u, v)))
centroides = {"C1": [1.0, 1.0], "C2": [8.0, 8.0]}
particoes = {"C1": [], "C2": []}
base_dados = [
{"id": 1, "vec": [1.2, 0.9], "tag": "DB Relacional"},
{"id": 2, "vec": [8.1, 7.9], "tag": "Design UI"},
{"id": 3, "vec": [1.1, 1.3], "tag": "Backend API"}
]
for item in base_dados:
melhor_c = "C1" if dist(item["vec"], centroides["C1"]) < dist(item["vec"], centroides["C2"]) else "C2"
particoes[melhor_c].append(item)
query = [1.0, 1.1]
c_proximo = "C1" if dist(query, centroides["C1"]) < dist(query, centroides["C2"]) else "C2"
candidatos = particoes[c_proximo]
print(f"Centróide Escolhido: {c_proximo} | Candidatos Filtrados: {[c['tag'] for c in candidatos]}")
⚡ Nível 3: Integração
Problema 05.3 — Busca Híbrida: Combinação Linear de BM25 e Recuperação Vetorial
Contexto: Busca Híbrida: Combinação Linear de BM25 e Recuperação Vetorial no contexto de Bancos Vetoriais de Alta Performance.
Requisitos de Execução:
- Combinar score de palavra-chave (léxico) com score de similaridade vetorial (denso): $Score = lpha \cdot S_{lex} + (1 - lpha) \cdot S_{vec}$.
Resultado Esperado
Documento 1 -> Léxico: 1.0, Vetorial: 0.85 -> Score Híbrido: 0.91
Documento 2 -> Léxico: 0.0, Vetorial: 0.95 -> Score Híbrido: 0.57
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_05_3_SeuNome - Envie na tarefa:
Atividade Cap 05 - Bancos Vetoriais de Alta Performance
🔑 Gabarito de Código & Solução Comentada
# hybrid_search_fusion.py
def fusao_hibrida(score_lexico, score_vetorial, alpha=0.4):
return round(alpha * score_lexico + (1 - alpha) * score_vetorial, 3)
docs = [
{"id": 1, "titulo": "Postgres Indexes", "lex": 1.0, "vec": 0.85},
{"id": 2, "titulo": "Database Tuning", "lex": 0.0, "vec": 0.95}
]
for d in docs:
h_score = fusao_hibrida(d["lex"], d["vec"], alpha=0.4)
print(f"Doc: '{d['titulo']}' -> Score Híbrido: {h_score}")
🏆 Nível 4: Desafio Corporativo
Problema 05.4 — Gerenciador de Coleções Vetoriais com Filtragem de Metadados
Contexto: Gerenciador de Coleções Vetoriais com Filtragem de Metadados no contexto de Bancos Vetoriais de Alta Performance.
Requisitos de Execução:
- Implementar busca vetorial combinada com filtros relacionais (ex.:
categoria == 'tecnologia'edata >= 2025).
Resultado Esperado
Busca com Filtro [categoria='tecnologia']: 1 documento qualificado retornado.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_05_4_SeuNome - Envie na tarefa:
Atividade Cap 05 - Bancos Vetoriais de Alta Performance
🔑 Gabarito de Código & Solução Comentada
# metadata_filtering_db.py
class FilterableVectorDB:
def __init__(self):
self.docs = []
def add(self, doc_id, text, vec, meta):
self.docs.append({"id": doc_id, "text": text, "vec": vec, "meta": meta})
def search(self, q_vec, where_filter):
qualificados = []
for d in self.docs:
match = all(d["meta"].get(k) == v for k, v in where_filter.items())
if match:
score = sum(a * b for a, b in zip(q_vec, d["vec"]))
qualificados.append((score, d))
qualificados.sort(reverse=True, key=lambda x: x[0])
return qualificados
db = FilterableVectorDB()
db.add(1, "Postgres Guia", [1.0, 0.0], {"cat": "tech", "ano": 2026})
db.add(2, "Finanças Pessoais", [0.9, 0.1], {"cat": "finance", "ano": 2026})
res = db.search([1.0, 0.0], where_filter={"cat": "tech"})
print(f"Resultado Filtrado: {res[0][1]['text']} (Ano: {res[0][1]['meta']['ano']})")
| ⬅️ Voltar ao Índice de Exercícios | 📚 Sumário de Tópicos |