Изображение: сгенерировано ИИ
Молчание 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 rank | verdict > +0.5 (в текущем контексте) |
| normal rank | 0 < verdict ≤ +0.5 |
| deprecated rank | verdict ≤ 0 |
| reference | Backing |
| qualifier | Qualifier + условия контекстной функции |
Разница: 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.