technology-selection について
technology-selectionは、タスクに応じたAI・機械学習技術の選定と、コード実装時の指針を示す.NET向けスキルです。表形式ML、LLM、エージェント、RAG、モデル推論などを区別し、計画のみの依頼ではコードを作成しません。
主な機能
- 01タスク別の技術選定ツリー
- 02.NET AIライブラリ層の案内
- 03方式ごとの実装ガードレール
- 04安全な設定と依存性注入の指針
- 05計画と実装の作業分け
活用シーン
- 01機械学習タスク向け.NET方式の選定
- 02LLM、エージェント、RAG構成の計画
- 03分野別の要件に沿ったAI機能の実装
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ dotnet/ skills --skill technology-selectionインストール後、Claude Code で/technology-selectionを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/agentic.mdclassic-ml.mdcopilot.mdllm.mdollama.mdonnx.mdrag.md詳細
.NET の AI と機械学習
まず適切なテクノロジーを選び、タスクで求められたことだけを実行してください。タスクで計画、比較、アーキテクチャが求められている場合(または「コードを書かないで」と指定されている場合)は、それだけを提示してください。指示されていないのに、スキャフォールディング、ビルド、コードの実行を行わないでください。
Step 1: タスクを分類する(判断ツリー)
該当する分岐とその理由を示し、対応するテクノロジーを選んでください。
| タスクの種類 | テクノロジー | 理由 |
|---|---|---|
| 構造化データ/表形式データ:分類、回帰、クラスタリング、異常検知、レコメンデーション | ML.NET (Microsoft.ML) | 決定論的(固定シード)、クラウドへの依存なし、専用に設計されている |
| 自然言語の理解、生成、要約、推論(単一のプロンプト → 応答、ツールなし) | Microsoft.Extensions.AI 経由の LLM (IChatClient) | 言語処理能力があり、オーケストレーションが不要 |
| エージェント型:複数ステップのツール/関数呼び出し、エージェントループ、マルチエージェント | Microsoft.Extensions.AI 上の Microsoft Agent Framework (Microsoft.Agents.AI) | オーケストレーション、ツールのディスパッチ、反復制御が必要で、IChatClient には備わっていない |
| GitHub Copilot の拡張機能/カスタムの開発ワークフローエージェント | GitHub Copilot SDK (GitHub.Copilot.SDK) | Copilot エージェントランタイムと統合される |
| 本番環境で事前学習済み/カスタムモデルを実行する | ONNX Runtime (Microsoft.ML.OnnxRuntime) | ハードウェアアクセラレーションに対応し、形式に依存しない推論 |
| ローカル/オフラインでの LLM 推論 | OllamaSharp (Ollama のモデル) | プライバシーの保護、ネットワークから隔離された環境、コストの制約に対応 |
| セマンティック検索、RAG、埋め込みの保存 | Microsoft.Extensions.VectorData.Abstractions(MEVD)+ プロバイダー(Azure AI Search、Milvus、MongoDB、pgvector、Pinecone、Qdrant、Redis、SQL) | プロバイダーに依存しないベクトル検索 |
| ドキュメントを取り込み、分割し、ベクトルストアに読み込む | Microsoft.Extensions.AI.DataIngestion(プレビュー)+ MEVD | 解析、分割、埋め込み、アップサートを実行 |
| 構造化データの予測と自然言語の推論の両方 | ハイブリッド:ML.NET によるスコアリング + LLM 推論レイヤー | ML.NET は再現性があり、LLM は説明を追加できる |
重要なルール: ML.NET が適切に処理できるタスク(表形式データの分類、回帰、クラスタリング)に LLM を使わないでください。これらのタスクでは、LLM はより遅く、コストが高く、非決定的です。
Step 1b: ライブラリのレイヤーを選ぶ
| レイヤー | ライブラリ | 使用する場面 |
|---|---|---|
| 抽象化 | Microsoft.Extensions.AI(MEAI) | 常に基盤として使用します。プロンプトと応答、および単純で範囲が限定された関数呼び出しには、IChatClient を直接使用します。 |
| プロバイダー SDK | Azure.AI.OpenAI / OpenAI / Azure.AI.Inference / OllamaSharp | AddChatClient を介して MEAI の背後で動作する具体的なプロバイダーです。 |
| オーケストレーション | Microsoft.Agents.AI(プレリリース) | 複数ステップのツール使用、永続化可能なエージェントループ、マルチエージェントのワークフローに使用します。 |
| Copilot | GitHub.Copilot.SDK | Copilot プラットフォームの拡張機能を構築する場合にのみ使用します。 |
ルール:まず MEAI を使い、AddChatClient を介してプロバイダーをその背後に配置してください(ビジネスロジックからプロバイダーを直接呼び出さないでください)。複数ステップまたは永続化可能なエージェントのワークフローには、エージェントループを自作するのではなく Microsoft.Agents.AI を使ってください。同じワークフローで、生の HttpClient による OpenAI 呼び出しと MEAI を混在させないでください。Accord.NET(アーカイブ済み)は使用しないでください。新しいプロジェクトでは、既存の Semantic Kernel の機能や投資が必須要件でない限り、MEAI と Agent Framework を優先してください。AI/ML サービスは DI を介して登録し、シークレットは user-secrets/環境変数/Key Vault から読み込んでください。キーをハードコードしないでください。
ステップ 2:選択した分岐の必須事項を押さえ、次に深さを決めます
プランでも実装でも、すべての回答で選択した分岐のガードレールに対応する必要があります。
- ML.NET —
new MLContext(seed: …)を使用します(再現可能性)。TrainTestSplitを使用し、ホールドアウトセットで評価します。実際の指標(MicroAccuracy/MacroAccuracy/LogLoss、AUC/F1、または RMSE/R²)を報告します。PredictionEnginePool<TIn,TOut>を使って提供します(PredictionEngineのシングルトンは決して使用しません)。 - LLM(MEAI) —
AddChatClient経由で登録したIChatClientに依存します(その背後にプロバイダーを配置します)。ChatOptionsでTemperatureとMaxOutputTokensを設定します。リトライ/タイムアウト(RetryingChatClient/Polly)を追加します。日付付きモデルを固定します。キーは user-secrets/env/Key Vault から読み込みます。sk-…キーをハードコードしてはいけません。非決定的な出力はスキーマに照らして検証し、フォールバックを用意します。 - エージェント型(Agent Framework) —
IChatClient上でMicrosoft.Agents.AIを使ってオーケストレーションします(独自実装のループは使いません)。MaximumIterationsとトークン/コストの上限を設定します。各ツールには明確なスキーマを定義します(AIFunctionFactory.Create)。各ステップをログに記録します(機密情報を含む生のコンテンツは記録しません)。 - RAG/埋め込み — セマンティックチャンク分割を行います(固定サイズではありません)。
IEmbeddingGeneratorを使用し、埋め込みをキャッシュします(クエリごとに再埋め込みしません)。Microsoft.Extensions.VectorData.Abstractions(MEVD)とユーザーが指定したプロバイダー(例:pgvector)を使って保存/クエリします。類似度の最小スコアでフィルタリングします。各回答のソース帰属情報を保持します。ユーザーが指定した UI/ストレージを尊重し、実在する NuGet パッケージのみを使用します。
次に、深さを決めます。
- プラン/比較/アーキテクチャのみ(または「コードを書かないでください」)の場合:上記の必須事項を使い、このファイルだけを参照して回答します。リファレンスを開かないでください。ここに記載された分岐の必須事項だけで、選定やプランの作成には十分です。RAG のプランでは、チャット、取り込み/チャンク分割、埋め込み、ベクトルストレージ、ソース帰属情報、および指定された UI/ストレージを扱います。
- 実装コードを作成する場合:パッケージと実装ガイダンスについて、該当するリファレンスを読みます(選択した分岐のみを読みます。Hybrid の場合は Classic ML.NET と LLM の両方を読みます)。
- Classic ML.NET →
references/classic-ml.md - LLM 統合(MEAI)→
references/llm.md - エージェント型(Agent Framework)→
references/agentic.md - RAG/埋め込み/取り込み →
references/rag.md - GitHub Copilot 拡張機能 →
references/copilot.md - ONNX Runtime 推論 →
references/onnx.md - Ollama を使ったローカル/オフライン LLM →
references/ollama.md
- Classic ML.NET →
検証
- 選定が判断ツリーに従っている — ML.NET で対応できるタスクに LLM を使っていない
- 要求された内容のみを作成している(プランのみの依頼にはコードではなくプランを提示する)
- AI/ML サービスは DI 経由で登録し、設定には
IOptions<T>を使い、キーは安全なソースから取得している - 分岐のガードレール(ステップ 2 の必須事項と、実装時はリファレンスの内容)を満たしている
- 実装後、ビルドし、既存のテストを実行する
拒否すべきアンチパターン
| アンチパターン | 代替案 |
|---|---|
| 表形式データの分類に LLM を使う | ML.NET を使います。高速で、低コストかつ決定論的です |
| 再試行やタイムアウトなしで LLM を呼び出す | RetryingChatClient または Polly の再試行を追加します |
コミット済みの appsettings.json に API キーを記載する | user-secrets / env / Key Vault |
| Accord.NET を使う、または要件がないのに Semantic Kernel をデフォルトで選ぶ | ML.NET。新規開発では MEAI + Microsoft.Agents.AI を優先します |
IChatClient を使った手書きの複数ステップのツールループ | Microsoft.Agents.AI(MaximumIterations、ツールのディスパッチ) |
| 単一のプロンプト→応答に Agent Framework を使う | IChatClient を直接使います |
MEAI と併用して、ビジネスロジックで生の HttpClient / OpenAI SDK を使う | 抽象化レイヤーは1つにします。IChatClient に依存します |
ASP.NET Core で PredictionEngine をシングルトンにする | PredictionEnginePool<TIn,TOut>(スレッドセーフではありません) |
| チャンク分割や関連性フィルタリングなしで RAG を使う | セマンティックチャンク分割 + 類似度の最低スコア |
| .NET でニューラルネットワークをゼロから自作する | ONNX Runtime または LLM API を介して事前学習済みモデルを使います |