Pontes Criativas entre Domínios: Como Automatizar Conexões Inesperadas
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:
- Computational Creativity: https://en.wikipedia.org/wiki/Computational_creativity
- Analogical Reasoning: https://en.wikipedia.org/wiki/Analogical_reasoning
- Cross-Domain Transfer Learning: https://arxiv.org/abs/1911.02685