🧩 Exercícios: Representação Semântica com Embeddings
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 04.1 — Cálculo de Similaridade por Cosseno e Distância Euclidiana
Contexto: Cálculo de Similaridade por Cosseno e Distância Euclidiana no contexto de Representação Semântica com Embeddings.
Requisitos de Execução:
- Implementar fórmulas matemáticas de Cosseno $\frac{u \cdot v}{|u| |v|}$ e Distância Euclidiana $\sqrt{\sum(u_i - v_i)^2}$.
- Comparar pares de vetores semânticos.
Resultado Esperado
Vetor A <-> Vetor B: Cosseno = 0.96 | Distância = 0.28
Vetor A <-> Vetor C: Cosseno = 0.12 | Distância = 1.34
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_04_1_SeuNome - Envie na tarefa:
Atividade Cap 04 - Representação Semântica com Embeddings
🔑 Gabarito de Código & Solução Comentada
# embeddings_math.py
import math
def similaridade_cosseno(v1, v2):
dot = sum(a * b for a, b in zip(v1, v2))
norm1 = math.sqrt(sum(a**2 for a in v1))
norm2 = math.sqrt(sum(b**2 for b in v2))
return round(dot / (norm1 * norm2), 4)
def distancia_euclidiana(v1, v2):
return round(math.sqrt(sum((a - b)**2 for a, b in zip(v1, v2))), 4)
emb_python = [0.9, 0.8, 0.1]
emb_golang = [0.85, 0.78, 0.15]
emb_receita = [0.05, 0.1, 0.95]
print("Python <-> Golang :", similaridade_cosseno(emb_python, emb_golang), "| Dist:", distancia_euclidiana(emb_python, emb_golang))
print("Python <-> Receita:", similaridade_cosseno(emb_python, emb_receita), "| Dist:", distancia_euclidiana(emb_python, emb_receita))
🔍 Nível 2: Prática
Problema 04.2 — Normalização L2 de Embeddings e Produto Escalar Otimizado
Contexto: Normalização L2 de Embeddings e Produto Escalar Otimizado no contexto de Representação Semântica com Embeddings.
Requisitos de Execução:
- Criar função de normalização L2 garantindo que o comprimento do vetor seja exatamente 1.0.
- Calcular similaridade via produto escalar simples em vetores unitários.
Resultado Esperado
Vetor Original: [3.0, 4.0] | Norma = 5.0
Vetor Normalizado: [0.6, 0.8] | Norma = 1.0
Produto Escalar Otimizado: 0.98
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_04_2_SeuNome - Envie na tarefa:
Atividade Cap 04 - Representação Semântica com Embeddings
🔑 Gabarito de Código & Solução Comentada
# l2_normalization.py
import math
def normalizar_l2(vetor):
norma = math.sqrt(sum(x**2 for x in vetor))
if norma == 0: return vetor
return [round(x / norma, 4) for x in vetor]
def dot_product(v1, v2):
return round(sum(a * b for a, b in zip(v1, v2)), 4)
v1_norm = normalizar_l2([3.0, 4.0])
v2_norm = normalizar_l2([3.1, 3.9])
print("V1 Normalizado:", v1_norm)
print("Similaridade Rápida (Dot Product):", dot_product(v1_norm, v2_norm))
⚡ Nível 3: Integração
Problema 04.3 — Algoritmo K-Means Simples para Agrupamento de Embeddings
Contexto: Algoritmo K-Means Simples para Agrupamento de Embeddings no contexto de Representação Semântica com Embeddings.
Requisitos de Execução:
- Implementar K-Means em Python puro com K=2 sobre conjunto de vetores 2D.
- Atualizar centróides por 5 iterações e atribuir clusters.
Resultado Esperado
Iteração 5 -> Centróide 1: [1.1, 1.0] | Centróide 2: [5.2, 5.0]
Clusters convergidos com sucesso.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_04_3_SeuNome - Envie na tarefa:
Atividade Cap 04 - Representação Semântica com Embeddings
🔑 Gabarito de Código & Solução Comentada
# kmeans_embeddings.py
import math
def distancia(p1, p2):
return math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2)
pontos = [(1.0, 1.0), (1.2, 0.9), (5.0, 5.0), (5.3, 4.8)]
c1, c2 = (1.0, 1.0), (5.0, 5.0)
for _ in range(5):
cluster1, cluster2 = [], []
for p in pontos:
if distancia(p, c1) < distancia(p, c2): cluster1.append(p)
else: cluster2.append(p)
c1 = (sum(x for x, _ in cluster1)/len(cluster1), sum(y for _, y in cluster1)/len(cluster1))
c2 = (sum(x for x, _ in cluster2)/len(cluster2), sum(y for _, y in cluster2)/len(cluster2))
print(f"Centróide Cluster 1: {[round(x, 2) for x in c1]}")
print(f"Centróide Cluster 2: {[round(x, 2) for x in c2]}")
🏆 Nível 4: Desafio Corporativo
Problema 04.4 — Mecanismo de Busca Semântica Top-K com Ranking de Documentos
Contexto: Mecanismo de Busca Semântica Top-K com Ranking de Documentos no contexto de Representação Semântica com Embeddings.
Requisitos de Execução:
- Implementar motor de busca que receba embedding de query e base de documentos.
- Retornar os Top-2 documentos mais relevantes ordenados por score.
Resultado Esperado
Busca por: 'como programar em python'
1º Lugar: 'Tutorial de Sintaxe Python' (Score: 0.92)
2º Lugar: 'Guia de Backend com FastAPI' (Score: 0.81)
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_04_4_SeuNome - Envie na tarefa:
Atividade Cap 04 - Representação Semântica com Embeddings
🔑 Gabarito de Código & Solução Comentada
# semantic_search_engine.py
import math
def cosine_sim(u, v):
dot = sum(a * b for a, b in zip(u, v))
n1 = math.sqrt(sum(a**2 for a in u))
n2 = math.sqrt(sum(b**2 for b in v))
return dot / (n1 * n2) if n1 * n2 > 0 else 0
documentos = [
{"id": 1, "titulo": "Tutorial de Sintaxe Python", "emb": [0.9, 0.8, 0.1]},
{"id": 2, "titulo": "Receita de Bolo de Cenoura", "emb": [0.0, 0.1, 0.9]},
{"id": 3, "titulo": "Guia de Backend com FastAPI", "emb": [0.8, 0.85, 0.2]}
]
query_emb = [0.85, 0.75, 0.15]
rank = []
for doc in documentos:
score = cosine_sim(query_emb, doc["emb"])
rank.append((score, doc["titulo"]))
rank.sort(reverse=True, key=lambda x: x[0])
for pos, (sc, tit) in enumerate(rank[:2], 1):
print(f"{pos}º Lugar: '{tit}' (Score: {sc:.2f})")
| ⬅️ Voltar ao Índice de Exercícios | 📚 Sumário de Tópicos |