Voltar ao blog
13 de maio de 20265 min de leitura

Pontes Criativas entre Domínios: Como Automatizar Conexões Inesperadas

pythonaicreativity

Criatividade, no fundo, é conectar coisas que ninguém conectou antes. Quando alguém percebe que a estrutura de um átomo se parece com a de um sistema solar, isso é uma ponte criativa entre física nuclear e astronomia. Quando alguém aplica princípios de evolução biológica para otimizar algoritmos, isso é outra. A pergunta que me intrigou foi: dá para automatizar esse processo? Dá para um sistema olhar para dois domínios de conhecimento separados e encontrar conexões estruturais entre eles?

A resposta é sim, com limitações. Implementei um módulo que analisa grafos de mundos distintos, procura padrões estruturais (sujeitos em comum com propriedades diferentes, objetos de um que são sujeitos do outro), e gera transferências de propriedades entre domínios com confiança calibrada. Não é criatividade humana, mas encontra conexões que você não pediria explicitamente e que às vezes surpreendem.

Guia de tópicos:

  • O Que é uma Ponte Criativa Computacionalmente
  • A Janela de Similaridade: Nem Muito Perto, Nem Muito Longe
  • Estratégia 1: Transferência por Sujeito Compartilhado
  • Estratégia 2: Cadeia Transitiva entre Mundos
  • Calibrando Confiança para Não Gerar Lixo
  • Exemplo Prático em Python
  • Considerações Finais

O Que é uma Ponte Criativa Computacionalmente

Uma ponte criativa é uma tripla (sujeito, verbo, objeto) que não existia em nenhum mundo individualmente, mas que emerge da combinação de informações de mundos diferentes. Se o mundo de "Programação" sabe que "Python tem tipagem dinâmica" e o mundo de "Educação" sabe que "Python é usado em ensino", uma ponte criativa transfere "usado em ensino" para o mundo de Programação. A informação existia, mas em outro contexto. A ponte traz ela para onde é relevante.

A diferença entre uma ponte útil e uma absurda está na confiança e na coerência. "Python é usado em ensino" transferido para o mundo de Programação faz sentido. "Cobra python tem tipagem dinâmica" não faz. O módulo precisa de filtros para separar um do outro.

A Janela de Similaridade: Nem Muito Perto, Nem Muito Longe

Mundos muito similares (cosine similarity > 0.94) não geram pontes criativas. Eles são fundidos, porque falam do mesmo assunto. Não há "criatividade" em conectar "Python programação" com "Python desenvolvimento". É o mesmo tema.

Mundos muito diferentes (cosine < 0.30) também não geram pontes. A distância semântica é tão grande que qualquer conexão seria forçada e provavelmente absurda. Conectar "Culinária" com "Astrofísica" via um sujeito em comum ("estrela" como ingrediente vs "estrela" como corpo celeste) não produz nada útil.

A janela criativa fica entre 0.30 e 0.85. É onde mundos são diferentes o suficiente para que a conexão seja surpreendente, mas similares o suficiente para que faça algum sentido semântico. "Programação" e "Matemática" (similaridade ~0.6) geram pontes úteis. "Programação" e "Culinária" (similaridade ~0.2) não.

Estratégia 1: Transferência por Sujeito Compartilhado

Se o mesmo sujeito aparece em dois mundos com propriedades diferentes, as propriedades de um podem ser transferidas para o outro. "Python" no mundo de Programação tem (Python, paradigma, multiparadigma). "Python" no mundo de Data Science tem (Python, usado_em, machine learning). A transferência leva "usado_em machine learning" para o mundo de Programação.

A confiança é atenuada por três fatores: a confiança original da tripla fonte, a similaridade entre os mundos (quanto mais distantes, menor a confiança da ponte), e um fator fixo de 0.6. Isso garante que pontes nunca têm confiança maior que ~0.5, sinalizando que são sugestões, não certezas.

Estratégia 2: Cadeia Transitiva entre Mundos

Se no mundo A existe (Brasil, exporta, café) e no mundo B existe (café, causa, energia), o módulo gera a ponte (Brasil, causa, energia). O objeto de uma tripla no mundo A é o sujeito de uma tripla no mundo B, criando uma cadeia indireta.

Essa estratégia é mais arriscada (cadeias podem ser absurdas) então a atenuação é maior: fator 0.5 em vez de 0.6. E a confiança final é o produto das confianças de ambas as triplas vezes a similaridade vezes o fator. Na prática, só cadeias com premissas de alta confiança em mundos razoavelmente similares produzem pontes acima do threshold mínimo de 0.15.

Calibrando Confiança para Não Gerar Lixo

O filtro final é simples: pontes com confiança abaixo de 0.15 são descartadas. Das que sobram, só as 3 melhores (por confiança) são mantidas por ciclo. Isso evita explosão combinatória: com 20 mundos, são 190 pares possíveis, cada um podendo gerar múltiplas pontes. Sem limite, o sistema geraria centenas de conexões duvidosas por ciclo.

Cada ponte é marcada como "inferida" com a regra que a gerou ("cross_world_transfer" ou "transitive_bridge"). Isso permite rastreabilidade: se uma ponte parece absurda, você sabe exatamente como foi gerada e pode ajustar os thresholds.

Exemplo Prático em Python

import numpy as np

def cosine_similarity(a, b):
    norm = np.linalg.norm(a) * np.linalg.norm(b)
    return float(np.dot(a, b) / norm) if norm > 0 else 0.0


def find_creative_bridges(worlds: list[dict],
                          min_sim=0.30, max_sim=0.85,
                          min_confidence=0.15, max_bridges=3):
    """
    Find creative connections between different knowledge worlds.
    Returns bridges sorted by confidence, limited to max_bridges.
    """
    bridges = []

    for i, w1 in enumerate(worlds):
        for w2 in worlds[i+1:]:
            sim = cosine_similarity(w1["centroid"], w2["centroid"])
            if not (min_sim < sim < max_sim):
                continue

            # Strategy 1: Shared subjects with novel properties
            subjects1 = {t["s"] for t in w1["triples"]}
            subjects2 = {t["s"] for t in w2["triples"]}
            shared = subjects1 & subjects2

            for subj in shared:
                verbs_in_w1 = {t["v"] for t in w1["triples"] if t["s"] == subj}
                for t in w2["triples"]:
                    if t["s"] == subj and t["v"] not in verbs_in_w1:
                        bridges.append({
                            "s": subj, "v": t["v"], "o": t["o"],
                            "c": round(t["c"] * sim * 0.6, 4),
                            "rule": "cross_world_transfer",
                            "from": w2["topic"], "to": w1["topic"],
                        })

            # Strategy 2: Object of one = Subject of another (chain)
            objects1 = {t["o"]: t for t in w1["triples"]}
            for t2 in w2["triples"]:
                if t2["s"] in objects1:
                    t1 = objects1[t2["s"]]
                    bridges.append({
                        "s": t1["s"], "v": t2["v"], "o": t2["o"],
                        "c": round(t1["c"] * t2["c"] * sim * 0.5, 4),
                        "rule": "transitive_bridge",
                        "chain": f"{t1['s']}→{t2['s']}→{t2['o']}",
                    })

    # Filter and limit
    bridges = [b for b in bridges if b["c"] >= min_confidence]
    bridges.sort(key=lambda b: -b["c"])
    return bridges[:max_bridges]


# Example: two worlds with shared subject "python"
worlds = [
    {
        "topic": "Programação",
        "centroid": np.array([0.8, 0.3, 0.1, 0.5]),
        "triples": [
            {"s": "python", "v": "tipo", "o": "linguagem", "c": 0.9},
            {"s": "python", "v": "paradigma", "o": "multiparadigma", "c": 0.85},
            {"s": "linguagem", "v": "requer", "o": "compilador", "c": 0.7},
        ]
    },
    {
        "topic": "Data Science",
        "centroid": np.array([0.6, 0.5, 0.4, 0.3]),
        "triples": [
            {"s": "python", "v": "usado_em", "o": "machine learning", "c": 0.88},
            {"s": "python", "v": "biblioteca", "o": "pandas", "c": 0.9},
            {"s": "machine learning", "v": "requer", "o": "dados", "c": 0.8},
        ]
    },
]

bridges = find_creative_bridges(worlds)
print("Creative bridges found:")
for b in bridges:
    print(f"  [{b['rule']}] ({b['s']}, {b['v']}) → {b['o']}  c={b['c']}")
    if "chain" in b:
        print(f"    chain: {b['chain']}")
    if "from" in b:
        print(f"    {b['from']} → {b['to']}")

Considerações Finais

Criatividade computacional não é mágica. É busca estruturada por padrões em espaços que humanos não explorariam manualmente. O módulo não "inventa" nada. Ele encontra conexões que já existem implicitamente nos dados, mas que ninguém pediu explicitamente.

O valor real aparece com o tempo: conforme o grafo cresce e mais mundos são criados, as possibilidades de conexão aumentam. Um sistema com 50 mundos maduros pode gerar insights que surpreendem até quem construiu o sistema. Não é AGI, mas é mais que um chatbot que só repete o que leu.


Links indicativos: