先の記事「Visual Studio 2026 AI 駆動開発 - チャット」では、Visual Studio 2026 + GitHub Copilot で Ask Mode を使ってチャットを行う例を書きました。この記事では Agent Mode を試してみた時の話を書きます。

自分の環境の Visual Studio 2026 + GitHub Copilot Free ではデフォルトで Ask Mode になっていましたが、上の画像のようにしてチャットウィンドウで Agent Mode に設定できます。
Microsoft のドキュメント「GitHub Copilot エージェント モードを始めよう」などの説明を読むと、Ask Mode と Agent Mode は役割もできることも全く別物だそうで、概略以下の違いがあるようです。
-
Ask Mode: 一問一答の形式で質問に答えるシンプルなモード。安全で軽量
-
Agent Mode: プロンプトの目標に達するまで実行と調整の手順を続けるモード。強力だが影響範囲が大きい
バイブコーディングには、Google Cloud の記事「What is vibe coding?」によると、主に "Pure" vibe coding と Responsible AI-assisted development という 2 つの方法があるとのことです。Visual Studio 2026 + GitHub Copilot は Responsible AI-assisted development ですが、Agent Mode を利用すると、少し "Pure" vibe coding に近づくという感じがします。
具体的にどういうことができるのか、自分の手を動かして使ってみれば理解が深まると思って、自分の環境の Visual Studio 2026 v18.2.1 + GitHubCopilot Free で Agent Mode を使ってみました。その内容を以下に書きます。
Visual Studio のテンプレートを使って ASP.NET Core MVC アプリのプロジェクトを作成し、それに SQL Server の既存のデータベースのテーブルの CRUD を行うための Model、View、Controller を Agent Mode を使って追加してみます。
今回は LocalDB のデータベース TestDatabase に、下の画像の Movie テーブルを作って、それをベースに使うことにしました。

Visual Studio 2026 でスキャフォールディング機能を使って(GitHub Copilot を使わないで)行う場合は、(1) Package Manager Console を開いて Scaffold-DbContext コマンドを使ってコンテキストクラスとエンティティクラス (Model に該当) を作成し、(2) それらのクラスをベースにスキャフォールディング機能を使って Controller と View を生成します。その具体例は、先の記事「スキャフォールディング機能 (CORE)」を見てください。
上の (1), (2) に述べた方法でアプリを作成すると、実行結果は以下の画像のようになります。

GitHub Copilot の Agent Mode を使ってアプリを作成した場合はどのような結果になるか、上の (1), (2) に述べた方法で作成した場合とどのように異なるのかが興味のあるところです。
(1) プロジェクトの作成
Visual Stidio 2026 のテンプレートを使って .NET 10 の ASP.NET Core MVC のプロジェクトを新規作成します。設定は下の画像の通りです。

(2) プロンプト作成
あまり詳しく書かないで簡単な内容にしてみました。以下のプロンプトを作って、それをチャットウィンドウから GitHub Copilot に送信してみます:
SQL Server の既存の Movie テーブルの CRUD を行うための Model, View, Contoller を追加してください
Movie テーブルのスキーマ情報は絶対必要なのですが、試しに最初のプロンプトにはわざと含めずに GitHub Copilot に指示を出しました。(後述しますが、それが失敗だったようです)
(3) GitHub Copilot の回答
上のプロンプトでは Movie テーブルのスキーマ情報がないので、エンティティクラス (Model に該当) が作成できません。なので、まず、GitHub Copilot は作業を始める前にそれを聞いてくるかと思ったのですが、即 CRUD に必要なすべてのコードを作成してきました。
既存の Movie テーブルのスキーマと、GitHub Copilot が想像して作ったエンティティクラスが異なると、修正が多岐にわたって大変な手間になるので、GitHub Copilot は事前にスキーマを聞いてから作業を始めるべきだと思うのですが。生成 AI はプロンプトに質問を返すようなことはせず、とにかく回答を返すことを優先するということなのでしょうか?
上のプロンプトを受けて GitHub Copilot が行ったことまとめると、NuGet パッケージ Microsoft.EntityFrameworkCore.SqlServer の追加、コンテキストクラス、エンティティクラス、View、Controller のコードの作成、コンテキストクラスの DI 設定、_Layout.cshtml にナビゲーションリンクの追加です。
今回は偶然(?)既存の Movie テーブルのスキーマと GitHub Copilot が作ったエンティティクラスと整合していたので、そのまま Model として使えました。(Microsoft のチュートリアル「データ モデル クラスの追加」のコードが GitHub にあって、GitHub Copilot はそこから情報を取ってきたように思われます)
コードの生成・修正に加えて、下の画像のように GitHub Copilot が行なった追加・修正の説明、ビルド結果、次にユーザー側が行うことをチャットウィンドウに表示してくれます。

チャットウィンドウに "ソリューションはビルドに成功しました" とありましたので、GitHub Copilot の追加・修正をすべて受け入れてビルドしてみました。確かにビルドには成功します。
(4) ユーザーが行う作業
ユーザー側が行うこととしてチャットウィンドウに以下の 2 件が挙げられていました:
-
appsettings.json に接続文字列を追加
-
既存の SQL Server の Movie テーブルのスキーマが Movie.cs と整合することを確認(カラム名、型が合致するように必要なら Movie クラスを調整)
前者はその通り既存のデータベースへの接続文字列を設定しました。後者は偶然整合していたので調整不要でしたが、違っていたらどうするのでしょうか? 「必要なら Movie クラスを調整」とありますが、それだけではダメで、View と Controller のコードも変更する必要があります。ユーザーが Movie クラスを変更してから、GihHub Copilot に他のコードの修正を行うようプロンプトで指示するのだと思いますが。
(5) NuGet パッケージのアップデート
GitHub Copilot が追加した NuGet パッケージ Microsoft.EntityFrameworkCore.SqlServer のバージョンが 8.0 と古く、脆弱性があるとのことなので最新版 10.0.2 にアップデートしました。
(6) SqlException の解決
リビルドして実行してみると、MoviesController.cs の _context.Movies.ToListAsync() で SqlException: Invalid object name 'Movies' というエラーが出ます。チャットウィンドウで解決策を聞いてみました。

GitHub Copilot の回答は "SQL Server が指定されたデータベース内に Movies という名前のテーブルを見つけられないためです" が原因ということです。確かに既存のテーブルの名前は Movies ではなく Movie です。
Movie.cs の Movie クラスに属性 [Table("Movie")] を付与することで解決できるのですが、最初にスキーマ情報を与えていれば、GitHub Copilot がエンティティクラスを作成する際 [Table("Movie")] を付与するでしょうから、このようなトラブルは起こらなかったと思います。(ちなみに、Scaffold-DbContext コマンドを使ってエンティティクラス(Movie クラス)を作成した場合は、自動的に Movie クラスに属性 [Table("Movie")] が付与されます)
上記の修正後アプリを実行すると以下の画像のように、スキャフォールディング機能を使って Controller と View を生成した場合とほぼ同じ結果となります。CRUD 操作も問題なく可能でした。

(7) Movie クラスの調整
最初の回答に "必要なら、次の作業を行います(指示ください)⇒ Movie クラスを実際のテーブルスキーマに合わせて調整" とあったので、GitHub Copilot にプロンプトでスキーマ情報を渡して、それをやってもらいました。GitHub Copilot の修正提案は以下の通りです。

内容 OK なのでキープしました。やはり最初から Movie テーブルのスキーマという絶対必要な情報は渡しておくべきでした。
GitHub Coplit が生成した Create, Edit のビューに、クライアント側で入力バリデーションを行うためのコードが無かったのですが、最初に Movie テーブルのスキーマ情報を渡していれば、そこも面倒を見てくれたのではなかろうかと思います。(未確認・未検証です)
(8) Html ヘルパーを使わない理由
最後にもう一つ、スキャフォールディング機能を使って生成した View には Html ヘルパーが使われてますが、GitHub Coplit が作成した View には Html ヘルパーは使われてない理由を聞いてみました。回答は以下の通りです。
-
Visual Studio のスキャフォールディングはモデルのメタデータ([Display]、型、データ注釈など)や表示テンプレート/ローカライズを尊重するため、Html.DisplayNameFor / Html.DisplayFor や EditorFor / ValidationMessageFor といった HTML ヘルパー(およびタグヘルパー)を使って自動生成します。これにより列見出しや表示形式、カスタムテンプレート、クライアント検証との連携が自動で行われます。
-
私が作成した簡易コードでは、最小限の可読な表示を優先して直接プロパティを出力(例:@item.Title や @item.ReleaseDate.ToShortDateString())しました。これは動作が分かりやすく、依存するメタデータに依存しない一方で、スキャフォールディングが提供するメタデータ連携や自動フォーマット、ローカライズ、表示テンプレートの利点を利用していません。
これはちょっと問題かも。Movie クラスのプロパティに Display, Required, DisplayFormat 属性を追加して、それらが結果に反映されるよう GitHub Copilot に修正依頼を出せば面倒を見てくれるかもしれませんが (未検証・未確認)。
(9) 今回学んだこと
今回学んだことで一番重要なのは、生成 AI はプロンプトの情報が不備でも、とにかく回答を返すことを優先するようなので、Agent Mode でコードを生成させる場合は、必須情報は最初から与えておかないと、GitHub Copilot が勝手に想像して意図しない結果となる恐れがあるということだと思いました。
そのことを GitHub Copilot にチャットで質問してみました。下の画像がその時のプロンプトと回答です。その回答に書いてありますが "多くの生成系エージェントは「まず作業を進めて役に立つ出力を返す」ことを優先します。曖昧な点があっても、一般的な(最小限で動作する)仮定を置いてコードを生成することで、すぐに動かせる形を提供することが多いです"ということだそうです。

このあたりは使用する AI モデルによって異なるかもしれません。ちなみに、この記事で使った AI モデルは GitHub Copilot Free 版で現時点でデフォルトになっていた GTP-5 mini です。