$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

自分の知りたい領域をDeep Researchでハンズオン資料を作って学ぶ

CursorやClineなどで生成AIを使ってコーディングをしていると、Reasoningモデルとか、Thinkingモードとか、そういったワードに出会うことが多い。これらが意味することについて理解できてないと感じていた。

何かを学ぶとき、資料を読むだけではなく手を動かしてみると理解が早くなる。そこでChatGPTのDeep Researchでハンズオン資料を作り、それを元に学ぶと効率が良いのではないかと考えた。今回の記事ではハンズオンの作成と実施の過程をまとめておく。

ハンズオン資料をDeep Researchで作る

次のように質問してDeep Researchでハンズオン資料を作る。

すると https://chatgpt.com/share/6819d686-5ae0-8010-8196-d532528dc82a のような資料が作られた。

  • 序文
  • 実験の章の一部

見出しはこういう感じ。

  • はじめに
  • LLMの思考・推論に関する重要なコアコンセプト
    • チェーン・オブ・ソート(Chain-of-Thought)プロンプティング
    • ReAct(推論+行動)フレームワーク
    • ツールの活用による拡張 (LLM Tool Use)
    • メタ認知プロンプティング(自己認識・自己評価プロンプト)
  • ハンズオン:推論パターンの実践(Google Colab)
    • 準備: Colab環境セットアップ (目安: 0.5時間)
    • 実験1: チェーン・オブ・ソートで数学問題を解く (目安: 2時間)
    • 実験2: LangChainを用いた簡単なReActエージェント (目安: 4時間)
    • 実験3: モデルの自己反省プロンプトを試す (目安: 1.5時間)
  • おわりに:学習計画のまとめと今後の展望

Google Colabで実践する

資料ができたので、コアコンセプトの資料を読んだ後、ハンズオンに取り組んだ。

実施すると、ハンズオン資料のコードのままだとうまく動かなかったり、実際に理解したいことと微妙に外れていたりした。今回学びたい領域が新しい領域なため、Deep Researchでも細かい部分はうまくいかなかったのかなと思う。

そこで資料自体を批判的に捉え、違和感があった時やうまく動かない時は自分で調査をし、学びたいことを適切に行うための実装に変更しながら進めていった。このやり方はむしろ理解を深められて良かった。

またハンズオン資料をそのままやるだけでなく、あえて脱線して気になったことを深掘りすることも大切だった。僕の場合ReActフレームワークが具体的にどういう動きをするかが非常に気になったため、debugログを出して1つずつ動きを確認していった。結構時間がかかったが、今のコーディングエージェントがどう動いているかの基本部分を理解できた気がする。

最終的にできたものは https://github.com/shibayu36/playground/blob/main/ai-reasoning-study/AI_Reasoning_Study.ipynb

学んだこと

  • LLMにおけるReasoningが何かというのは難しいが、LLMの推論能力や推論させる(論理的に考えさせる)ための方法的な意味で使われている
  • 論理的に考えさせるためには、ステップを区切って一つずつ思考させるためのCoT、思考とアクションを繰り返すReAct、出力に対し自己反省させて正しいものに修正する自己反省プロンプトなどいろんな手法がある
  • ReActについては、今のコーディングエージェントのtool callの仕組みの理解に繋がった。また改めて記事にしたい

まとめ

今回はLLMのReasoningという自分の知りたい領域について、Deep Researchでハンズオン資料を作って学ぶという方法を試してみた。入門するにはなかなか良い資料ができたし、ハンズオン資料を使いながらその間違いを修正していくくらいの気持ちでやっていくと理解が深まった。

ReAct周りを深掘りして追いかけたことでコーディングエージェントがやっていることの一部を理解できた。これについては別で記事を書こうと思う。

AIによりコードレビューや対話による新しい発見のような学習が増えた

ソフトウェアエンジニアリングの学び方には、書籍を読む、サンプルコードを写経するなど色々とある。その中で、同僚とのコードレビューや対話による新しい発見も1つの学習方法として非常に役立っていた。他人との対話による学習は、他の学習と違って自分が想像していなかった視点をもらえたり、固定観念に気付かされたりと、とても有益だった。ただしこれまではこの学習は他人がいないと成立しないものだった。

ChatGPTのようなAIの登場で、このような対話による新しい発見を得られる機会が非常に増えた。ChatGPTなどと会話を通して調査・設計していると、なるほどそういう解決策があるのかと驚かされる瞬間が頻繁に訪れる。

とはいえ、新たな気づきを得るためには、AIの使い方にも工夫が必要だ。たとえば細部まで自分で考えた後で細かい部分に対して質問してしまうと、自分の視点の回答だけを引き出す結果になってしまうことが多い。そうならないように僕は次のような工夫をしている。

  • いきなりHowを聞くのではなく、その要件について考える時に考慮すべき観点が何かを先に聞き、自分が想定していなかった観点に気づけるようにする
  • 解決策について複数案考えてもらい、それぞれのメリット・デメリットも合わせて聞く

このようにAIが進歩したことで対話による新たな発見が加速したのでありがたい。一方で使い方によっては自分の視点だけを強化することになるので気をつけたいと感じた。

MySQLのスキーマ情報を返すMCPサーバーをVibe Codingで作った具体的な流れ

前回紹介したMySQLのスキーマ情報を圧縮して提供するMCPサーバーは、かなりの部分をVibe Codingで作った。その時にVibe Codingのやり方を調べていたのだが、Tipsは色々出てくるものの、具体的にどうAIと会話していったかなどはあまり分からず困っていた。

そこで今回の記事では、このツールの実装時に具体的にどのようにVibe Codingをしたかを紹介する。同じように具体的なやり方が分からず困っている人の参考になれば嬉しい。

今回のMCPサーバーを作った時、全体としては以下のようにVibe Codingをした。

  • 機能要件が大体動く部分までは、ほぼコードレビューすらせずに動作確認だけするようなVibe Codingで作る
  • テストの最初の構造作りはVibe Codingがうまくいかなかったため、この辺りを自分で用意
  • それ以降もここまで、テスト作り・リファクタ・text/template利用などの変更を加えた。Vibe Codingをメインとしながら、うまくいかない部分をちょっとだけ手で更新しつつ実装した

この中で一部の実装の実例を紹介していきたいと思う。今回のレポジトリではこのcommitのtreeまでは、.cursor/配下やdocs/配下も積極的にcomitしているので、その辺りも一緒に見ると分かりやすいと思う。

基本の流れ

  • 作り始める前に、チャットで要件を壁打ちしてもらいながらrequirements.mdというファイルを作る
  • 何かを実装するときは、まずチャットで設計をしてもらう => それを実現するためのTODOリストも含めてdocsに書き出しをしておく => そのdocsを再度読み込ませてコーディングしてもらうという流れで行う
    • ただし複雑な設計じゃなくコンテキスト長の制限を超えないケースならdocsに書き出さずにそのまま実装しても良い
  • 作りながら仕様変更や設計変更をしたら、docsに書き出ししておく

今回はCursorのAgentを活用し、modelはGemini 2.5 Proを使っていることが多かった。たまにo4-miniやClaude 3.5 Sonnetを使うこともあった。またmemory bankやMCPサーバーは使わなかった。

実例

requirements.mdの壁打ち

まずは要件定義を壁打ちしてもらった実例から。以下のような質問から開始して要件定義に付き合ってもらった。

その後もかなり雑にチャットを続けていて

やりたい事としては、環境変数でどのデータベースに接続するかを設定した後に、tool callで
- テーブル一覧を出力
- テーブル詳細を出力
の2つを出したい
どんな名前のツールにするといいかな?

あたりを質問続けて会話しながら、それっぽいのできたなと思った段階で、「今までの会話をrequirements.mdに反映させてください」と言って書き出してもらった。

その時にできたものがこちら。眺めるとわかるが、実はこの時点ではAIがMCPサーバーの概念を理解していない。

そこで続いてMCPサーバーの概念を理解させながらrequirements.mdを更新することにした。MCPサーバーを実装する時の参考資料である https://modelcontextprotocol.io/quickstart/server が使えると思ったため、ChatGPTで以下のような質問をしてまずサマリー資料を作ってもらった。

MCP Serverを実装するときにAIに参考のために読み込ませる資料を用意したい。
https://modelcontextprotocol.io/quickstart/server の資料を読み込み、
AIに読ませるmarkdownの情報を作って

作った資料をdocs/に配置した後、読み込ませてもう一度requirements.mdを作ったcommitがこちら。MCPサーバーのtoolの概念を理解したようなrequirements.mdができた。

ここまでのdiffも参照してほしい。

list_tablesの実装

続いてlist_tablesという、特定データベースのテーブル一覧のサマリー情報を出力するtool機能を実装した時の実例を紹介する。全体像はこちら

この時はlist_tablesの実装のためのTODOリストを自分の頭の中に持っていたので、1つずつVibe Codingで実装した。

まずはテーブル名とテーブルコメントだけ出力する部分を作った。これを作るときは次のようにCursorの@参照を使ってdocs/配下を読み込んでまずコード書かずに設計してねと伝えて設計から始めた。大体のチャットの流れ的には

@main.go ではlist_tablesを作っていきたい。まずはコードを書かずにどのような設計にするか考えてみてほしい @docs 
とりあえずテーブル名とテーブルコメントを一覧表示するのはどうだろうか
@https://github.com/mark3labs/mcp-go/blob/main/README.md の情報を読み込み、listTablesHandlerが返す内容をもう少し精査して

その後どんどんチャットを繰り返し、それっぽく設計できたなと思ったタイミングで次のように一気にコード生成した。

良いですね。main.goにこの実装を反映して

このような流れで同様にPK,UK,FKの出力部分も作っていった。

text/templateを利用するリファクタリングをした時の実装

これまでに説明したやり方で、全部の機能要件は作っていった。続いてtext/templateを使うようにするリファクタリングの実例も紹介する。

最初にVibe Codingで作ったコードは、テキストの組み立てを文字列結合でひたすらやっていくという実装になっていた。見通しをよくするためにtext/templateを使えないかなと考えたため、Vibe Codingで実現していった。全体像はこれ

やり方自体はこれまで紹介したのと同様で、まずチャットで設計をしてもらう => それを実現するためのTODOリストも含めてdocsに書き出しをしておく => そのdocsを再度読み込ませてコーディングしてもらうという流れだ。最初はこういう質問から始めて

さらにチャットをどんどん繰り返す。たとえば以下のような質問をしたりしながら繰り返した。

テンプレート系の処理はview.goにすると良いですかね?他に良いファイル名あります?

大体設計ができたなと思ったらdocsに書き出してもらった。その時できたのがこれ(ただしこのdocsをcommitせずに進行したのでdescribe_tablesのtext/template化のものも混ざっている)

そういう方向でいきましょう。今までの設計をdocs/onetime/20250427-use-template.mdに書き出してもらっていいですか?

そのあと実装フェーズに移った。先ほどのドキュメントを読ませた上でさらにTODOリストを作らせて

ステップバイステップでいきましょう。まず何からやるべきですか?

その後1つずつコード生成をして、都度gitのstageに載せ、次のステップを実装という流れを繰り返した。最終的にlist_tablesのtext/template化が完成したタイミングでcommitした。

あとは同様の流れでdescribe_tables側も作成してリファクタが完了した。

Vibe Codingを試して感じたこと

  • 今回はいろんなmodelを試した中で、Gemini 2.5 Proがかなり良かった。コンテキスト長が長いからなのかなぜなのかはよく分からない
    • ただしGeminiは無駄にコードコメントを書きまくってしまうという特性があり、その部分は非常に面倒だった
  • .cursor/rules/配下を整えるのは大前提
  • 新しめの技術仕様やライブラリの使い方は別でdocsを用意して必要な時に読み込ませると良い
  • 今回はVibe Codingを理解するために縛りプレイでエージェントにお任せしたが、書き捨てコードや自分だけでメンテするようなツールでない限り、Vibe CodingでPoCしつつ、その後は自分でコードを調整したり書き直したりした方が良さそう

まとめ

今回は、MySQLのスキーマ情報を返すMCPサーバーをVibe Codingで作った具体的な流れを紹介した。Vibe Codingに関するいろんな記事が出ているが具体的な例があまり無く困っていたので、同じような悩みを持っている人の参考になれば嬉しい。