<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Lab on M1KE BL0G</title><link>https://www.m1ke.org/tags/lab/</link><description>Recent content in Lab on M1KE BL0G</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><copyright>mike</copyright><lastBuildDate>Sun, 04 Aug 2024 00:52:30 +0900</lastBuildDate><atom:link href="https://www.m1ke.org/tags/lab/index.xml" rel="self" type="application/rss+xml"/><item><title>実験駆動開発</title><link>https://www.m1ke.org/p/%E5%AE%9F%E9%A8%93%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA/</link><pubDate>Sun, 04 Aug 2024 00:52:30 +0900</pubDate><guid>https://www.m1ke.org/p/%E5%AE%9F%E9%A8%93%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA/</guid><description>&lt;img src="https://www.m1ke.org/p/%E5%AE%9F%E9%A8%93%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA/Experiment-Featured-Image.png" alt="Featured image of post 実験駆動開発" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;blockquote&gt;
&lt;p&gt;人はAIには勝てず、人は金魚になるべきである&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.m1ke.org/p/im-a-goldfish/" &gt;I&amp;rsquo;m a goldfish&lt;/a&gt;で書いた、通り、これはAIの高度な思考方法を目にした自分の結論&lt;/li&gt;
&lt;li&gt;AIは、keenな論理的思考法、圧倒的知識のカバー率、デカルトレベルのDoubt、どれをとっても人間は勝てない&lt;/li&gt;
&lt;li&gt;AIは数万文字を一瞬で読むのに、論文一つ読ませても、深いレベルで理解して解説できる&lt;/li&gt;
&lt;li&gt;人間はオワコンとなっている&lt;/li&gt;
&lt;li&gt;しかし、人間もCheckや理解をしないとAIがやっている事が正さがわからない&lt;/li&gt;
&lt;li&gt;人間が検証可能かつ正しい解答を出す、AIと伴走する開発の方法論が必要&lt;/li&gt;
&lt;li&gt;アイディアのもとはブロックチェーンやGitコマンドにある&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="実験駆動開発"&gt;実験駆動開発&lt;/h2&gt;
&lt;h3 id="バイブコーディングの課題"&gt;バイブコーディングの課題&lt;/h3&gt;
&lt;p&gt;バイブコーディングには次のような課題がある:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AIの労働量が早すぎて、人間のレビューができない&lt;/li&gt;
&lt;li&gt;AIの知能に人間がついていけないため、AIと人間だと深い議論になりにくい&lt;/li&gt;
&lt;li&gt;AIが言った事、やっている事が高度な時に、人間が後々でそれを学習できない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、「今どうなっているか（結論）」と「なぜそうなったか（追跡）」、「人間の知能やマンパワーが足りない」などが問題。&lt;/p&gt;
&lt;h3 id="実験駆動開発とは"&gt;実験駆動開発とは&lt;/h3&gt;
&lt;p&gt;実験駆動開発とは、対象を仮説として立て、AIとの1回1回の試行・結果をmdのログとして保持しながら進める開発手法。会話そのものより、仮説と実験の繰り返しの方が本質なので、会話駆動ではなく実験駆動と呼んでいる。&lt;/p&gt;
&lt;p&gt;そのためには、AI同士をログを残した状態でdiscussionして開発をする必要がある。&lt;/p&gt;
&lt;p&gt;つまり、次を可能にする:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI同士で議論させる =&amp;gt; マンパワー解決&lt;/li&gt;
&lt;li&gt;AIの作業記録を残す =&amp;gt; なぜそうなったかがわかる&lt;/li&gt;
&lt;li&gt;正本管理をする =&amp;gt; 今どうなったかがわかる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="lab"&gt;Lab&lt;/h2&gt;
&lt;h3 id="labの作り方"&gt;Labの作り方&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;まず、AIとのすべての会話のメッセージをMarkdown化して記録する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lab/&lt;/code&gt;というディレクトリの下に、&lt;code&gt;docs/&lt;/code&gt;と&lt;code&gt;reports/&lt;/code&gt;という2つのサブディレクトリを持つ&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;docsは&lt;code&gt;docs/{3桁連番}_{slug}.md&lt;/code&gt;という形式。番号は作成順の恒久的なIDで、内容は直接書き換えていく&lt;/li&gt;
&lt;li&gt;reportsは&lt;code&gt;reports/{3桁連番}_{slug}.md&lt;/code&gt;という形式。一度作ったら書き換えない&lt;/li&gt;
&lt;li&gt;連番はdocs・reportsそれぞれのディレクトリ内で別々に管理する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;これを徹底して、複数のAIの会話をこのMDに落とし続ける&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下がLabのディレクトリ構成の例。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lab/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── docs/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── 001_spec.md # specトピックの現時点の正本（直接書き換える）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── 002_backlog.md # backlogトピックの現時点の正本（直接書き換える）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── reports/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── 001_dictionary_analysis.md # レビュー依頼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── 002_root_cause_review.md # レビュー依頼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── 003_review_response.md # 002への回答
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── 004_naming_convention_update.md # docs/reportsの命名規則自体の変更記録
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;docsという名前は、中身が仮説なのか実験結果なのかbacklogなのかを問わず使える、構造だけを表す名前にしている。仮説（hypo）や実験（exp）のような、用途に特化した名前にすると、別の種類のドキュメントを増やしたくなった瞬間に名前と実態がずれるため、あえて汎用的な名前にしている。&lt;/p&gt;
&lt;p&gt;これによって、AIの一切の会話がすべてmdに落ちるので、透明性と追跡性、そして再検証性など生まれる。&lt;/p&gt;
&lt;h3 id="docsとreportsの意味"&gt;docsとreportsの意味&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;docs（Stack）: トピック（spec、backlogなど）ごとに持つ、常に最新の内容が「今の正本」になる、継続的に更新される生きたドキュメント&lt;/li&gt;
&lt;li&gt;reports（Flow）: 1回の試行・結果の時系列ログで、一区切りごとに1ファイルを必ず作成する、時間とともに流れていく情報&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;両者の違いを表にすると以下の通り。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;docs&lt;/th&gt;
&lt;th&gt;reports&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;データ目的&lt;/td&gt;
&lt;td&gt;Stock型&lt;/td&gt;
&lt;td&gt;Flow型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;スタイル&lt;/td&gt;
&lt;td&gt;Free Form&lt;/td&gt;
&lt;td&gt;IMRaD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可変性&lt;/td&gt;
&lt;td&gt;Mutable（直接書き換える）&lt;/td&gt;
&lt;td&gt;Immutable（一度作ったら書き換えない）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ファイル名&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docs/{NNN}_{slug}.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;reports/{NNN}_{slug}.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;過去の履歴&lt;/td&gt;
&lt;td&gt;git履歴として残る（ファイル自体は最新のみ）&lt;/td&gt;
&lt;td&gt;ファイルそのものが履歴になる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;役割&lt;/td&gt;
&lt;td&gt;今どうなっているか（結論）&lt;/td&gt;
&lt;td&gt;なぜそうなったか（追跡）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;イメージ&lt;/td&gt;
&lt;td&gt;Git HEAD&lt;/td&gt;
&lt;td&gt;Git Log&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;つまり、「今どうなっているか（結論）」と「なぜそうなったか（追跡）」、がわかる仕組み。&lt;/p&gt;
&lt;h3 id="mdはimrad形式にする"&gt;mdはIMRaD形式にする&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;reportはIMRaD（Introduction・Methods・Results・Discussion、結論を加えることも多い）形式を強制する&lt;/li&gt;
&lt;li&gt;背景・手法・結果・考察・結論、そして参考文献という形式に蒸留し直す&lt;/li&gt;
&lt;li&gt;特に、参考文献に過去のreportやdocs、コードなども引用してもらう事で探すのが楽になる&lt;/li&gt;
&lt;li&gt;これらの科学的方法論をベースにすることで、ここの会話で行われた実験の検証性や透明性を担保する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="開発フロー"&gt;開発フロー&lt;/h2&gt;
&lt;p&gt;開発フローは、主にinitとloopの2stepsに分かれる。&lt;/p&gt;
&lt;h3 id="init-管理aiとテーマを決める"&gt;init: 管理AIとテーマを決める&lt;/h3&gt;
&lt;p&gt;AI同士に作業させるため、管理用のAIと、やりたいことをまとめたテーマや仮説を先に作る必要がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;まず、開発でTTPする対象を決める&lt;/li&gt;
&lt;li&gt;これは、ある論文の再現だったり、あるシステムだったりする&lt;/li&gt;
&lt;li&gt;そして、それを構成要素に分解して、要素ごとに数値化する&lt;/li&gt;
&lt;li&gt;その上で、その数値を達成目標にして仮説とする
&lt;ul&gt;
&lt;li&gt;これはマイルストーン、検証項目、達成目標などでもOK&lt;/li&gt;
&lt;li&gt;もしくは、REQ-1, REQ-2のような要件を文章化し、その要件文章の文単位で要件IDをふって細かく管理手法もあり&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;この仮説（正本）を徹底的に管理AIと人間（自分自身）で討論する&lt;/li&gt;
&lt;li&gt;この時点で、この仮説を討論したAIは自分の分身となる&lt;/li&gt;
&lt;li&gt;なぜなら、仮説について自分レベルで理解しているから&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この仮説が開発のバイブルになり、これの理解を徹底的にしている事が大切。&lt;/p&gt;
&lt;h3 id="loop-作業aiと実験する"&gt;loop: 作業AIと実験する&lt;/h3&gt;
&lt;p&gt;作業AIを別途用意して、先程作った管理AIと仮説を使って実験を進める。&lt;/p&gt;
&lt;p&gt;アルゴ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;作業AIを用意して、作業AIに仮説を渡す&lt;/li&gt;
&lt;li&gt;作業AIには実験が終わったらreportを残してもらう&lt;/li&gt;
&lt;li&gt;そのreportを管理AIに渡して指示をもらう&lt;/li&gt;
&lt;li&gt;管理AIのレスポンスを作業AIに渡す&lt;/li&gt;
&lt;li&gt;その繰り返し&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、人間はメッセンジャーになる。&lt;/p&gt;
&lt;h3 id="subissue-別のテーマ化する"&gt;subissue: 別のテーマ化する&lt;/h3&gt;
&lt;p&gt;進捗が悪い時は以下の対処方法で対応する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クリティカルパスじゃない場合:
&lt;ul&gt;
&lt;li&gt;backlogに追加してfuture workとする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;クリティカルパスの場合:
&lt;ul&gt;
&lt;li&gt;そのissueを別途テーマとして切り出す&lt;/li&gt;
&lt;li&gt;別package（フォルダ）で、独立した別Agentに、そのテーマを考えさせる&lt;/li&gt;
&lt;li&gt;つまり、ゼロベースでその問題に特化して対応してもらう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;LabはAIとの会話を、&lt;code&gt;docs/&lt;/code&gt;（Stack）と&lt;code&gt;reports/&lt;/code&gt;（Flow）という2つのサブディレクトリに分けてMarkdown化する記録方法&lt;/li&gt;
&lt;li&gt;docs・reportsは用途に特化しない汎用的な名前で、仮説・実験だけでなくbacklogのような別の内容にも使い回せる&lt;/li&gt;
&lt;li&gt;docsは常に最新の内容が正本になるドキュメントで、番号は恒久ID。reportsは追記のみの時系列ログで、番号は作成順。連番はそれぞれのディレクトリ内で別々に管理する&lt;/li&gt;
&lt;li&gt;人間の役割は自分で考えることではなく、何をdocsに据え何をreportとして残すかを判断して中継するメッセンジャーになる&lt;/li&gt;
&lt;li&gt;本質は会話そのものではなく、仮説と実験の繰り返しなので、実験駆動開発と呼んでいる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考文献"&gt;参考文献&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.m1ke.org/p/im-a-goldfish/" &gt;I&amp;rsquo;m a goldfish&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.m1ke.org/p/g2p%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B%E6%99%82%E3%81%AB%E8%AA%BF%E6%9F%BB%E3%81%97%E3%81%9F%E5%85%88%E8%A1%8C%E6%96%87%E7%8C%AE%E3%81%AA%E3%81%A9%E3%81%AE%E3%83%A1%E3%83%A2/" &gt;G2Pライブラリを作る時に調査した先行文献などのメモ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://hackmd.io/" target="_blank" rel="noopener"
&gt;HackMD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>