Extra Inteligência Artificial • Trilha Progressiva em 4 Níveis


🧭 Navegação Pedagógica


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

  1. Criar uma classe GrafoConhecimento com nós e arestas com rótulo de predicado.
  2. Adicionar as triplas: ("Maria", "GERENCIA", "Projeto Alpha") e ("Projeto Alpha", "UTILIZA", "PostgreSQL").
  3. 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)

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