画像:AI生成
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(果物)。verdictはコンテキストに従う。
これがWikidataの静的なrankとの決定的な違いだ。編集者が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年以前に小学校に通った人にとって、冥王星は惑星だ。IAUにとって、冥王星は矮小惑星だ。どちらにも証拠があり、どちらにも出典がある。システムの仕事は一つを選ぶことではない——両方を保存し、コンテキストに従って判定することだ。
出典が攻撃される場合
学術的議論では、出典そのものが頻繁に攻撃される。
// 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)
Smithの論文はNEJMに掲載された。権威ある出典だ。しかし資金源が明らかになると、その論文に基づく主張全体が弱まる。counterは主張を直接反駁する。undercutterは主張の証拠基盤を弱める。どちらも主張を攻撃するが、方法が異なる。h-Categoriserがこれらの攻撃の強度を統合し、最終的なverdictを算出する。
真理は光の速度で消える。残るのは主張だけだ。システムは主張を管理するのであって、真理を宣言するのではない。
すべてのトリプルに論証が必要か?
いいえ。
(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.
基準はシンプルだ:同じ主語+述語に対して複数のオブジェクトが存在する、またはrankが分岐している、または参照が矛盾している——それは争点のあるトリプルだ。残りは単純なトリプルのままでよい。
水の化学式に論証を付けるのは無駄だ。エルサレムの首都としての地位に論証を付けないのは嘘だ。
判定エンジン:h-Categoriser
論証グラフはAmgoudのh-Categoriserによって判定される。各ノードに対して[-1, +1]スケールの受容性スコアを計算する——攻撃者の受容性が高いほど、攻撃されるノードのスコアは下がる。収束するまで再帰的に反復する。
パフォーマンス:10万件の争点トリプルがそれぞれ独自の論証グラフを持っていても、クエリはそのトリプルのグラフだけを評価する。ナレッジグラフ全体のサイズには依存しない。
Triple lookup: milliseconds (existing index)
Argumentation eval: milliseconds (h-Categoriser)
Verdict trace: milliseconds (graph traversal)
モデルをスケールするな。論証をスケールせよ。
Wikidata Rankとの対応
| Wikidata | toulmin拡張 |
|---|---|
| preferred rank | verdict > +0.5(現在のコンテキストで) |
| normal rank | 0 < verdict ≤ +0.5 |
| deprecated rank | verdict ≤ 0 |
| reference | Backing |
| qualifier | Qualifier + コンテキスト関数の条件 |
違い:Wikidataのrankは静的——編集者が決める。Toulminのverdictは動的——コンテキストと論証構造が決める。
より大きな視点
このシステムはドメイン固有ではない。
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は何か?そのBackingを攻撃するCounterはあるか?現在のコンテキストでverdictは正か?」
万能の真理オラクルではない。蓄積された論証に基づいて動作する信頼性評価システムだ。
事実を保存するシステムではなく、主張を管理するシステム。真理を宣言するシステムではなく、判定を追跡するシステム。これがナレッジグラフの次のステップだ。
関連記事
- toulmin — Go Rule Engine — Toulmin論証モデルベースのルールエンジン。本記事の判定エンジン。
- Ratchet Pattern — 決定論的検証とratchetロック。
コード:github.com/park-jun-woo/toulmin
go install github.com/park-jun-woo/toulmin@latest
本記事のコード例はtoulminライブラリの現行APIに基づく設計ビジョンを示している。ナレッジグラフ拡張(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.