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.
| Elemento | Papel | Exemplo do tomate |
|---|---|---|
| Claim | Alegação | “O tomate é um legume” |
| Ground | Evidência direta | “Classificado como legume nas taxonomias culinárias” |
| Backing | Fonte/autoridade | “Le Guide Culinaire (1903)” |
| Qualifier | Escopo de aplicação | “No contexto culinário” (confiança 0.8) |
| Rebuttal | Condição de refutação | “No contexto botânico é fruta — estrutura do ovário” |
| Warrant | Ló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
| Wikidata | toulmin extension |
|---|---|
| preferred rank | verdict > +0.5 (in current context) |
| normal rank | 0 < verdict ≤ +0.5 |
| deprecated rank | verdict ≤ 0 |
| reference | Backing |
| qualifier | Qualifier + 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.
Related
- 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.