🧩 Exercícios: Grafos de Conhecimento e GraphRAG
Extra Inteligência Artificial • Trilha Progressiva em 4 Níveis
🧭 Navegação Pedagógica
-
📖 Teoria do Capítulo 💻 Exemplos 📊 Slides 🧠 Quiz
🎯 Nível 1: Fundamentos
Problema 08.1 — Extração de Triplas (Sujeito, Predicado, Objeto)
Contexto: Construir uma estrutura de dados de Grafo direcionado em Python para registrar relacionamentos entre entidades extraídas de textos corporativos.
Requisitos de Execução:
- Criar uma classe
GrafoConhecimentocom nós e arestas com rótulo de predicado. - Adicionar as triplas:
("Maria", "GERENCIA", "Projeto Alpha")e("Projeto Alpha", "UTILIZA", "PostgreSQL"). - Consultar os vizinhos de primeira ordem de “Maria”.
Resultado Esperado
Vizinhos de Maria:
- Relação: GERENCIA -> Destino: Projeto Alpha
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_08_1_SeuNome - Envie na tarefa:
Atividade Cap 08 - Grafos de Conhecimento e GraphRAG
🔑 Gabarito de Código & Solução Comentada
# simple_kg.py
class GrafoConhecimento:
def __init__(self):
self.adj = {}
def adicionar_tripla(self, sujeito, predicado, objeto):
if sujeito not in self.adj:
self.adj[sujeito] = []
self.adj[sujeito].append((predicado, objeto))
def consultar_vizinhos(self, entidade):
return self.adj.get(entidade, [])
if __name__ == "__main__":
kg = GrafoConhecimento()
kg.adicionar_tripla("Maria", "GERENCIA", "Projeto Alpha")
kg.adicionar_tripla("Projeto Alpha", "UTILIZA", "PostgreSQL")
print("Vizinhos de Maria:")
for pred, obj in kg.consultar_vizinhos("Maria"):
print(f"- Relação: {pred} -> Destino: {obj}")
🎯 Nível 2: Prática
Problema 08.2 — Navegação Multi-Hop (Busca em Profundidade)
Implemente uma busca de 2 hops para descobrir quais tecnologias são indiretamente utilizadas pelos projetos que um determinado gerente lidera.
🔑 Gabarito de Código & Solução Comentada
# multi_hop_search.py
def buscar_tecnologias_do_gerente(kg, gerente):
projetos = [obj for pred, obj in kg.consultar_vizinhos(gerente) if pred == "GERENCIA"]
tecnologias = []
for p in projetos:
tecs = [obj for pred, obj in kg.consultar_vizinhos(p) if pred == "UTILIZA"]
tecnologias.extend(tecs)
return list(set(tecnologias))
🎯 Nível 3: Integração
Problema 08.3 — Algoritmo de Detecção de Comunidades (Louvain/Modularidade)
Implemente uma rotina que agrupe entidades fortemente interligadas por densidade de arestas em comunidades semânticas, simulando a etapa de clusterização do GraphRAG.
🔑 Gabarito de Código & Solução Comentada
# community_detection.py
def detectar_comunidades_simples(arestas):
# Agrupa nós conectados por arestas bidirecionais
pai = {}
def find(i):
if pai.setdefault(i, i) == i:
return i
pai[i] = find(pai[i])
return pai[i]
def union(i, j):
root_i, root_j = find(i), find(j)
if root_i != root_j:
pai[root_i] = root_j
for u, v in arestas:
union(u, v)
comunidades = {}
for node in pai:
root = find(node)
comunidades.setdefault(root, []).append(node)
return list(comunidades.values())
🎯 Nível 4: Desafio
Problema 08.4 — Recuperador Híbrido GraphRAG (Local Search + Global Summary)
Construa um orquestrador que determine se a pergunta do usuário exige uma busca pontual (Local Search nos nós vizinhos) ou uma busca holística (Global Search nos resumos comunitários).
🔑 Gabarito de Código & Solução Comentada
# graphrag_retriever.py
class GraphRAGRetriever:
def __init__(self, kg, resumos_comunidades):
self.kg = kg
self.resumos = resumos_comunidades
def responder(self, query):
q_lower = query.lower()
palavras_globais = ["resumo", "visão geral", "principais temas", "todos os departamentos"]
if any(term in q_lower for term in palavras_globais):
# Global Search nos resumos das comunidades
return "Busca Global: " + " | ".join(self.resumos)
else:
# Local Search no grafo
return "Busca Local: Navegação pelas entidades mencionadas na query."