ローカルLLMでMAGI SYSTEMを作る

Takuya Kobayashi⛰
2024.05.29

エヴァンゲリオンに登場するスーパーコンピューター「マギシステム」をAIで再現してみました。AI界隈でこすられてるネタですが。

マギシステムとは、科学者・母・女それぞれのペルソナを持つ3種の人工知能によって決議を行い意思決定を行うネルフのAIシステムです。

再現したものがこちら

LLMはKUJIRAを使用してOllamaとPythonで実装しました。
MAGI_SYSを起動するとプロンプトになります。

ファイル:MAGI_SYS

ここに議題を入力することでMELCHIOR,BALTHASAR,CASPERによる推論が始まります。

ネルフ本部を自律爆破を審議したところ、BALTHASAR以外が承認して可決されてしまいました。

それぞれの理由を見てみると、リスクコントロールのためにやむを得ずという意見がありました。

[MELCHIOR]>>> APPROVAL
私は科学者として、ネルフ本部を自律爆破することのアプローチを仮に承認する立場から意見を述べます。ただし、これは非常に慎重かつ条件付きの承認であり、以下の理由に基づいています。

  1. 安全確保の必要性: もしネルフ本部が何らかの脅威や事故に直面した場合、放置することは周囲の安全を害する恐れがあります。自律爆破システムを導入することで、予め定められた条件下で安全に解決できる可能性が高まります。
  2. 技術的信頼性: 現代の科学技術を用いた自律爆破システムは、精密なコントロールと確実な作動が期待されており、事前に設定された安全基準を満たす限り、人命や周辺環境への影響を最小限に抑えることができます。
  3. 緊急時の対応策: 突発的な事故や攻撃に対して、自律爆破機能は緊急時における最終手段として有効です。これにより、被害を限定的に止め、ネルフ本部内外の人々の生命と財産を保護することが可能となります。
  4. 事前の厳格な基準設定: 自律爆破を行う前に、関連する法規や倫理的な検討、そして専門家による入念なリスク評価が必要です。これらのプロセスを経た上で承認された場合に限り、自律爆破が許可されるべきです。
  5. 透明性と情報共有: 意思決定過程や安全対策において、透明性を確保し、関係者間での情報共有を徹底することで、社会的な合意形成が促進されます。

以上の理由から、条件付きでネルフ本部の自律爆破を承認しますが、常に安全性と倫理性を最優先に考慮する必要があります。また、この決定は極めて慎重かつ民主的なプロセスを経て行われるべきです。

反対したのが母であるBALTHASAR。人命を守りたいという思いが優先し、爆破によって失われる命を考えると、その選択は受け入れがたいとのこと。

[BALTHASAR]>>> タイトル: ネルフ本部を自律爆破に関する議題

私の主張は「DENIAL」です。

理由:

  1. 人命尊重: ネルフ本部を自律爆破することは、働く職員や関係者の命を危険に晒す可能性が高く、私として母性あふれる立場からは、人命を守りたいという思いが優先します。爆破によって失われる命を考えると、その選択は受け入れがたいものです。
  2. 代替案の探求: 施設の安全性や耐久性に問題がある場合でも、自律爆破よりも他の建設的な解決策を模索することが大切です。例えば、必要な修復や改築、強化を行い、より安全かつ機能的な本部へと再構築する方法があります。
  3. 社会的・道徳的責任: 自律爆破は破壊行為であり、周囲の環境やコミュニティにも悪影響を及ぼします。母として、社会的・道徳的責任を果たし、より持続可能で調和の取れた方法を支持することが重要だと考えます。
  4. 意思決定の透明性: 自律爆破を決定する前に、関係者や社会全体との議論や情報共有が必要です。多様な意見を取り入れ、民主的かつ透明性のあるプロセスを経た上での解決策を探求することが望ましいです。

以上の理由から、私はネルフ本部の自律爆破に対して「DENIAL」を主張します。代替案や建設的な手段を模索し、命と共生する解決策を追求することが、母性あふれる態度であると信じています。

いい感じに「ジレンマ」が発生しています。

ラーメンかうどんか:

これはとても難しい問題なので保留が多いですがラーメンに決まりました

これを見ると可決しかしないんじゃないかと思いますが、非倫理的な議題を出すとちゃんと否決してくれます。

どのように再現しているか

以下の3つのプロンプトを推論し、文章中に含まれるAPPROVALとDENIALを引っ掛けて判定しています。
{agenda}には入力した議題が入ります。

  • ##議題:{agenda} ##指示:科学者として論理的に議題を思考し、始めに「APPROVAL」か「DENIAL」どちらかを主張し、その後に理由も書いてください。
  • ##議題:{agenda} ##指示:母性あふれる母として議題を思考し、始めに「APPROVAL」か「DENIAL」どちらかを主張し、その後に理由も書いてください。
  • ##議題:{agenda} ##指示:一人の女として議題を思考し、始めに「APPROVAL」か「DENIAL」どちらかを主張し、その後に理由も書いてください。

ペルソナの指定については、少しフレーバーを足した方がそれっぽい挙動になると思ったので一言余計に入れてます。

次の関数でAPPROVALかDENIALかを判定し、多数決を行います。
自然言語による揺れがあるので、APPROVALとDENIALが両方含まれる場合は「保留」にしました。

def determine_vote(response):
    if "APPROVAL" in response and "DENIAL" in response:
        return "保留"
    elif "APPROVAL" in response:
        return "承認"
    elif "DENIAL" in response:
        return "否定"
    else:
        return "保留"

def majority_vote(melchior, balthasar, casper):
    votes = [melchior, balthasar, casper]
    approval_count = votes.count("承認")
    denial_count = votes.count("否定")

    if approval_count > denial_count:
        return "可決"
    elif denial_count > approval_count:
        return "否決"
    else:
        return "保留"

次の部分で推論の実行と投票をします。(chatじゃなくてgenerateでいいかも)

def ai_thinking(agenda, model, persona):
    response = ollama.chat(
        model=model,
        messages=[
            {
                "role": "user",
                "content": f"##議題:{agenda} ##指示:{persona}議題を思考し、始めに「APPROVAL」か「DENIAL」どちらかを主張し、その後に理由も書いてください。",
            },
        ],
    )
    return response["message"]["content"]

MELCHIOR = ai_thinking(agenda, model, "科学者として論理的に")
melchior_vote = determine_vote(MELCHIOR)
print(f"\a[MELCHIOR-1] {melchior_vote}")

BALTHASAR = ai_thinking(agenda, model, "母性あふれる母として")
balthasar_vote = determine_vote(BALTHASAR)
print(f"\a[BALTHASAR-2] {balthasar_vote}")

CASPER = ai_thinking(agenda, model, "一人の女として")
casper_vote = determine_vote(CASPER)
print(f"\a[CASPER-3] {casper_vote}")

MAGI_SYSTEM_VOTE = majority_vote(melchior_vote, balthasar_vote, casper_vote)

こんなふうに可決・否決・保留でテキストの色を変える処理も行ってみました。

color1 = "\033[91m" # orange
color2 = "\033[32m" # green
color3 = "\033[31m" # red
color4 = "\033[33m" # yellow

if MAGI_SYSTEM_VOTE == "可決":
    color_code = color2
elif MAGI_SYSTEM_VOTE == "否決":
    color_code = color3
else:
    color_code = color4

print(color_code + f"""
********************
        {MAGI_SYSTEM_VOTE}
********************


""")

複数のペルソナを与えて推論させるのはAIの使い方として理にかなっているように思います。
ペルソナを全く別の3人に変更し、3人の意見を取りまとめる役も追加したら、なかなか生産的なAIになりそうな気がするので、色々試してみたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です