.NETにおけるAI機能の構築は、これまでモデル、ベクトルデータベース、データ取り込みパイプライン、そしてエージェントフレームワークといった、互いに異なるエコシステムのコンポーネントを繋ぎ合わせる複雑な作業を伴っていました。
それぞれのライブラリには独自のパターンがあり、バージョンアップのたびに破壊的変更に悩まされることも珍しくありませんでした。
しかし、2026年4月、Microsoftはこれらの課題を解決する「構成可能(Composable)なAIビルディングブロック」という新しい開発アプローチを提示しました。
本記事では、この最新のAIスタックを活用して構築された対話型カンファレンスアプリConferencePulseの事例を基に、.NETにおける次世代のAIアプリケーション開発手法を詳しく解説します。
開発の背景:分散したコンポーネントから安定した抽象化へ
AI開発において最も困難なのは、急速に進化するテクノロジー間の「安定したインターフェース」を維持することです。
Microsoftが提供を開始した一連のビルディングブロックは、特定のプロバイダーに依存しない抽象化レイヤーを提供します。
これにより、開発者は基盤となるモデルやデータベースが変更されても、アプリケーションのコアロジックを書き直す必要がなくなりました。
今回紹介するConferencePulseは、.NET 10、Blazor Server、および .NET Aspire をベースとした高度なデモアプリケーションです。
このアプリでは、セッション内容に基づいたリアルタイムの投票生成、RAG(検索拡張生成)を用いたQ&A、複数のエージェントによるセッション要約などが実装されています。
Microsoft.Extensions.AI:統一されたチャットインターフェース
Microsoft.Extensions.AIは、Azure OpenAI、OpenAI、Ollamaといった多様なAIプロバイダーを、共通のIChatClientインターフェースで操作可能にします。
これにより、ミドルウェアパイプラインのような感覚でAI機能を構築できます。
ミドルウェアパターンの適用
ASP.NET Coreの開発者にとって馴染み深い「ミドルウェア」のパターンをAI呼び出しに適用できるのが、このライブラリの大きな特徴です。
以下のコードは、クライアントにロギング、テレメトリ、関数呼び出しの機能を統合する例です。
// AIクライアントの構築とミドルウェアの登録
var openaiBuilder = builder.AddAzureOpenAIClient("openai");
openaiBuilder.AddChatClient("chat")
.UseFunctionInvocation() // ツール呼び出しループの自動ハンドリング
.UseOpenTelemetry() // 実行状況のトレース
.UseLogging(); // リクエスト/レスポンスのペアを記録
openaiBuilder.AddEmbeddingGenerator("embedding");
このように、わずか数行のコードでプロバイダーに依存しない柔軟なパイプラインが完成します。
将来的にAzure OpenAIからローカルのOllamaへ切り替える際も、内部のクライアント定義を変更するだけで、後続の処理には一切影響を与えません。
データ取り込みとベクトルデータの抽象化
AIモデルが正確な回答を生成するためには、適切なコンテキスト(文脈)の提供が不可欠です。
これまでは、ドキュメントの分割やベクトル化のプロセスが製品ごとに異なっていましたが、Microsoft.Extensions.DataIngestionとMicrosoft.Extensions.VectorDataによって、これが標準化されました。
インジェクションパイプラインの構築
ConferencePulseでは、GitHubのリポジトリからドキュメントを読み込み、検索可能なナレッジベースを構築するために、以下のパイプラインを使用しています。
// Markdownファイルの読み込み
IngestionDocumentReader reader = new MarkdownReader();
// トークナイザーの設定
var tokenizer = TiktokenTokenizer.CreateForModel("gpt-4o");
var chunkerOptions = new IngestionChunkerOptions(tokenizer)
{
MaxTokensPerChunk = 500,
OverlapTokens = 50
};
IngestionChunker<string> chunker = new HeaderChunker(chunkerOptions);
// ベクトルストアへの書き込み設定(Qdrantを使用)
using var writer = new VectorStoreWriter<string>(
_searchService.VectorStore,
dimensionCount: 1536,
new VectorStoreWriterOptions
{
CollectionName = "conference_knowledge",
IncrementalIngestion = true
});
// パイプラインの組み立てと実行
using IngestionPipeline<string> pipeline = new(
reader, chunker, writer, new IngestionPipelineOptions(), _loggerFactory)
{
ChunkProcessors =
{
new SummaryEnricher(enricherOptions), // AIによる要約の追加
new KeywordEnricher(enricherOptions, ReadOnlySpan<string>.Empty) // キーワード抽出
}
};
このパイプラインの優れた点は、各ステップがプラグイン形式であることです。
PDFを読み込みたい場合はMarkdownReaderを置き換えるだけで済みます。
また、SummaryEnricherのように「AI自身が自分のコンテキストを豊かにする」という高度な処理も、共通のIChatClientを渡すだけで実現できます。
MCP(Model Context Protocol):外部コンテキストとの接続
2026年現在のAI開発において、Model Context Protocol (MCP)は、外部ツールやコンテキストをAIが発見・利用するための標準規格となっています。
HTTPがクライアントとサーバーをつなぐように、MCPはAIアプリとコンテキストプロバイダーをつなぎます。
コンシューマーとしての活用
ConferencePulseは、Microsoft LearnやGitHubのリポジトリ情報を取得するために、外部のMCPサーバーに接続します。
// MCPクライアントの初期化と外部サーバーへの接続
var learnTransport = new HttpClientTransport(new HttpClientTransportOptions
{
Endpoint = new Uri("https://learn.microsoft.com/api/mcp"),
TransportMode = HttpTransportMode.StreamableHttp
}, loggerFactory);
_learnClient = await McpClient.CreateAsync(learnTransport, null, loggerFactory, ct);
// 外部ツールの呼び出し
var result = await _learnClient.CallToolAsync(
"microsoft_docs_search",
new Dictionary<string, object?> { ["query"] = "C# 14 new features" });
プロバイダーとしての公開
また、アプリ自身をMCPサーバーとして公開することも可能です。
これにより、GitHub CopilotやClaudeといった他のAIツールから、現在のカンファレンスのステータスやナレッジベースを直接参照できるようになります。
[McpServerTool(Name = "get_session_status")]
public static string GetSessionStatus(ISessionService sessionService)
{
// 現在のセッション情報を返す
return sessionService.CurrentSession?.Status ?? "No active session.";
}
Microsoft Agent Frameworkによる複数エージェントのオーケストレーション
単純なチャットボットであればIChatClientだけで十分ですが、複数の専門家が協力して作業を行うような複雑なワークフローには、Microsoft Agent Frameworkが威力を発揮します。
ConferencePulseの「セッション要約」機能では、以下の3つの専門エージェントを並列実行させています。
- PollAnalyst:投票結果の傾向を分析する。
- QuestionAnalyst:聴衆からの質問内容を分析する。
- InsightAnalyst:セッション中に生成された知見のパターンを分析する。
これらの出力を最後に「Synthesizer(統合エージェント)」がまとめ上げることで、非常に精度の高い要約を生成します。
// 並列実行ワークフローの構築
var analysisWorkflow = AgentWorkflowBuilder.BuildConcurrent(
[pollAnalyst, questionAnalyst, insightAnalyst],
MergeAgentOutputs);
// 統合ステップのバインド
var composedWorkflow = new WorkflowBuilder(analysisExec)
.BindExecutor(synthExec)
.AddEdge(analysisExec, synthExec)
.Build();
このフレームワークを使用することで、エージェント間の依存関係やデータの受け渡しを宣言的に記述でき、堅牢なオーケストレーションが可能になります。
各コンポーネントの役割と構成
今回のアプリで使用されている技術スタックを整理すると、以下のようになります。
| カテゴリ | 使用されている技術・ライブラリ | 役割 |
|---|---|---|
| 基本インターフェース | Microsoft.Extensions.AI | AIモデルとの通信、ミドルウェアパイプラインの構築 |
| 知識ベース(RAG) | Microsoft.Extensions.VectorData | 特定のベンダーに依存しないベクトルストア操作 |
| データ取り込み | Microsoft.Extensions.DataIngestion | ドキュメントの分割、要約、キーワード抽出の自動化 |
| 外部連携 | Model Context Protocol (MCP) | 外部ツールやドキュメントソースとの標準化された接続 |
| 高度な推論 | Microsoft Agent Framework | 複数エージェントによる並列処理と結果の統合 |
| インフラ管理 | .NET Aspire | Qdrant, PostgreSQL, Azure OpenAI等のオーケストレーション |
まとめ
2026年4月のアップデートにより、.NETにおけるAIアプリケーション開発は「複雑なパズルを組み合わせる作業」から「安定したビルディングブロックを構成する作業」へと劇的な進化を遂げました。
Microsoft.Extensions.*の名前を冠したこれらのライブラリは、かつてMicrosoft.Extensions.DependencyInjectionやLoggingが.NET開発の常識を変えたのと同じように、AI開発の新しい標準となるでしょう。
特定のAIモデルやデータベースの仕様に振り回されるのではなく、抽象化されたインターフェースを使いこなすことで、開発者はより本質的なビジネスロジックの実装に集中できるようになります。
これからAI機能の導入を検討している開発者の皆様は、ぜひこれらのスタックを手に取り、その高い柔軟性と生産性を体感してみてください。
