Um triple não é um fato, é uma alegação Image: AI generated

O silêncio do Wikidata


No Wikidata existe este triple:

(tomato, instance_of, vegetable) — rank: preferred
(tomato, instance_of, fruit)     — rank: normal

Quem decidiu preferred? Por que é preferred? Em que contexto é preferred?

O Wikidata silencia diante dessas perguntas. Os editores decidem; o sistema apenas armazena a decisão.

Mas se o tomate é legume ou fruta não é uma constante física. Pergunte a um chef, é legume. Pergunte a um botânico, é fruta. Pergunte à Suprema Corte dos EUA, é legume (1893, Nix v. Hedden). A mesma pergunta tem três respostas, e nenhuma está errada.

Os triples de um grafo de conhecimento não são fatos. São alegações.


Alegações precisam de argumentação

Para armazenar alegações é preciso estrutura. O modelo de argumentação de Toulmin fornece essa estrutura.

ElementoPapelExemplo do tomate
ClaimAlegação“O tomate é um legume”
GroundEvidência direta“Classificado como legume nas taxonomias culinárias”
BackingFonte/autoridade“Le Guide Culinaire (1903)”
QualifierEscopo de aplicação“No contexto culinário” (confiança 0.8)
RebuttalCondição de refutação“No contexto botânico é fruta — estrutura do ovário”
WarrantLógica de conexão“A classificação tradicional de ingredientes se baseia no uso culinário”

Em vez de forçar um único truth value sobre um triple, elevamos o triple a objeto de argumentação. Há uma alegação, há evidência, há condições de refutação, há fontes. E o julgamento — não ocorre no armazenamento, mas na consulta.

Essa ideia em si não é nova. A academia explorou a argumentação sobre grafos de conhecimento com o framework de argumentação abstrata de Dung (1995), ASPIC+ (2010), nanopublication, entre outros. A diferença é uma só: entregamos código executável, não um paper. Instala-se com go install, as regras se escrevem como funções Go, e roda agora mesmo.


O contexto determina a verdade

O armazenamento é estrutura argumentativa. O julgamento ocorre em tempo de execução.

ctx.Set("domain", "cooking")
results, _ := g.Evaluate(ctx)
// verdict: +0.8 → vegetable

ctx.Set("domain", "botany")
results, _ = g.Evaluate(ctx)
// verdict: -0.9 → not a vegetable (fruit)

O mesmo grafo, a mesma estrutura argumentativa, o mesmo código. Só o contexto mudou. Consultar no contexto culinário dá +0.8 (legume); no contexto botânico dá -0.9 (fruta). O veredito segue o contexto.

Esta é a diferença fundamental em relação ao rank estático do Wikidata. Não é um editor quem decide preferred, mas o contexto do consultante quem produz o julgamento.


Plutão é um planeta?

Triple: (Pluto, instance_of, planet)

Claim:
  Ground: "Solar orbit, spherical, sufficient mass"
  Backing: IAU 1930 classification resolution

Rebuttal:
  Ground: "Orbit-clearing criterion not met"
  Backing: IAU 2006 Resolution 5A

Exception to rebuttal:
  Ground: "Still taught as a planet in education curricula"
  Backing: NASA Education Resources 2024
ctx.Set("domain", "astronomy_formal")
// verdict: -0.8 (not a planet)

ctx.Set("domain", "education")
// verdict: +0.3 (can be treated as planet in context)

Para quem frequentou a escola primária antes de 2006, Plutão é um planeta. Para a IAU, Plutão é um planeta anão. Ambos têm evidência, ambos têm fonte. O que o sistema deve fazer não é escolher um, mas armazenar ambos e julgar conforme o contexto.


Quando a fonte é atacada

Em debates acadêmicos, é comum a própria fonte ser atacada.

// Claim: Drug X is effective
claim := g.Rule(drugXEffective).
    With(&TripleSpec{
        Ground:  "Significant effect in Phase 3 clinical trial",
        Backing: "Smith et al. (2020), NEJM",
    })

// Rebuttal: Independent replication failed
counter := g.Counter(replicationFailed).
    With(&TripleSpec{
        Ground:  "Effect not confirmed in independent replication",
        Backing: "Jones et al. (2022), Lancet",
    })
counter.Attacks(claim)

// Undercutter: conflict of interest
undercutter := g.Counter(conflictOfInterest).
    With(&TripleSpec{
        Ground:  "Smith's funding came from the pharmaceutical company",
        Backing: "Retraction Watch (2023)",
    })
undercutter.Attacks(claim)

O artigo de Smith foi publicado no NEJM. Fonte com autoridade. Mas quando a origem do financiamento é revelada, toda alegação baseada naquele artigo se enfraquece. O counter refuta a alegação frontalmente; o undercutter enfraquece a própria evidência. Ambos atacam a alegação, mas de formas diferentes. O h-Categoriser sintetiza a intensidade desses ataques para calcular o verdict final.

A verdade desaparece à velocidade da luz; só as alegações permanecem. O sistema gerencia alegações, não declara verdades.


Todo triple precisa de argumentação?

Não.

(water, chemical_formula, H2O)   — Settled. No argumentation needed.
(tomato, instance_of, ?)         — Contested. Attach argumentation.
(Pluto, instance_of, ?)          — Contested. Attach argumentation.
(Jerusalem, capital_of, ?)       — Contested. Attach argumentation.

O critério é simples: se para o mesmo subject + predicate existem múltiplos objects, ou os ranks divergem, ou as references se contradizem — é um triple contestado. O resto permanece como triple simples.

Adicionar argumentação à fórmula química da água é desperdício. Não adicionar argumentação ao status de capital de Jerusalém é mentira.


Motor de julgamento: h-Categoriser

O julgamento do grafo de argumentação é executado pelo h-Categoriser de Amgoud. Calcula para cada nó um grau de aceitabilidade na escala [-1, +1]: quanto maior a aceitabilidade do atacante, menor a do atacado. Itera recursivamente até a convergência.

Desempenho: mesmo que 100.000 triples contestados tenham cada um seu grafo de argumentação, na consulta apenas se avalia o grafo do triple em questão. Independente do tamanho total do grafo de conhecimento.

Triple lookup:        milliseconds (existing index)
Argumentation eval:   milliseconds (h-Categoriser)
Verdict trace:        milliseconds (graph traversal)

Não se escala o modelo; escala-se a argumentação.


Correspondência com o rank do Wikidata

Wikidatatoulmin extension
preferred rankverdict > +0.5 (in current context)
normal rank0 < verdict ≤ +0.5
deprecated rankverdict ≤ 0
referenceBacking
qualifierQualifier + context function conditions

Diferença: o rank do Wikidata é estático. Decidido por um editor. O verdict do toulmin é dinâmico. Determinado pelo contexto e pela estrutura argumentativa.


O panorama maior

Este sistema não está atrelado a um domínio específico.

AI Prefrontal Cortex (feature selection):
  triple = (feature, should_include_in, app_type)
  context = current project's app tags
  verdict = should this feature be included?

Knowledge graph general:
  triple = (subject, predicate, object)
  context = querier's domain/perspective
  verdict = is this triple true in current context?

O mesmo motor. A mesma estrutura. Domínios diferentes. As regras são funções Go, as exceções são grafos de defeats, o julgamento é h-Categoriser. Sem DSL.


Por que isso é necessário

Os LLMs dissolvem conhecimento em pesos. Faz-se uma pergunta e sai uma resposta. Mas em que contexto essa resposta é verdadeira, em que fonte se baseia, se existe refutação — não se pode rastrear estruturalmente. As alucinações nascem dessa ausência de estrutura.

Este sistema não pode prevenir todas as alucinações. LLMs geram saídas abertas, e não é possível registrar previamente todas as alegações possíveis. Mas para alegações já registradas no grafo de argumentação, pode-se contrastar a resposta gerada pelo LLM e avaliar sua confiabilidade. “Qual é o Backing desta alegação? Existe um Counter que ataque esse Backing? O verdict no contexto atual é positivo?”

Não é um verificador universal de verdade. É um sistema de avaliação de confiabilidade que opera sobre argumentação acumulada.

Não é um sistema que armazena fatos, mas um que gerencia alegações. Não declara verdade, mas rastreia julgamentos. Este é o próximo passo dos grafos de conhecimento.


  • toulmin — Go Rule Engine — Motor de regras baseado no modelo de argumentação de Toulmin. O motor de julgamento por trás deste artigo.
  • Ratchet Pattern — Verificação determinística e travamento de catraca.

Code: github.com/park-jun-woo/toulmin

go install github.com/park-jun-woo/toulmin@latest

The code examples in this article represent a design vision based on the toulmin library’s current API. The knowledge graph extension (TripleSpec, context-based evaluation) is under active development. The core judgment engine (h-Categoriser, defeats graph, Rule/Counter) works today.


References

  • Toulmin, S. (1958). The Uses of Argument. Cambridge University Press.
  • Dung, P.M. (1995). “On the Acceptability of Arguments and its Fundamental Role in Nonmonotonic Reasoning, Logic Programming and n-Person Games.” Artificial Intelligence, 77(2), 321–357.
  • Amgoud, L. & Ben-Naim, J. (2013). “Ranking-based semantics for argumentation frameworks.” SUM 2013, LNCS 8078, 134–147.
  • Modgil, S. & Prakken, H. (2014). “The ASPIC+ framework for structured argumentation: a tutorial.” Argument & Computation, 5(1), 31–62.
  • Groth, P. et al. (2010). “Anatomy of a Nanopublication.” Information Services & Use, 30(1-2), 51–56.
  • Nix v. Hedden, 149 U.S. 304 (1893). United States Supreme Court.