皆さん、こんにちは!世界最高峰のDevOpsリードチーフエンジニアとして、皆さんの開発効率を文字通り「桁違い」に引き上げる知見を共有するため、今回も魂を込めて筆を取りました。
今日のテーマは、AIと共創する未来のエディタ「Cursor」です。中でも、AIを強力に使いこなす上で避けては通れない、そして多くの開発者が気づかないうちに多大なコストを払ってしまっている「トークン消費とパフォーマンスのバランス術」に焦点を当てます。
「Cursorって何だかすごそうだぞ?」と思いつつも、AIの魔法に魅せられつつ、裏側で何が起こっているのか、どうすればもっと賢く、もっと経済的に使えるのか、いまいちピンと来ていない方も多いのではないでしょうか。
心配はいりません。この記事を読み終える頃には、あなたはCursorのAI機能を意のままに操り、日々のコーディングが劇的に楽になるだけでなく、APIコストも最適化できる、真の「AI時代のエキスパート」へと変貌を遂げていることでしょう。さあ、始めましょう!
—
Cursorとは何か? AIと共創する開発体験の最前線
まず、Cursorとは何か、その本質からお話ししましょう。Cursorは単なる高機能なテキストエディタではありません。それは「AI開発のコパイロット」であり、あなたの思考を加速させ、コード生成、バグ修正、リファクタリング、さらには設計補助まで、開発プロセス全体をAIの力で劇的に支援するツールです。
既存のIDE(VS Codeなど)に慣れている方なら、その操作感は非常に似ていることに気づくでしょう。実際、CursorはVS Codeをフォークして開発されており、多くのVS Code拡張機能がそのまま利用可能です。しかし、決定的に異なるのは、その「AIネイティブ」な設計思想です。
- Code generation (コード生成): 自然言語で指示を出すだけで、複雑なコードスニペットや関数全体を生成します。
- Debugging & Refactoring (デバッグとリファクタリング): AIがコードの意図を理解し、バグの特定や改善提案、コード構造の最適化を支援します。
- Contextual awareness (コンテキスト認識): プロジェクト全体のファイル構造、過去のコード、関連ドキュメントをAIが深く理解し、より精度の高い提案を行います。
これらの機能は、まるであなたの隣に常に最高のペアプログラマーがいるかのような体験を提供します。しかし、この「魔法」には見えないコスト、すなわち「トークン消費」が伴うのです。
なぜ今、Cursorなのか?
現代の開発は、複雑化の一途を辿っています。マイクロサービス、クラウドネイティブ、AI/MLモデルの統合…。人間の脳が処理できる情報量には限界があります。Cursorは、この情報過多の時代において、あなたの認知負荷を軽減し、より本質的な問題解決に集中できるように設計されています。
特に、AIが生成するコードの品質と、それをプロジェクトの文脈にどれだけ適合させられるかが重要になります。Cursorは、そのために「プロジェクト全体をAIが理解する」というアプローチを徹底しています。
Cursorの導入と初期セットアップ:AIとのファーストコンタクト
まずは、Cursorをあなたの開発環境に迎え入れましょう。インストール自体は非常にシンプルなので、ここでは本質的な部分に絞って解説します。
1. インストール

2. アカウント連携とAIモデルの設定
Cursorを起動したら、サインインを促されます。Googleアカウントなどで連携しましょう。これにより、CursorのProプランの機能や、OpenAIなどのAPIキー連携がスムーズに行えるようになります。
最も重要な初期設定は、AIモデルの選択です。Cursorのステータスバー(通常は右下)に現在のAIモデルが表示されています。ここをクリックすると、利用可能なモデルのリストが表示されます。

(イメージ図: 実際にはGPT-4o, GPT-4, GPT-3.5 Turboなどの選択肢が表示されます)
初期段階では、GPT-4o または GPT-4 を選択しておくことをお勧めします。これらは最も強力なモデルであり、CursorのAI機能の真価を体験する上で最適です。ただし、ここが今日のテーマの核心に関わってきますが、これらのモデルは「トークン消費」が大きくなる傾向があります。
本質への導入:トークン消費という「見えないコスト」を理解する
さあ、いよいよ本題に入りましょう。AIエディタを使いこなす上で最も重要な概念の一つが「トークン」です。
トークンとは何か?
AIモデルは、私たちが普段使うような「単語」や「文字」の単位で情報を処理しているわけではありません。彼らは、テキストをより小さな意味の塊に分割します。これが「トークン」です。
例えば、
- “Hello, world!” は `Hello`, `,`, ` world`, `!` の4トークンになるかもしれません。
- プログラミング言語のコードも、変数名、キーワード、演算子などがそれぞれトークンとして扱われます。
AIモデルは、このトークンを単位として情報を入力し、出力を生成します。そして、入力トークンと出力トークンの総量が、AIのAPI利用料金や、CursorのProプランにおける利用制限の根幹となります。
なぜトークン消費が重要なのか?
1. API利用料金: OpenAIなどのモデルを使用する場合、入力と出力のトークン量に応じて料金が発生します。大規模なプロジェクトでAIを多用すると、この費用が無視できない額になる可能性があります。
2. 応答速度: モデルが処理しなければならないトークン量が増えれば増えるほど、応答に時間がかかります。開発体験が損なわれる原因となります。
3. モデルのコンテキストウィンドウ: 各AIモデルには「コンテキストウィンドウ」と呼ばれる、一度に処理できるトークンの上限が設定されています。この上限を超えると、AIは過去の情報を忘れてしまったり、エラーを返したりします。つまり、AIがプロジェクト全体を「理解」できなくなるのです。
4. Cursor Proプランのトークン上限: Cursor Proプランでは、AIモデルの利用に月ごとのトークン上限が設定されています。効率的に使わなければ、月の途中で上限に達し、追加料金を支払うか、AI機能が制限されることになります。
Cursorが裏側で何をしているのか?:RAGとIndexing、そしてContext Window
CursorのAIが「プロジェクト全体を理解している」というのは、魔法ではありません。そこには、以下の技術が働いています。
- Indexing (インデキシング): Cursorは、あなたが作業しているプロジェクトのファイルをスキャンし、その内容を事前に解析して内部的なデータベース(ベクトルストアなど)に保存します。これにより、どのファイルにどんなコードや情報が含まれているかをAIが高速に参照できるようになります。
- Retrieval Augmented Generation (RAG): あなたがAIに質問したり、コード生成を依頼したりすると、Cursorはこのインデックスを使って、現在のファイル内容だけでなく、プロジェクト内の関連性の高いコードスニペットやドキュメントを自動的に「検索」し、AIのプロンプトに含めます。これが「コンテキスト」です。
- Context Window (コンテキストウィンドウ): AIモデルが一度に処理できる情報の器です。RAGによって集められた関連情報、あなたのプロンプト、現在のコード、過去の会話履歴などが、このコンテキストウィンドウに詰め込まれてAIに送信されます。
問題は、このRAGが「賢すぎる」ことです。
関連性の高い情報を自動で拾ってくれるのは素晴らしいですが、もしプロジェクトに大量の不要なファイル(例: `node_modules`、ビルド成果物、テストデータ、ログファイル)が含まれていたらどうなるでしょう? AIはそれらを「関連情報」として誤って認識し、コンテキストウィンドウに詰め込もうとします。結果として、無駄なトークン消費、遅い応答、そして肝心な情報がコンテキストウィンドウから溢れてしまうという事態を招くのです。
これが、「トークン消費とパフォーマンスのバランス術」が必要とされる理由です。
—
核心:『トークン消費とパフォーマンスのバランス術』の具体的な実践
では、どうすればこのトークン消費を最適化し、CursorのAI機能を最大限に活用できるのでしょうか? 私はこれを3つの戦略として体系化しました。
戦略1: プロジェクトの「AIコンテキスト」を賢く定義する
最も強力かつ、多くの開発者が見過ごしがちなのが、プロジェクトのコンテキストを明示的にAIに指示する設定です。Cursorは、`.cursor` ディレクトリ内の `ai.json` ファイルを使って、AIが参照すべきファイルや振る舞いを細かく制御できます。
`.cursor/ai.json` の威力
このファイルは、AIがプロジェクトをどのように「解釈」すべきかを指示する設計図です。適切に設定することで、不要なファイルをコンテキストから除外し、本当に重要な情報にAIの注意を向けさせることができます。
プロジェクトのルートディレクトリに `.cursor/ai.json` というファイルを作成(または既存のものを編集)してください。
// .cursor/ai.json
{
// このプロジェクトのAIの振る舞いを定義します
“ai”: {
// AIがコードを生成・修正する際に守るべきグローバルな指示(カスタムインストラクション)
// プロジェクトのコーディング規約、アーキテクチャ方針、言語の慣習などを記述します。
“customInstructions”: [
“全てのコードはTypeScriptで記述し、ESLintとPrettierの規約に従うこと。”,
“関数やクラスにはJSDoc形式のコメントを必ず追加すること。”,
“フロントエンドはReact、バックエンドはNode.js (Express) を使用すること。”,
“新しいAPIエンドポイントを追加する際は、必ずユニットテストも記述すること。”,
“セキュリティを最優先し、入力値の検証を徹底すること。”
],
// AIが参照すべきでないファイルやディレクトリのパターンを定義します。
// これにより、不要なファイルがコンテキストウィンドウを占有するのを防ぎ、トークン消費を削減します。
“exclude”: [
// ビルド成果物や生成ファイル
“dist/”, // TypeScriptのコンパイル結果やバンドルファイル
“build/”, // ReactやVueなどのビルドディレクトリ
“out/”, // その他の出力ディレクトリ
“.min.js”, // 圧縮されたJavaScriptファイル
// 依存関係のインストールディレクトリ
“node_modules/”, // JavaScript/TypeScriptプロジェクトの依存関係
“vendor/”, // Composer (PHP) やBundler (Ruby) などの依存関係
“venv/”, // Pythonの仮想環境
// ログファイル
“.log”, // アプリケーションやサーバーのログ
“logs/”, // ログを格納するディレクトリ
// テスト関連ファイル(テストの意図を理解させる必要がない場合)
“test/”, // テストコード全般
“tests/”, // テストコード全般
“__tests__/”, // Jestなどのテストディレクトリ
“.test.ts”, // TypeScriptテストファイル
“.spec.ts”, // TypeScriptスペックファイル
// 設定ファイルや一時ファイル(AIが参照する必要がない場合)
“.env”, // 環境変数ファイル (機密情報を含む可能性もあるため除外)
“.env.”, // 環境変数ファイル
“.vscode/”, // VS Codeの設定 (Cursorも同様に参照しない)
“.git/”, // Gitの履歴 (AIがバージョン管理の詳細を理解する必要はない)
“.DS_Store”, // macOSのメタデータファイル
“tmp/”, // 一時ファイルディレクトリ
// ドキュメントやアセット(特定の状況下でAIが参照する必要がない場合)
“docs/”, // ユーザー向けドキュメントなど (AIにコード生成させる際に不要な場合)
“assets/”, // 画像やフォントなどのアセット
“public/”, // 静的ファイルなど
// その他、AIに読み込ませることでノイズになる可能性のあるファイル
“package-lock.json”, // ロックファイル (package.jsonがあれば十分な場合が多い)
“yarn.lock”, // 同上
“pnpm-lock.yaml” // 同上
],
// AIが特に参照すべきファイルやディレクトリを明示的に定義します。
// excludeで除外されたものでも、ここに含めるとAIのコンテキストになります。
// プロジェクトの設計書、API仕様書、重要なスキーマ定義などを含めることを推奨します。
“include”: [
“README.md”, // プロジェクトの概要をAIに理解させるため
“src/config/”, // 重要な設定ファイル群
“src/types/”, // TypeScriptの型定義ファイル群
“src/models/”, // データベースモデルやデータ構造の定義
“docs/architecture.md”,// プロジェクトのアーキテクチャ設計書
“api/swagger.yaml” // APIのOpenAPI/Swagger定義ファイル
]
}
}
解説:
- `customInstructions`: ここはAIの「人格」を定義する場所です。プロジェクト固有のコーディング規約、アーキテクチャパターン、使用しているフレームワークの慣習などを記述することで、AIはよりプロジェクトに即した、高品質なコードを生成できるようになります。これはトークン消費そのものには直接影響しませんが、AIの出力品質を劇的に向上させ、結果的に手修正の時間を減らし、全体的な効率を高めます。
- `exclude`: 最も重要な設定の一つです。 ここに指定したファイルやディレクトリは、CursorのAIインデクシングとRAGの対象外となります。これにより、AIは`node_modules`のような巨大で冗長なディレクトリや、ビルド成果物、テストコード、ログファイルなどをコンテキストに含めなくなり、トークン消費を劇的に削減できます。
- 内部挙動: Cursorは、プロジェクト内のファイルを解析し、埋め込みベクトル(Embeddings)を作成して検索可能なインデックスを構築します。`exclude`に指定されたパスは、このインデキシングのプロセスから除外されます。結果として、AIがRAGで関連情報を取得しようとした際に、これらのファイルは候補から外れるため、コンテキストウィンドウに不要な情報が詰め込まれるのを防ぎ、API呼び出し時のトークン数を削減し、応答速度を向上させます。
- `include`: `exclude`で除外されがちなファイルでも、AIに参照させたい特定の重要なドキュメントやコードがある場合に指定します。例えば、`docs/architecture.md`のような設計書は、AIがプロジェクトの全体像を理解するために非常に役立ちます。
この `ai.json` ファイルをプロジェクトのルートに配置するだけで、CursorのAIはあなたのプロジェクトをより賢く、より効率的に扱えるようになります。まるで、AIに「これは見ていいけど、あれは気にしないでね」と教えているようなものです。
`.gitignore` との連携
多くの場合、`.gitignore`に指定されているファイルは、`ai.json`の`exclude`にも含めるべきです。`.gitignore`はバージョン管理システム(Git)が追跡しないファイルを指定しますが、`ai.json`はAIが参照しないファイルを指定します。両者は目的が異なりますが、`node_modules`やビルド成果物など、多くの不要なファイルで共通するはずです。
戦略2: タスクに応じて最適なAIモデルを使い分ける
Cursorでは、複数のAIモデルを簡単に切り替えることができます。タスクの複雑度や重要度、そしてコストに応じて、最適なモデルを選択することが「バランス術」の肝です。
モデル選択の思想
- GPT-4o / GPT-4:
- 特徴: 最新で最も高性能なモデル。複雑な推論、大規模なリファクタリング、アーキテクチャ設計の相談、新規機能の骨格作成など、高度な知見や創造性が求められるタスクに最適です。多言語対応も強力。
- デメリット: 最もトークン消費が多く、API料金も高価です。応答速度も他のモデルに比べて遅い傾向があります。
- 使い所: プロジェクトの初期設計、複雑なアルゴリズムの実装、パフォーマンスボトルネックの分析、セキュリティレビューなど、高い品質と深い理解が不可欠な場面。
- GPT-3.5 Turbo:
- 特徴: GPT-4系に比べて高速かつ低コスト。日常的なコーディング補助、簡単なバグ修正、JSDocコメントの生成、定型的なコードの生成、既存コードの軽微な修正などに十分な性能を発揮します。
- デメリット: 複雑な推論や大規模なコンテキストの理解はGPT-4系に劣ります。
- 使い所: 日々のルーチンワーク、単一ファイルのコード補完、ユニットテストのスタブ生成、ドキュメントのドラフト作成など、速度とコスト効率が優先される場面。
- Local Models (ローカルモデル: Code Llamaなど):
- 特徴: 自分のPC上で動作するため、API料金は発生しません。インターネット接続不要。企業のセキュリティポリシーで外部API利用が制限されている場合などに有効です。
- デメリット: 性能はクラウドベースのモデルに劣ることが多く、特に複雑なタスクでは期待通りの結果が得られないことがあります。PCのスペックに依存します。
- 使い所: 機密性の高いコードの作業、オフライン環境での開発、非常にシンプルなコード補完や生成など、セキュリティやコストゼロが絶対条件の場面。
Cursorでのモデル設定方法
1. ステータスバーからの切り替え: 最も手軽な方法です。Cursorウィンドウの右下にあるモデル名をクリックするだけで、利用可能なモデルを選択できます。
2. `settings.json` でのデフォルト設定: 特定のプロジェクトやワークスペースで常に特定のモデルを使いたい場合は、`settings.json`でデフォルトを設定できます。
- `Cmd/Ctrl + Shift + P` でコマンドパレットを開き、「Preferences: Open Workspace Settings (JSON)」または「Preferences: Open User Settings (JSON)」を選択します。
// .vscode/settings.json (ワークスペース設定) または User Settings
{
“cursor.ai.defaultModel”: “gpt-4o”, // デフォルトで使用するAIモデル
// 他の設定…
}
- `cursor.ai.defaultModel` の値は、`gpt-4o`, `gpt-4`, `gpt-3.5-turbo` など、Cursorがサポートしているモデル名に置き換えてください。
使い分けの具体例
- 「新しい認証モジュールを設計してほしい」
- → GPT-4o を選択。プロジェクトの既存の認証フロー、セキュリティ要件、使用技術スタックなどを踏まえて、堅牢で拡張性の高い設計案を生成させます。高度な推論と全体像の理解が不可欠だからです。
- 「このTypeScript関数の型定義とJSDocコメントを生成してほしい」
- → GPT-3.5 Turbo を選択。コードの意図を理解し、定型的なコメントや型定義を生成する程度であれば、高速かつ安価なこのモデルで十分です。
- 「会社の機密情報を含むレガシーコードの、特定の関数の引数チェックをリファクタリングしたい」
- → Local Model (もし適切なものが利用可能なら) を選択。外部への情報漏洩リスクをゼロにするため、ローカルで処理できるモデルを選びます。品質が少し劣っても、手作業で補完できる範囲であれば許容します。
このように、タスクに応じてモデルを賢く使い分けることで、コストを抑えつつ、AIの恩恵を最大限に享受できます。
戦略3: 無駄なコンテキストを常にクリーンに保つ
AIの性能は、与えられたコンテキストの「質」に大きく左右されます。不要な情報が混じっていると、AIは重要な情報を見落としたり、誤った推論をしてしまったりします。
Chat History の管理
CursorのAIチャットパネルは、過去の会話履歴をAIのコンテキストに含めます。これは、会話の連続性を保つ上で非常に便利ですが、長くなりすぎるとトークン消費が増大し、AIが過去の無関係な話題に引きずられてしまう原因にもなります。
- 不要な会話はリセット: 新しいタスクに取り掛かる際は、チャットパネル上部の「Reset Chat」ボタン(通常はゴミ箱アイコン)をクリックして、会話履歴をクリアしましょう。これにより、AIは新しい、クリーンなコンテキストで思考を始められます。
- 内部挙動: チャット履歴は、あなたが新しいプロンプトを送信するたびに、AIのコンテキストウィンドウの先頭に追加されます。履歴が長ければ長いほど、AIが現在のタスクに利用できるトークンスペースが減り、重要な情報がコンテキストウィンドウから押し出される可能性が高まります。
選択範囲の明確化
`Cmd/Ctrl + K` でコード生成や修正を行う際、Cursorはあなたが選択しているコードブロックを最優先でAIのコンテキストに含めます。
- 関連コードのみを選択: 意図的に、AIに焦点を当ててほしいコードブロックや、その周辺の関連性の高いコードのみを選択しましょう。無関係なコードまで含めてしまうと、余計なトークンを消費し、AIの認識をぼやけさせてしまいます。
- ファイル全体ではなく、必要な部分だけ: 例えば、関数の修正を依頼する際に、ファイル全体を選択するのではなく、その関数定義と、その関数が利用する型定義など、直接関連する部分だけを選択します。
プロンプトの洗練
AIへの指示(プロンプト)は、短く、具体的で、曖昧な表現を避けることが重要です。
- 明確な指示: 「この関数のバグを修正して」ではなく、「この `fetchUserData` 関数が、ユーザーが存在しない場合に `null` を返すのではなく、空の配列を返すように修正してください。また、エラーハンドリングも追加し、ネットワークエラー発生時はコンソールにログを出力してください。」のように、具体的な期待動作を記述します。
- 不要な情報の排除: プロンプトに、AIがタスクを解決するために不要な情報を混ぜないようにしましょう。
これらの「クリーンナップ」は、AIがより少ないトークンで、より高品質なアウトプットを生成するための鍵となります。
—
実践的なHelloWorld: トークン消費最適化を体感する
さあ、ここまで学んだことを実際に体験してみましょう。簡単なプロジェクトを用意し、CursorのAIがどのようにコンテキストを認識し、トークン消費がどう変化するかを目の当たりにします。
プロジェクトの準備
まず、簡単なNode.js(またはPython, Rubyなど、お好きな言語で構いません)プロジェクトを作成します。
適当なディレクトリを作成し、移動
mkdir cursor-ai-demo && cd cursor-ai-demo
Node.jsプロジェクトの初期化
npm init -y
サンプルファイルを作成
mkdir src
touch src/app.ts
touch src/utils.ts
touch src/types.ts
mkdir dist # ビルド成果物用
mkdir node_modules # npm installで作成される
mkdir logs # ログファイル用
touch logs/access.log
touch README.md
`src/app.ts` の内容:
// src/app.ts
import { capitalize } from ‘./utils’;
import { User } from ‘./types’;
function greetUser(user: User): string {
if (!user.name) {
return ‘Hello, Guest!’;
}
return `Hello, ${capitalize(user.name)}!`;
}
// ユーザーデータを取得するダミー関数 (AIに修正させる対象)
async function fetchUserData(userId: string): Promise
// 本来はDBやAPIから取得
if (userId === ‘1’) {
return { id: ‘1’, name: ‘Alice’ };
} else if (userId === ‘2’) {
return { id: ‘2’, name: ‘Bob’, email: ‘bob@example.com’ };
}
return null; // ユーザーが見つからない場合はnullを返す
}
// メイン処理
async function main() {
const user1 = await fetchUserData(‘1’);
if (user1) {
console.log(greetUser(user1));
}
const user3 = await fetchUserData(‘3’);
if (user3) {
console.log(greetUser(user3));
} else {
console.log(‘User 3 not found.’);
}
}
main();
`src/utils.ts` の内容:
// src/utils.ts
export function capitalize(str: string): string {
if (!str) return ”;
return str.charAt(0).toUpperCase() + str.slice(1);
}
// 後でAIに生成させるダミー関数
export function sum(a: number, b: number): number {
return a + b;
}
`src/types.ts` の内容:
// src/types.ts
export interface User {
id: string;
name?: string;
email?: string;
}
`README.md` の内容:
Cursor AI Demo Project
This is a simple Node.js (TypeScript) project to demonstrate Cursor’s AI capabilities and token optimization.
Features
- User greeting function
- Dummy user data fetching
`ai.json` を設定する前のAIの挙動
Cursorでこのプロジェクトを開き、`src/app.ts` をアクティブなタブにした状態で、AIチャットパネルで次のように尋ねてみてください。
このプロジェクトの構造と主要な機能を説明してください。
AIは、`node_modules` や `dist` ディレクトリの内容も含めて、プロジェクト全体をスキャンしようとします。もしプロジェクトが大きければ、この段階で既に大量のトークンを消費する可能性があります。
`ai.json` でコンテキストを最適化する
次に、プロジェクトのルートに `.cursor/ai.json` ファイルを作成し、先ほどの例を参考に設定します。
// .cursor/ai.json
{
“ai”: {
“customInstructions”: [
“全てのコードはTypeScriptで記述し、ESLintとPrettierの規約に従うこと。”,
“フロントエンドはReact、バックエンドはNode.js (Express) を使用すること。”,
“ユーザー関連の機能は、必ずsrc/app.tsとsrc/types.ts、src/utils.tsを参照すること。”
],
“exclude”: [
“dist/”,
“node_modules/”,
“logs/”,
“.log”,
“tmp/”,
“.vscode/”,
“.git/”
],
“include”: [
“README.md”,
“src/types/”,
“src/config/” // 存在しないが、将来の拡張を想定
]
}
}
この設定を保存したら、Cursorを再起動するか、プロジェクトを再読み込みしてください。
再度、AIチャットパネルで同じ質問を投げかけます。
このプロジェクトの構造と主要な機能を説明してください。
観察ポイント:
AIの応答は、以前よりも簡潔になり、`node_modules` や `dist` といった開発中に生成されるがAIには不要な情報に言及しなくなるはずです。代わりに、`src` ディレクトリの内容や `README.md` に記載された主要機能に焦点を当てた説明になるでしょう。これは、`exclude` 設定が正しく機能し、AIのコンテキストが「クリーン」になった証拠です。
モデルの使い分けを体感する
`src/app.ts` の `fetchUserData` 関数には、ユーザーが見つからない場合に `null` を返すロジックがあります。これを「空の配列を返すように修正し、ネットワークエラーも考慮したエラーハンドリングを追加してほしい」とAIに依頼してみましょう。
1. GPT-3.5 Turbo で試す
ステータスバーからAIモデルを「GPT-3.5 Turbo」に切り替えます。
`fetchUserData` 関数全体を選択し、`Cmd/Ctrl + K` を押して次のように指示します。
この `fetchUserData` 関数を修正してください。
- ユーザーが見つからない場合は `null` ではなく、空の配列 `[]` を返すように変更してください。
- ネットワークエラーを模擬するため、ランダムにエラーを発生させるロジックを追加し、その際はコンソールにエラーをログ出力し、空の配列を返してください。
- 戻り値の型定義も修正してください。
実行ログ例:
// Cursor AIの応答(GPT-3.5 Turbo)
async function fetchUserData(userId: string): Promise
try {
// ネットワークエラーを模擬
if (Math.random() < 0.2) { // 20%の確率でエラー
throw new Error('Network error simulated.');
}
if (userId === '1') {
return [{ id: '1', name: 'Alice' }]; // 配列で返す
} else if (userId === '2') {
return [{ id: '2', name: 'Bob', email: 'bob@example.com' }]; // 配列で返す
}
return []; // ユーザーが見つからない場合は空の配列を返す
} catch (error) {
console.error('Error fetching user data:', error instanceof Error ? error.message : error);
return []; // エラー発生時も空の配列を返す
}
}
観察ポイント:
GPT-3.5 Turboは、指示通りに迅速にコードを生成しました。シンプルなロジック変更やエラーハンドリングであれば、十分な品質を提供してくれます。応答速度も速かったはずです。
2. GPT-4o で試す
チャット履歴をリセットし、ステータスバーからAIモデルを「GPT-4o」に切り替えます。
再度 `fetchUserData` 関数全体を選択し、同じ指示を与えます。
この `fetchUserData` 関数を修正してください。
- ユーザーが見つからない場合は `null` ではなく、空の配列 `[]` を返すように変更してください。
- ネットワークエラーを模擬するため、ランダムにエラーを発生させるロジックを追加し、その際はコンソールにエラーをログ出力し、空の配列を返してください。
- 戻り値の型定義も修正してください。
- さらに、この関数にJSDocコメントを追加し、どのように動作するか、どのような値を返すかを明確に記述してください。
- `main` 関数内の呼び出し箇所も、新しい戻り値の型に合わせて修正してください。
実行ログ例:
// Cursor AIの応答(GPT-4o)
import { capitalize } from ‘./utils’;
import { User } from ‘./types’;
/
- 指定されたユーザーIDに基づいてユーザーデータを非同期で取得します。
- ネットワークエラーを模擬し、ユーザーが見つからない場合やエラー発生時には空の配列を返します。
- @param userId 取得するユーザーのID。
- @returns ユーザーの配列。ユーザーが見つからない場合やエラー発生時は空の配列。
/
async function fetchUserData(userId: string): Promise
try {
// ネットワークエラーを20%の確率で模擬
if (Math.random() < 0.2) {
throw new Error('Simulated network error during user data fetch.');
}
// ダミーデータによるユーザー検索
if (userId === '1') {
return [{ id: '1', name: 'Alice' }];
} else if (userId === '2') {
return [{ id: '2', name: 'Bob', email: 'bob@example.com' }];
} else {
// ユーザーが見つからない場合は空の配列を返す
return [];
}
} catch (error) {
// エラー発生時のログ出力
console.error(`[fetchUserData] Error for userId ${userId}:`, error instanceof Error ? error.message : error);
// エラー時も空の配列を返すことで、呼び出し元での型安全性を保つ
return [];
}
}
// メイン処理
async function main() {
const users1 = await fetchUserData('1'); // 戻り値が配列になるため変数名を変更
if (users1.length > 0) { // 配列の長さをチェック
console.log(greetUser(users1[0])); // 最初のユーザーをgreetUserに渡す
}
const users3 = await fetchUserData(‘3’);
if (users3.length > 0) { // 配列の長さをチェック
console.log(greetUser(users3[0]));
} else {
console.log(‘User 3 not found or an error occurred.’); // メッセージもより汎用的に
}
}
main();
観察ポイント:
GPT-4oは、指示通りにコードを修正しただけでなく、JSDocコメントの追加や、`main` 関数内の呼び出し箇所の修正(`users1.length > 0` のチェックなど)、さらにはエラーメッセージの改善まで行いました。これは、より複雑な指示や、プロジェクト全体の整合性を考慮した変更にGPT-4oが優れていることを示しています。当然ながら、応答にはGPT-3.5 Turboより時間がかかったはずです。
このように、タスクに応じてモデルを切り替えることで、コストとパフォーマンスの最適なバランスを見つけることができます。
—
まとめと未来:AIと共創する開発の極意
皆さん、どうでしたか? CursorのAI機能がもたらす開発効率の向上は疑いようがありません。しかし、その裏側で動く「トークン」という見えないコストを意識し、それを最適化するための具体的な戦略を知ることで、あなたは単なるAIユーザーではなく、AIを戦略的に活用する「アーキテクト」へとレベルアップしたはずです。
- `ai.json` でAIの「目」を賢く制御する。
- タスクの難易度やコストに応じてAIモデルを使い分ける。
- 常にクリーンなコンテキストをAIに提供する。
これらをマスターすれば、CursorのAIはあなたの最も強力な相棒となり、毎日のコーディングが劇的に楽になるだけでなく、より複雑で創造的な課題にあなたの時間を集中させることができるようになります。
AIアシスト開発はまだ始まったばかりです。Cursorのようなツールは日々進化を遂げ、私たちの開発体験を根本から変え続けています。この波に乗り遅れることなく、常に最高の効率と品質を追求していきましょう。
これからも皆さんの開発効率を極限まで引き上げる知見を共有していきますので、どうぞご期待ください!
—