前回、正当性検証と妥当性検証について 話したんですけど、
その中で語られていた構造を抽出して、 AIに構造に対してフォーカスさせることで、
精度を上げるツールっていうのを作ってるって 話があったかなと思うんですけど、
今回はそのツールについて聞いてみたいな と思ってるんですけど、いいですかね。
はい、いいですよ。 まだ未発表なことが多いんですけど、
具体的には、使用を検査するツールと 実装と設計っていうのかな、
どっちかを検査するツールを開発しています。
具体的にはどういったものなんですかね。
使用というか要求とかを検査するツールは、 シーケンス図の検査ツールとか、
C4ダイアグラムって言われてるものの 検査ツールになっていて、
ちょっとそれぞれ説明していきますね。
シーケンス図って網田九二みたいな図で、 縦棒が人だったりシステムだったりして、
その間で何かコミュニケーションがされると 矢印が発生するというのがあって、
この矢印っていうのが段々と伝わっていって、
例えばアリスとボブがいるシーケンス図だと、
アリスからボブにこんにちはって言ったら、 ボブがこんにちはって返すみたいな、
そんな感じのシーケンス図ですよね。
こういうふうなシーケンス図って、 実はまずいシーケンス図があるんですね。
例えばアリスがボブに対してこんにちはって言って、 もう1回こんにちはって言うときで、
アリスは何を… アリスもう1人いるとちょっとそれが顕著になるんですけど、
アリスボブだともう1人… 何にしよう、名前。チャーリーか。
何だろうな。チャーリー。
で、アリスがボブにこんにちはって言った。
その後にチャーリーがボブにこんにちはって言った。
これ矢印できますよね。
だけどチャーリーはどうしてアリスが こんにちはって言ったことを知ってたんだろうか。
わかりますよね。
なるほど。 アリスからチャーリーには何来連絡が行ってないわけですよ。
だけどなぜかアリスのこんにちはの後に チャーリーはこんにちはができた。
絶対なんかここでコミュニケーションが 隠れてただろうっていう。
その連続性の間に何かあった。
だからこんにちはっていう例だと その場に全員いそうだからちょっと
例として若干適してないかもしれないけど、
何らか情報を渡した時に、
何でお前知ってんねんっていう状態ですよね。 フローズとして。
で、ここは実は仕様としてはすごく重要なポイントで、
もしそこにメッセージが隠れてたとすると、
そこに何らか伝えるためのチャンネルとして、
例えばチャットなのか、それともシステムなのか わかんないですけどが隠れてるんですよね。
このシステムが隠れてることを見逃しちゃうと、
後々進んでみると、あれここ通信しようと思ったら システムないんですけどってなって、
スケジュールが破滅するみたいなことがあるわけですよ。
なので一般的には暗黙的なところって言われるんですかね。
若干抜け落ちているところ。
それとも常識的に考えてここはちょっと書かなくてもいいよねとか、
若干抜けちゃってるところだと。
そういうところですかね。
そう、でもそこにはやっぱりシステムの入る予知っていうのが、
開発しなきゃいけない予知っていうのがあることが多いので、
このシーケンス図がちゃんと矢印がアミダクジのように繋がってるかってことは、
かなり大事なことなんですね。
ちゃんとアミダクジのように繋がってるってことは、
矢印行ったら戻ってきてとかっていうふうに全部繋がってるっていうことですね。
ここがすごく重要な性質になってくるわけです。
これを今時LLMに矢印繋がってるかどうか確かめてよろってしたくなるじゃないですか。
これが。
したくなりますね。
うまくいかないんですよ。
なるほど。
それは渡し方として結構いろいろあるなと思ってて、
画像として渡すのか、それともマーメイドとかが対応してるかどうかちょっと今忘れたんですけど、
そういう文字ベース、マークダウンとか文字ベースで渡すとかですかね。
これはテキストベースで渡しました。
テキストベース。
マーメイドのアシュみたいなものを使ってやっていたんですけど、
もう見逃しがめっちゃ多いんですね。
見逃しがすごく多い理由とかが多いことに気づいたので、
私はちょっとそこでツールを作ったんですよ。
それは矢印が繋がってないところを検証するっていうツールを作りました。
すごいニッチというかそこだけにフォーカスしたものですね。
だからそのプラントMLのシークエンス図を解析して、
矢印が見たくじみたいに繋がってるかなっていうのを見て、
外れてるところはここがどうも外れてますよとかっていうことを指摘するツールを作りました。
実際外れてても問題ないときってあるんですよ。
だからこれは外れてて問題がある可能性がありますよって指摘をするだけのツールなんです。
警告ですね。
警告をするっていう。
これを1111に使わせてみたところ、ほぼ100%見つけてくれるようになりました。
すごい。
しかもちゃんとその後のこれは本当は問題です、本当は問題ないですみたいな判断までほぼ正確でした。
すごい。
だからこれって何を示唆してるかっていうと、
1111に漠然と投げたりとかルールとかを説明して投げると、
やっぱりどうしてもルールの解釈に誤解が入ったりだとか、
あるいはやっぱり苦手なんでしょうね、単純にそういう計算が。
だからツールによってルールベースで補助をしてあげて、
さっき言った繋がってるっていう繋がりの部分、繋がりの破れてる部分にフォーカスさせてあげると、
彼らがちゃんと正しい判断を下すことができるようになるっていうことなんだと思っています。
そのどこが難しかったのかなっていうのを考えると、
なんか人間だったら図を見てそれを絵で判断して、
ここ書いてなくないみたいなそういう判断ができるわけじゃないですか。
ただ1111に渡したテキストベースだとそこが欠落してしまう。
ビジュアルでの判断が欠落してしまうみたいなところが難しかったんですかね。
実はちょうどセッションの途中で、
繋がってますか、いや繋がってますって最初言って、その後にツールを投入してみたっていうセッションが1回だけあって、
見逃してました、それはなぜあなた見逃したんですかって言ったら、繋がってるの意味を誤解してましたって言ってました。
つまり定義の部分が繋がると言っても、
人間と支持者側とAI側でずれてたんですね。
言うて仮に彼が正確な定義を持ってたとしても、見逃したんじゃないかなって気がしてて。
LMって計算が苦手じゃないですか。
だから苦手なもののうちに入ってるんじゃないかなって気はちょっとだけしていますね。
計算が苦手って言っているのはプログラムを介した計算以外が苦手ってことですか。
足し算とかを電卓使わせないでやらせるとすごく間違った答え出してくるんですね。
文字ベースでの足し算がすごい苦手ですよね。
1足す1足すみたいな引っ掛け問題のやつが。
あとは文字の代償比較も苦手ですよね。
あれはどっちかっていうとバージョン文字列に引きずられてる気がするんですけど。
そこら辺がボトルネックというか、落ち度としてあって繋がっているかどうかという判定ができなかったという。
それでツールってどんな感じでサポートしたんですか。
ツールはクロードコードにシーケンス図が繋がってるっていうのはこういうルールで、こういうルールの検査するGoのプログラムを作ってくださいって言って。
私がテスト例をいくつか渡して、これは繋がってる、これは繋がってないでよろって言ったら一撃で作ってくれましたね。
すごい便利。やっぱりあれですね、ここで汲み取れるというかやっぱり言いたいこととしては、決定論的にAIに使わせることの重要性ですよね。
そうですね、その通りです。
プログラムを実行させて、ただのテキストベースでの推論をさせないということですよね、重要なのは。
そうですね、私はそれはどちらかというと意味にフォーカスさせて、意味の構造にフォーカスさせてるっていう風な言い方をしていて、
例えばシーケンス図で言うとシーケンス図の流れまでは多分ね、LNM理解してると思うんですよ。適切な編集ができるんで彼らも。
なんだけど、繋がってないところって言って曖昧、漠然と探すっていうのがやっぱり苦手で、繋がってないところのその局所の構造をフォーカスさせてあげるとやっと気づく。
これ人間も同じですよね、人間も漠然と探せって言われるとうーんってなっちゃうけど、
こことこことここ怪しいよって言われたら、ここダメ、ここダメ、ここはオッケーってすぐ分かるって話なんだと思っていて、
だから一般的に注意力の話なのかなと思っていて、局所にフォーカスさせてあげると注意リソースがちゃんと人間でもLNMでもそこに向くと、
そこが確かに問題があるってことを指摘するってことですね。
いや確かにそうだなと思いましたね。
でそれを使った上でそのシーケンス図、かなり精度高くなったのかなと思うんですけど、なんか実際にこういう効果あったよみたいなのあったり?
いやめっちゃ見逃し、そのシステムとかの隠れてるところを見逃さないで出してくれたんですよ。
元々今回の場合そのパートナーの企業がいて、そのパートナー企業がシーケンス図の叩きみたいなの出してくれたんですよね。
もうめちゃくちゃ指摘されてました。
だからそういったのは直接パートナーに言うとなんか嫌な気持ちになるかなと思ったんで、こっちが適宜ここの部分ってこういうのがあるんじゃないですかみたいな質問集を作るのに使いましたね。
一旦叩きとしてこっちでフィードバック受けた上で、分かりやすいというかもうちょっと優しい形で指摘じゃないですけどね、質問みたいな形で出してあげるっていうのがありました。
あともう一個がさっきちょろって言ったんですけどC4ダイアグラムっていうのがあって、C4ダイアグラムっていうのは4つのレベルのある記法で、
一番上がコンテキストダイアグラムって言って人間と関わるステークホルダーとシステムが一個だけドームみたいな感じの図になっていて、
次のレベル2になるとコンテナ図っていうのになって、サーバーの本当にコンテナがマイクロアーキテクチャだったらマイクロサービスでいっぱいコンテナが分かれてみたいな感じになって、
さらにその下だとコンポーネントとかになって、だんだん詳細化されていく図なんですね。これって実はシーケンス図と対応関係があって、
このシーケンス図でメッセージをやり取りするところは、さっき言ったC4ダイアグラムとコンテキストダイアグラムってところで関係があるってみなされるわけですよね。
だから線で繋がるわけですよ。っていうふうなことをやっていくとシーケンス図とこのC4ダイアグラムが整合してるかってことは当然気になるわけです。
これをAIに整合してるかどうか調べてやろうってやってみたんですよ。まあ見逃しますね。
同じ理由ですよね。
それでプラントユーメルの矢印とシーケンス図の矢印っていうのが整合するかをルールベースでやっぱり同じようにツールを作らせて確認させたら100%の成果になりましたねっていう感じになっていて、
やっぱり彼ら苦手なんですね。そういう漠然と。もちろん整合してるって定義は与えてますよ。
整合してるってのはそれぞれ矢印があるときに矢印がありべきで、矢印がないときには矢印がないべきだみたいなちゃんとそれっぽい定義与えてるんですけど、それでもやっぱり見つけてくれないですね。
やっぱ重要ですね。なんとなく人間だとパッと見めちゃくちゃ複雑なシーケンス図とかだと絶対見逃すと思うんですよね。
なんですけどAIだったら複雑であったとしても絶対繋がってなかったら指摘してくれるってことですよね。
そうですね。
ちなみに栗上さんがパッと見たときにその図で繋がってないと思ったところはあったんですか?先に見たときに、AIに渡す前に。
もちろん指差しながら拡大してこうやってたんで、要するに全部に注意払ってやってたんですよね最初は。
AIに任せきるわけにいかなかったんで。そしたらまあまあ見つかるは見つかるわって感じですね。
じゃあそれありつつもAIにチェックさせてみたらかなり精度高く、てか100%見つけてくれたっていう。
その後ツールを導入したら100%見つけてくれたって感じですね。
なんかそのツール単純に便利そうっていうか、話聞く限りシーケンス図のリントツールなのかなと思ったんですけど。
ちょうどその話しようと思ったんですよ。これちょっとリントツールとは少し違うなと思ってるんですね。
違うんですね。
リントツールって誤警告を出さないようにするっていうのがすごく重要なミッションで。
だってそのリントツールCIとかで書けるじゃないですか。
で誤警告多くて、毎回コメントでこうディセーブルするみたいなこと。
まあそれもそうしたのもなくはないんですけど、やっぱりリントってのは誤警告が少なくなるように作ってるんですよね。
割れ間の理論をね、回避するためには。
なんだけど、このLLMの注意を払わせるシステムっていうのは誤警告してもいいんですよ。
だって最終的にLLMがジャッジしてくれるから。
確かに。
っていう意味でLLMとはちょっと違った生き物なんですよね。
より誤警告に寛容なシステムにいったらいいのかな。
なので私はちょっとリントとはかなり心を切り替えて作らないといけないと思っていて。
なるほど。
じゃあそれでいうと、LLMと組み合わせることでリントツールになるのかな?
そういうことですね、その通りです。
CIで実行する際にはそのツールだけじゃなくて、Goで書いたツールだけじゃなくて、
LLMの誤検知したやつを省いてねっていうような形で実行させとけばいい?
私は今回スキルとかで入れてるんで、プレコミットみたいな感じとかでチェックさせるようにしてるんで、
CAにはしてないんですけど、全体そういう感じですね。
じゃあそこまでいったらリントですね。
そうですね。
リントの考え方とちょっと近しいところですね。
じゃあリントのサブセットみたいな感じですよね、サブツールみたいな。
ただやっぱりリントのいいところは高速であることなんですよ。
リントってタイプするごとにかかってほしいって人もいるくらいで、
すごく高速なことが求められるんですよね。
その点でもやっぱりLLMがジャッジするリントってのは異なってて、
遅いんですよ、すごくLLMがジャッジするって。
だからリントっていうよりかはどっちかというとそういう意味ではテストのライフサイクルに近い。
テストですね、確かに。
っていうものですね。
ただテストってやっぱり普通は実装、使用との間で検証するものですけど、
使用じゃなくて、使用と何の間、要求とかの間とか、
使用と使用の間の成功性とかっていうのをチェックするって意味ではリントに近いっていう、
ちょっとなんかこう独特な立ち位置のツールになるわけですね。
相残ってところですね。
そうですね、相残ってところですね。
そうじて。
そこまでの速度ではないけども、かなり精度高く、
しかも頻繁に事故できるものっていう形なの。
ちなみに実行してるのはクロードコード?
クロードコードって実行してますね。
クロードコードのスキル、ルールファイルかな。
ルールファイルでいじった後はこれでチェックしてねって見てるのと、
あとは自動でレンダリングするパイプラインを組んでいって、
例えばプラントMLとかだったらテキストで書かれてて見づらいじゃないですか。
だから自動でそのPNGとかにレンダリングするパイプラインの中に組み込まれています。
の1個のワークフローの中に入ってるってことですね。
入ってる感じですね。
他の人に使ってもらったりするんですか?
他の人にも使ってもらえるように、
シーケースズのレビュースキルとか、
C4ダイグラムのレビュースキルみたいなのがリポートストリームの中に入ってます。
それ使ってねって言ってますね。
じゃあ他の人が書いたとしても、
ちゃんと適宜するフォーマットとしてある程度は出てくるってことですね。
ちゃんと設定されてればってことですね。
すごい良いですね。
それで作ったもの、最終的にできたものっていうのは設計書なんですかね?
今のシーケンスズの話はシーケンスズとC4ダイグラムが出てくるっていう感じですね。
さっき実装設計を検査するツールも作ったって話もしてたんで、
そっちの話をしようかなと思うんですけど、
LLM2の設計ってダメダメなことがすごく多かったと思ってるんですよ。
これは2つ理由があると思っていて、
良い設計っていうのはまず定義をするとダメダメってのはなぜなのかってことが分かるんですけど、
良い設計の定義っていうのは未来に渡って変更する時のコストが最も低い設計っていうのが良い設計なんですよね。
だから例えば2つちょっと良い例と悪い例を挙げてみましょう。
1つは拡張ポイントがめちゃくちゃどこにでもあります。
もう至る所プラグインでできますみたいな。
これは拡張できるってことは未来の変更コストが安いように思えるじゃないですか。
ワードプレスってやつですね。
実際は使わない拡張ポイントの方が多いんですよ。
使わない拡張ポイントって理解の不採になったりだとか、
あるいは実行速度の問題になったりとかっていうふうに不採を残すんですよね。
こういうふうな不採があるってことは結局設計としては良くないんです。
コストがかかるわけだから未来に渡って。
じゃあもう1個何も知らない。
今回聞いた要件だけをやるバリバリの1000行のメイン関数だけのやつを作った。
拡張ポイント全部なくしちゃったぞみたいなやつ。
これもこれでまたひどいということですね。
要件があるごとにそれがすごく書き換えなきゃいけなくなってしまう。
毎回そのために1000行の関数をテストしなきゃいけない。
これはものすごく大変ですね。
なので拡張ポイントっていうのは
未来で使う拡張ポイントだけがちょうどあるって状態が一番良い設計なわけですね。
ということを踏まえた上で
どういうふうにLLMに指示してあげればこの良い設計をしてくれるかといったら
未来の情報は絶対必要だなと思いませんでした?
それはそうですね。
だって未来の情報が1ビットでもないと
こうなるだろうという設計ってできないと思うんで。
だからみんなフレームワークがここで分かれてるからとかっていう理由で
みんなここで分けてるからっていう感じで分けちゃう。
一般的な話になっちゃうんですね。
だからここは違うんだよってなっちゃうわけですよ。
だから人間は未来の情報を与えなきゃいけないっていうのがまず一つ。
つまりあなたはどういうロードマップで何を順々に実装しようとしていて
っていうことがちゃんとロードマップとして管理されてることがすごく重要なわけですね。
これが一つ。
もう一つはテスト駆動開発とかっていうのをちゃんとしてるかっていうのは結構重要で
テスト駆動開発ってすごく設計の良いギプスになるんですよ。
なんでかって言うとテストって製品コードの最初のユーザーなんですよ。
いい表現ですね。
そうですね。これよく私が作ったこともあるんですよ。
メソッドからこう言ってることもあるんですけど。
なのでそのテストを通して使いにくいコンポーネントが作られてしまっている場合
当然製品コードの中ではめちゃくちゃになっていくっていうことになるわけですね。
これの端的な例から。
使いづらいからね。
製品コードの中ではすごく楽に使えるんだけど
切り出してテストしようとすると依存がもうひっちゃかめっちゃかになってて
セットアップがほぼ80%を占めるテストを書かなきゃいけないみたいなことがよくあると思います。
これはぶっちゃけ使いづらいですね。
三つ結合になっちゃってやばいですねっていうのになっていて
これは一般的には良い設計ではない。
その部分を変えようと思ったらその依存部分も全部変えなきゃいけなくなっちゃうっていうパターンが多いからですね。
ってことを考えるとテスト駆動設計で部分的に切り出されてテストできるっていうパーツを積み重ねていくってことができるんですよ。
テストが先に書かれてテストできるものしか書けなくてってなると
自動的に80%のセットアップを占めるコードは生まれなくなるわけですね。
ちゃんとセットアップが1行2行とかで実際実行するのが3行とかあって
アサルトの部分が2行とかになるっていうすごくシンプルなテストになるっていうのがあって
それは使いやすい、一般的には良い設計のコードが生まれやすいっていうのがあって
テスト駆動開発を支持すると結構設計ってよくなるんですよ。
この2つって私はそのLLMの鍵だと思っていて
未来の情報を与える設計のTDDをさせるっていうのがあるんですね。