Claude Codeと遺伝的アルゴリズムでねづっち

2026-02-17 12:21:44

TL;DR

Claude Codeと遺伝的アルゴリズムで、
ねづっちみたいななぞかけを作ってみたら、

進化して、

「風呂とかけまして、チャンスとときます。その心は、どちらも日(火)が大事でしょう」とか
「靴とかけまして、上司とときます。その心は、どちらも合わないと辛いでしょう」

とかを作ってくれた

きっかけ

遺伝的アルゴリズムという進化するアルゴリズムは結構好きなんだけど、
Claude Codeをどうにか活かしてそれができないかなと思った。

これは、Claude Codeに遺伝的アルゴリズムのプログラムを書いてもらうという話ではない。
それでは普通の遺伝子プログラミングなので、AI使う意味がなくてあんまり面白くない。

そうじゃなくて、
ファイルを遺伝子とみなし、
その内容をAIエージェントが読み取って交差させ、
それをさらに別のAIエージェントが評価するって流れ。

この方式のいいところは、遺伝的アルゴリズムなんだけど、評価関数を明確に定めなくてもいいところ。
普通だと評価関数を計算可能なものにしないといけないけど、この方式だとAIが評価してくれるからふわっとした指示で実現可能。
あと、遺伝子がただの文字列なので、指示次第でどのような遺伝子も構成できること。

まあ、とりあえずClaude Codeのskill機能を使って何か作りたかったってのもあるw

題材はひとまず、なぞかけ
簡単そうだし。

構成

それそれ別に立ち上げたAIエージェント1,2を、
1: 遺伝子生成
2: 遺伝子評価

という風に役割分担してもらう。
そうじゃないと、生成したやつが評価することになり、客観性が失われると思ったから。

ということで、1,2用に下記skillを用意
遺伝子数が100個とか、エリート選択が20個とかはのちのち変更できるようにしたいけど、今はとりあえず決め打ち。

生成者


---
name: gene-generator
description: |
  This skill should be used when the user asks to "進化させて", "次世代を生み出して"
allowed-tools: Read, Write, Bash
---

# Gene Generator

@gene配下の遺伝子を使って次世代を生み出します。

## 用語

現世代: @geneディレクトリ配下の、最も数値が大きいディレクトリ名の数値
次世代: 現世代より1つ大きい数の世代

## 遺伝子ファイルの構成について

遺伝子ファイルの構造は、 @template.md ファイルを参照


世代数は、そのファイルが含まれるディレクトリと同じ
同一世代の中の連番は、そのファイル名と同じ
遺伝子の評価ランクは、その遺伝子を評価した結果の順位。ファイルを作成するときは空欄のままとする。
遺伝子の中身が、実際に生成する遺伝子





## 生み出す世代について

現世代の中の遺伝子100個のうち、20個を使って次世代を生み出します。

## Workflow

### 1. 現世代のディレクトリの確認

1つもディレクトリがない場合は、0世代のディレクトリを作成し、
その中に、遺伝子を20個作成する。遺伝子の中身は、スキルを指示されたときの遺伝子の形式に則っていればなんでもよい。

### 2. 次世代ディレクトリの作成

存在しないことを確かめてから作成

### 3. 現世代から、上位20個の遺伝子を抽出

現世代の全てのファイルをチェックし、
遺伝子の評価ランクが、上位20個(1〜20の値) になっているファイルを選ぶ

### 4. 次世代の生成

現世代の上位20個から、2個をランダムに選び、
それを親として、子のファイルを作り、次世代ディレクトリに保存する。
子のファイルを作るときの、遺伝子の中身の掛け合わせ方は、このスキルを指示されたときのやり方に従う。
指示されていなかったら、確認する。

遺伝子ファイルは、遺伝子の評価ランク以外は全て入力できるはずなので、ミスしないように気をつける。


上記の、親を選ぶところからの動作を、次世代のファイルが100個になるまで繰り返す。
現世代の上位20個のうち、同じファイルが何度親になってもよいし、1度も親にならなくてもよい。完全にランダムで選ぶ。

こちらが評価者


---
name: gene-evaluator
description: |
  This skill should be used when the user asks to "評価して", "現世代を評価して"
allowed-tools: Read, Write, Bash
---

# Gene Evaluator

@gene配下の遺伝子を評価します。

## 用語

現世代: @geneディレクトリ配下の、最も数値が大きいディレクトリ名の数値

## 遺伝子ファイルの構成について

遺伝子ファイルの構造は、 @template.md ファイルを参照

世代数は、そのファイルが含まれるディレクトリと同じ
同一世代の中の連番は、そのファイル名と同じ
遺伝子の評価ランクは、その遺伝子を評価した結果の順位。ファイルを作成するときは空欄のままとする。
遺伝子の中身が、実際に生成する遺伝子


## Workflow

### 1. 現世代のディレクトリの確認

1つもディレクトリがない場合は、終了。


### 2. 現世代を一つ一つ評価

現世代のファイルを連番順に一つずつ確認し、
遺伝子の中身を、このスキルが指示されたときに、同じく指示された判断基準に則った評価をすること。

### 3. 現世代の遺伝子ファイルを更新

一つ一つ評価し、判断基準を満たしている順に、各遺伝子ファイルにランクをつける。
それを遺伝子ファイル内の遺伝子評価ランクに書き込む。
例えば100個遺伝子がいた場合、必ず遺伝子評価ランクは1〜100のいずれかになる。
甲乙つけがたいものでも、必ず同一世代内で被ることのないようにする。


実際にやってみる。

ターミナルを2つ立ち上げて、片方を生成者で、もう片方を評価者とする。
プロンプトで何を進化させたいか、どういう遺伝子で、どう掛け合わせるのか、
評価基準は何かを書く。

生成者へのプロンプト
「進化させて。遺伝子を、「{A}とかけまして、{B}とときます。その心は、{C}でしょう」の形式としてほしい。
掛け合わせるときは、A,B,Cのみの部分のみ変更し、A,B,Cそれぞれの値を、親2体のそれぞれの値のいずれかいからランダムで選ぶようにして。」

最初の”進化させて”がスキル使ってもらうようにするおまじない。まあこれはもっと曖昧な書き方でもやってくれそう。

で、一つ世代を作成してもらったら、
次に評価者に、下記プロンプトで評価してもらう。

「現世代を評価して。評価基準は、面白いかどうか。」

ね、ふわっとした評価基準でしょ。面白いと思うかどうかはAIまかせ。

初期世代

進化の前に、初期世代が必要なんだけど、面倒なので、同じく生成者AIエージェントに作ってもらった。

ここで誤算だったことが一つ。
僕は何もなぞかけがどういうものかは指示していないし、初期世代なんだからランダムな言葉を選ぶだろうと高を括ってたら、
すでにちゃんとしたなぞかけになっている。

claude_code_play_on_words_by_ga_01

考えれば当たり前のことなんだけど、Claude Codeがなぞかけのフォーマットをみただけで、勝手に推測してくれてしまった。
空気読みすぎるなよ。

あー、これじゃ、ランダムに掛け合わせても絶対意味の分からないなぞかけしかできないじゃん!
滑ったねづっちじゃん!いや、滑るどこか、それじゃ舞台に立たせてもらえないよ!

って思ったけど、面倒なのでそのまま進めてみた。

0世代を評価者AIエージェントに評価し、ランキングをつけてもらう。

claude_code_play_on_words_by_ga_02

おお、ちゃんと、Claude Codeが面白いとはどういうことかを考えてくれて、その基準で評価してくれる。

「ガニメアンのコンピュータ」とか、そういうところは気にしないで。ただ僕のAIのoutput-styleなだけ
(知りたい人は 以前の記事 参照)

2世代進化させて、評価させた結果

さて、これを1世代、2世代をやってたら、
2世代目で、Claude Codeの5時間制限にひっかかった。あれ?そんなに使った?って感じ。
僕はProを契約しているから、少ないのはそうなんだけど、たかだか100個のmdを何度か読んだり書いたりしただけでそんなにいくかな。
特に評価者AIエージェントが結構食ってる感じ。
まあここは後で調べてみる。

さて、2世代たった後はどうなったか?

冒頭で話した、
「風呂とかけまして、チャンスとときます。その心は、どちらも日(火)が大事でしょう」とか
「靴とかけまして、上司とときます。その心は、どちらも合わないと辛いでしょう」
とかのなぞかけを作ってくれた。

評価者エージェントが書いてくれたサマリー。


第2世代 評価サマリー

上位10個

ランク: 1位
遺伝子: 047   
なぞかけ: 風呂×チャンス=日(火)が大事
評価理由: 第2世代の傑作。 風呂を沸かすには「火」、チャンスには「日」。同音異義語が完璧に機能 
──────────────────────────────────────── 
ランク: 2位
遺伝子: 072
なぞかけ: 図書館×政治家=静かにしないと
評価理由: 風刺的で秀逸。 「政治家は黙っていろ」という皮肉が効いている
──────────────────────────────────────── 
ランク: 3位
遺伝子: 077
なぞかけ: 鏡×政治家=自分を映す
評価理由: 社会派なぞかけ。 政治家こそ自分を省みよ、という含み
──────────────────────────────────────── 
ランク: 4位
遺伝子: 020
なぞかけ: 包丁×政治家=切れ味が大事
評価理由: 包丁の切れ味と政治家の決断力。キレのある組み合わせ 
──────────────────────────────────────── 
ランク: 5位
遺伝子: 003
なぞかけ: 猫×プログラマー=バグを追いかける
評価理由: 不朽の名作。3世代連続で生存
──────────────────────────────────────── 
ランク: 6位
遺伝子: 018
なぞかけ: 算数×上司=合わないと辛い
評価理由: 新種。 「計算が合わない」と「上司と合わない」の二重掛け
──────────────────────────────────────── 
ランク: 7位
遺伝子: 086
なぞかけ: 布団×教師=かけるもの
評価理由: 新種。 布団をかける、教師が問題をかける
────────────────────────────────────────
ランク: 8位
遺伝子: 037
なぞかけ: 算数×決断=かけるもの
評価理由: かけ算と決断に賭ける
────────────────────────────────────────
ランク: 9位
遺伝子: 017
なぞかけ: 靴×上司=合わないと辛い
評価理由: 安定の生存者
────────────────────────────────────────
ランク: 10位
遺伝子: 008
なぞかけ: 窓×チャンス=開けると景色が変わる
評価理由: 詩的で余韻がある

進化の傾向

- 政治家系の台頭:
072、077、020と、政治家をお題にした風刺的な新種が上位に集中。交叉が「政治家」という素材の可能性を広げた
- 「切れ味」遺伝子の暴走:
「切れ味が大事」という心が、包丁以外のお題(猫、カレンダー、鏡)にも拡散し、大量の不適合個体を生んでいる
- 重複の増加:
猫×プログラマー=バグ、鏡×記憶=自分を映す、布団×税金=かけるもの等の重複が目立つ。遺伝的多様性の低下が顕著
- 第1世代の名作089(ピアノ×プログラマー=鍵が大事)が消滅:
惜しい。056(ピアノ×教師=鍵が大事)として部分的に生存しているが

前世代と比較すると、上位の質はさらに向上した。特に風刺系の新種が面白い。ただし、中下位の質は似たようなもので、無意
味な交叉の産物が依然として半数を占めている。


進化の傾向を勝手に分析してくれたのが面白いw

まとめと課題

まあ、はっきり言って、なぞかけとしては、ねづっちにはまだ遠く及ばなそうだし、
ぱっと言われて笑えるとか刺さるかと言われたらそうでもなさそうななぞかけしかできていないけど、
ちゃんと仕組みは動いているのが確認できた。
(もちろん、ねづっちはすごいなってことも再認識できたw)

今後の課題を挙げてみると、

  • そもそもGenerative AIなんだから、最初からAIになぞかけ作らせればよくない?遺伝子アルゴリズム必要?
    -> うん、ぶっちゃけいらないかも。
    だから、この仕組みはあんまり効率はよくないというのはなんとなく気づいている。
    現段階だと成果物に意義があるわけじゃなくて、
    評価関数を決めなくてもAIが雰囲気を読んで評価してくれるっていうアイディアが何かに使えないかと思っている。
    ただ、この仕組みを応用したら面白そうなのが、短編小説作成とか音楽作成とかのクリエイティブなもの。
    AIが作りそうなものをさらに遺伝子アルゴリズムにかけることで、
    普通ならAIが考えないこと、または、人間が指示しなさそうなことなどの、「想定していない意外な方向性」に持っていくことができると、遺伝子アルゴリズムの意味がある気がする。
    AIの限界突破とまでは言うつもりはないけど、その理の外に出るというか。
    良くも悪くも現在のGenerative AIは、一番それっぽいところを狙っていくように作られているので、考えもしなかったって方向性に面白いものがあったときに見逃しやすいのかなって。

  • 遺伝子アルゴリズムにしては、突然変異がないよね?
    -> 最初はClaude Codeのコンパクションが走ると記憶を失って突然変異的になるかと想定していたんだけど、コンパクションが来る前に5時間リミットがきてしまった。
    なので、また今後やってみる。

  • なんでこんなに早く5時間リミットがくるのか?
    -> 評価者AIエージェント側が、かなりトークンを使っている気がするのは、思考が結構必要だからかな?
    それとも無駄にファイルを100個とかにわけているから、トークンが増えている?
    1世代をファイルを一つにまとめたら使用量が減るのか?
    それとも、ターミナルに出力するなって言えば減るのか?
    まだ理由がはっきりしていないので、これも今後の改善課題。

って感じかな。




Comments

There are currently no comments on this article, be the first to add one below

Add a Comment

Note that I may remove comments for any reason, so try to be civil. If you are looking for a response to your comment, either leave your email address or check back on this page periodically.