Тройки — это утверждения, а не факты Изображение: сгенерировано ИИ

Молчание Wikidata


В Wikidata есть такая тройка:

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

Кто решил preferred? Почему preferred? В каком контексте preferred?

Wikidata молчит. Редактор принимает решение, система сохраняет его. Больше ничего.

Но вопрос о том, является ли помидор овощем или фруктом — не физическая константа. Спросите повара — это овощ. Спросите ботаника — это фрукт. Спросите Верховный суд США — это овощ (1893, Nix v. Hedden). Три ответа на один вопрос, и ни один из них не ошибочен.

Тройки в графе знаний — не факты. Это утверждения.


Утверждения требуют аргументации

Для хранения утверждений нужна структура. Модель аргументации Toulmin даёт эту структуру.

ЭлементРольПример с помидором
ClaimУтверждение«Помидор — это овощ»
GroundПрямое доказательство«Классифицируется как овощ в кулинарной таксономии»
BackingИсточник/авторитет«Le Guide Culinaire (1903)»
QualifierОбласть применения«В кулинарном контексте» (confidence 0.8)
RebuttalУсловие опровержения«В ботаническом контексте это фрукт — структура завязи»
WarrantСвязующая логика«Традиционная классификация ингредиентов основана на кулинарном использовании»

Вместо навязывания единственного значения истинности на тройку — поднимите тройку до предмета аргументации. Есть утверждение, есть доказательство, есть условие опровержения, есть источник. А оценка происходит не в момент сохранения, а в момент запроса.

Сама идея не нова. В академической среде абстрактные фреймворки аргументации Dung (1995), ASPIC+ (2010) и nanopublication уже рассматривали аргументацию над графами знаний. Разница в одном — мы поставляем это как исполняемый код, а не статьи. Установите через go install, пишите правила как функции Go, запускайте прямо сейчас.


Контекст определяет истину

Хранение — это структура аргументации. Оценка — во время выполнения.

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)

Тот же граф, та же структура аргументации, тот же код. Изменился только контекст. Запрос в кулинарном контексте: +0.8 (овощ). Запрос в ботаническом контексте: -0.9 (фрукт). Вердикт следует за контекстом.

В этом решающее отличие от статического rank в Wikidata. Не редактор решает preferred — контекст запрашивающего формирует оценку.


Плутон — планета?

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)

Для того, кто ходил в начальную школу до 2006 года, Плутон — планета. Для МАС Плутон — карликовая планета. У обоих есть доказательства, у обоих есть источники. Задача системы — не выбирать одно, а хранить оба и оценивать по контексту.


Когда атакуют источники

В академических дебатах сами источники часто подвергаются атаке.

// 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)

Статья Смита опубликована в NEJM. Авторитетный источник. Но когда раскрывается источник финансирования, всё утверждение, основанное на этой статье, ослабевает. counter напрямую опровергает утверждение; undercutter подрывает доказательную базу утверждения. Оба атакуют утверждение, но по-разному. h-Categoriser синтезирует силу этих атак для вычисления финального вердикта.

Истина исчезает со скоростью света; остаются лишь утверждения. Система управляет утверждениями, а не провозглашает истину.


Каждая ли тройка нуждается в аргументации?

Нет.

(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.

Критерий прост: если для одной пары субъект + предикат существует несколько объектов, или ранги расходятся, или источники конфликтуют — это спорная тройка. Остальное остаётся простыми тройками.

Навешивать аргументацию на химическую формулу воды — расточительство. Не навешивать аргументацию на статус столицы Иерусалима — ложь.


Движок оценки: h-Categoriser

Граф аргументации оценивается h-Categoriser Amgoud. Он вычисляет оценку приемлемости на шкале [-1, +1] для каждого узла — чем выше приемлемость атакующего, тем сильнее падает оценка атакуемого узла. Рекурсивная итерация до сходимости.

Производительность: даже при 100 000 спорных троек, каждая со своим графом аргументации, запрос оценивает только граф этой тройки. Независимо от общего размера графа знаний.

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

Не масштабируйте модель. Масштабируйте аргументацию.


Соответствие рангам Wikidata

Wikidataрасширение toulmin
preferred rankverdict > +0.5 (в текущем контексте)
normal rank0 < verdict ≤ +0.5
deprecated rankverdict ≤ 0
referenceBacking
qualifierQualifier + условия контекстной функции

Разница: rank в Wikidata статичен — решают редакторы. Verdict в Toulmin динамичен — решают контекст и структура аргументации.


Общая картина

Эта система не привязана к домену.

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?

Один движок. Одна структура. Разные домены. Правила — это функции Go, исключения — графы defeats, оценка — h-Categoriser. Никакого DSL.


Почему это важно

LLM растворяют знания в весах. Задайте вопрос — получите ответ. Но вы не можете структурно проследить, истинен ли этот ответ в каком контексте, на основе какого источника и существуют ли опровержения. Галлюцинации возникают из этого структурного отсутствия.

Эта система не может предотвратить все галлюцинации. LLM генерируют открытый вывод, и невозможно заранее зарегистрировать каждое возможное утверждение. Но для утверждений, уже зарегистрированных в графе аргументации, можно сравнить ответ LLM с графом и оценить достоверность. «Какой Backing у этого утверждения? Есть ли Counter, атакующий этот Backing? Положителен ли verdict в текущем контексте?»

Не универсальный оракул истины. Система оценки достоверности, работающая на накопленной аргументации.

Не система, хранящая факты, а управляющая утверждениями. Не система, провозглашающая истину, а прослеживающая оценку. Это следующий шаг для графов знаний.


Связанное

  • toulmin — Go Rule Engine — Движок правил на основе модели аргументации Toulmin. Движок оценки из этой статьи.
  • Ratchet Pattern — Детерминистическая верификация и фиксация ratchet.

Код: github.com/park-jun-woo/toulmin

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

Примеры кода в этой статье представляют проектное видение на основе текущего API библиотеки toulmin. Расширение для графов знаний (TripleSpec, контекстная оценка) находится в активной разработке. Ядро движка оценки (h-Categoriser, граф defeats, Rule/Counter) работает уже сегодня.


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.