Extra Inteligencia Artificial • Trilha Progressiva em 4 Níveis


🧭 Navegação Pedagógica


🎯 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:

  1. Criar classe de banco vetorial com métodos insert(id, text, vector) e query(vector, top_k).
  2. 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)

  1. Salve o arquivo como: Atividade_05_1_SeuNome
  2. 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:

  1. Particionar vetores em 2 centróides (Voronoi Cells).
  2. 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)

  1. Salve o arquivo como: Atividade_05_2_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_05_3_SeuNome
  2. 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:

  1. Implementar busca vetorial combinada com filtros relacionais (ex.: categoria == 'tecnologia' e data >= 2025).

Resultado Esperado

Busca com Filtro [categoria='tecnologia']: 1 documento qualificado retornado.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_05_4_SeuNome
  2. 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