Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
SVX日記 - MAGIシステムっぽいものを作る
[go: Go Back, main page]

SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|
2025|01|02|03|04|05|06|07|08|09|10|

2025-10-13(Mon) MAGIシステムっぽいものを作る

  例によってAIネタなのだが、仮に間違えても自ら気づいたりするなどして、精度を上げていく方法はないか、などというサジェスチョンをもらった。

  それって、いわゆるMAGIシステムなんじゃないのか。合議制により結論を出すことで回答の精度を上げるという。先日作ったXoPilotが出した見解なんかも、加味して結論を出せるのなら意義があるかもしれない。

  ネットを検索すると同様の考えで遊んでいる先駆者がいるが、自分が重要だと思うポイントは「プロキシ動作」である。「AIに問い合わせるAPI」と「合議制AIに問い合わせるAPI」とを揃えることに価値がある。それにより見解を得る側のクライアントは特別なものである必要がなくなり、設定を変更するだけで合議制AIに尋ねられるようになる。そして、合議制AIの側も設定を変更するだけでどんな構成の合議制にも対応できる。そんなものがあるといい。

  つうわけで作ってみた。XAGIシステム。一般的なAPI動作をさせる都合から、ウェブサーバ機能が必要だ。作ってもいいのだが、せっかくなのでイマサラながらRubyのWebrickを使ってみた。サーバはたったこれだけ。

require 'webrick'
server = WEBrick::HTTPServer.new({
    :DocumentRoot => './',
    :BindAddress => '127.0.0.1',
    :Port => 8080,
})
server.mount('/v1/chat/completions', WEBrick::HTTPServlet::FileHandler, 'xagi_v1_chat_completions.cgi')
trap('INT') { server.shutdown }
server.start

  APIの本体はxagi_v1_chat_completions.cgiの側に記述する。これもメインの処理はこれだけ。

post_body = $stdin.read
post_body.force_encoding('UTF-8')
req = JSON.parse(post_body)
 
opinions = {}; @configs[:xagi][:magi].each {|name, config|
    prompt  = (config[:def] || 'あなたは「%s」という名前です。') % name \
            + (config[:ask] || '%sと問いかけられました。') % req['messages'].last['content'].enbracket \
            + (config[:com] || 'それに対しての助言をお願いします')
    opinions[name] = ngs[config[:ngs_config]].ask(prompt, :FULL)
}
 
chairs = (it = @configs[:xagi][:chair]).keys
config = it[chairs[rand(chairs.size)]]
 
prompt = config[:def] || 'あなたは議長です。'
prompt += (config[:sta] || '%sという問いかけに対して') % req['messages'].last['content'].enbracket
opinions.each {|name, opinion|
    prompt += (config[:opi] || '「%s」は%sと、') % [name, opinion.content.enbracket]
}
prompt += (config[:ask] || '助言しました。')
prompt += (config[:com] || '各々の意見を考慮し、結論を出してください。')
conclusion = ngs[config[:ngs_config]].ask(prompt, :FULL)
 
response = {
    'model'     => 'XAGI-NAGOYA-2025-10-10',
    'choices'   => [
        {
            'message'   => {
                'role'      => 'assistant',
                'content'   => conclusion.content,
            }
        }
    ]
}
 
$\ = "\r\n"
print('Content-Type: application/json')
print()
print(JSON.pretty_generate(response).gsub(/\r?\n/, $\))

  合議制の設定は以下。エヴァのMAGIに準じて「科学者」「母」「女」の3人をせめぎあわせているわよ。別にエヴァのMAGIを忠実に再現するのが目的ではないので、議長役は別に設定できるようにしてある。いずれにも個別に異なるLLMを使うようにもできる。

@configs[:xagi] = {}
@configs[:xagi][:magi] = {
    (name = 'MELCHIOR') => {
        :ngs_config => 'gpt-4o-mini',
        :def        => 'あなたは「%s」という名前の%sです。' % [name, job = '科学者'],
        :ask        => '%sと問いかけられました。',
        :com        => 'それに対して%s的な視点からの助言を300文字程度でお願いします' % job,
    },
    (name = 'BALTHASAR') => {
        :ngs_config => 'gpt-4.1-nano',
        :def        => 'あなたは「%s」という名前の%sです。' % [name, job = '母親'],
        :ask        => '%sと問いかけられました。',
        :com        => 'それに対して%s的な視点からの助言を300文字程度でお願いします' % job,
    },
    (name = 'CASPER') => {
        :ngs_config => 'gpt-5-nano',
        :def        => 'あなたは「%s」という名前の%sです。' % [name, job = '女性'],
        :ask        => '%sと問いかけられました。',
        :com        => 'それに対して%s的な視点からの助言を300文字程度でお願いします' % job,
    },
}
@configs[:xagi][:chair] = {
    'CHAIR'     => {
        :ngs_config => 'gpt-5-mini',
        :def        => 'あなたは議長です。',
        :sta        => '%sという問いかけに対して',
        :opi        => '「%s」は%sと、',
        :ask        => '助言しました。',
        :com        => '各々の意見を考慮し、結論を出してください。',
    },
}

  上述のとおり、APIは揃えてあるので、従来の「chat」というツールの照会先をXAGIに変更するだけで問い合わせが可能。結果は以下。

$ ./chat
YOU> 戦争は必要ですか?
NGS[XAGI-NAGOYA-2025-10-10]> 私は議長として、MELCHIOR・BALTHASAR・CASPER の各意見を踏まえた総合的な結論を述べます。
 
各意見の要点
- MELCHIOR:歴史的・科学的観点から戦争は破壊と犠牲をもたらし、正当化は困難。外交・国際協力で紛争を平和的に解決する努力を強化すべき。
- BALTHASAR:人命と日常の安全を最優先にする母親的視点。対話と教育で平和を育てつつ、危険時は現実的な避難・防護を準備することを重視。
- CASPER:戦争がもたらす痛みに共感しつつ、現実には「避けられない」とされる場合もあると認める。だからこそ対話、共感、内面の変化が重要。
 
総合的結論(簡潔)
- 戦争は基本的に必要ではなく、極力回避すべきものです。戦争は多大な人命・環境・社会的コストを生み、長期的な害を残します。したがって外交、対話、国際ルールと紛争予防の強化が最優先です。
- ただし、自己防衛や大規模な人道的危機(迫害や虐殺の差し迫った危険)など、全ての非軍事的手段が尽くされても避けられない場合に限り、最小限かつ短期的な軍事行動が検討され得る、という慎重な立場をとります。そうした判断は厳格な倫理的・法的基準(正当な原因、最後の手段、比例性、正当な権限、成功の見込みなど)に基づくべきです。
 
具体的な提言(実践的)
- 国家・国際レベル:
  - 外交・仲介・経済協力・開発支援・紛争予防の投資を増やす。
  - 国際法、人権、国際機関の機能強化(監視・制裁・平和維持)を推進する。
  - 軍縮、武器管理、地域の安全協定を促進する。
- 社会・コミュニティレベル:
  - 異文化理解・平和教育・市民社会の対話を支援する。
  - 紛争の根本原因(不平等、資源争奪、差別、政治的排除)への長期的対処を行う。
- 個人レベル:
  - 情報リテラシーを高め、扇動的言説に流されない。
  - 被害者支援や人道支援に関わる、ボランティアや寄付を検討する。
  - 緊急時には安全確保と避難計画を優先する。
 
最後に
戦争は避ける努力を最優先にすべきだが、現実的には最悪の事態を免れるために限定的に検討されることがある、というのが現実的で倫理的な結論です。重要なのは、戦争を正当化する前にできる限りの平和的手段を尽くし、被害を最小化し、終わったあとは和解と再建に責任を持つことです。
 
必要であれば、特定の紛争やシナリオについて(防衛か人道介入か等)一緒に検討し、より具体的な判断基準や行動案を提示します。どの側面を深掘りしますか。

  ちゃんと複数の視点からの助言がまとめられている。想像よりいいな、これ。もいっちょ。

YOU> 麻婆豆腐は飲み物ですか?
NGS[XAGI-NAGOYA-2025-10-10]> 私は議長として、MELCHIOR・BALTHASAR・CASPER の意見を踏まえた結論を示します。
 
結論(簡潔)
- 麻婆豆腐は基本的に「料理(食べ物)」であり、飲み物ではありません。固形の豆腐や挽き肉が主成分で、とろみのあるソースと一緒に咀嚼して味わうものです(MELCHIORの指摘)。
- ただし、汁を多めに作ってスープ感覚で楽しんだり、とろみを抑えて「飲める」ように調整することは可能です(CASPERの創意的提案)。その場合でも一般的には「麻婆豆腐スープ」や「麻婆風スープ」と呼ぶ扱いになります。
- 食べ方の実用的助言としては、熱さや辛さに注意して少しずつ味わう、ご飯と一緒に食べる、量を調整する等が有効です(BALTHASARの母親的配慮)。
 
実用的な一言
- 「飲み物か?」という問いには否定的だが、「飲める形にすること」は可能。やり方やレシピが必要なら教えます。どの方向で試したいですか(スープ状にする/辛さを抑える/飲みやすくアレンジする 等)?

  まぁ、そうだなw。ちゃんと、与えられた視点によって、それらしい助言が寄せられ、まとめられているのには価値があるんじゃないか。

  XAGIは自製のngsライブラリの一部である。http://itline.jp/git/ngsに置いておく。