「俺、WPF職人なのに」— AIという名の黒船、襲来
どうも!海外(筆者はヨーロッパのとある国)で、かれこれ数年、C#とWPFをメインにB2Bのデスクトップアプリを開発している、しがないITエンジニアです。
海外で働くって言うと、なんだかキラキラしてるイメージあります?
まあ、確かに、多国籍なチーム、フランクな上下関係(というか、ほぼ無い)、夕方5時には「Have a good evening!」ってみんなマジで帰る文化。これは最高。
こっちに来てからも、僕は自分の「職人気質」に誇りを持ってました。
特にWPF。XAMLを駆使して、ピクセルパーフェクトなUIを組み上げ、MVVMパターンに則った美しいロジックを書き、デザイナーの無茶振りを「ああ、これね。こう実装すればいいんでしょ」とクールに捌く。
「日本人のエンジニアは、こういう細かいUI/UXの”作り込み”が違うんだぜ」
そんな自負がありました。海外のエンジニアって、良くも悪くも「動けばいい」なところがあるんで、僕の作る画面は結構、評価されてた(はず)。
そう、あの日までは。
あれは、いつものスプリントレビュー(開発した機能の発表会)でのことでした。
僕のターン。
「今回のスプリントでは、設定画面のUIを改善しました。このダイアログ、以前はモッサリしてましたが、非同期処理とアニメーションを加えて、ほら、こんなにスムーズに…」
チームからは「Cool!」「Smooth!」と好意的な反応。よしよし。
次。
チームに最近入った、バックエンド担当のアレックス(仮名)の番。
彼は、どちらかというと無口で、いつもヘッドホンで何やらブツブツ言いながら(多分、独り言)コードを書いてるタイプ。
「えーっと、今回はカスタマーサポート用のチケット管理システムに、新しい機能を追加した」
彼が映し出したのは、地味な管理画面。
「ユーザーから送られてくるサポートメール、今までは手動で『緊急』『バグ報告』『使い方』とかタグ付けしてたよね。あれ、ダルいから自動化した」
……は?
「ユーザーが怒ってるか、喜んでるか、単なる質問か。そういう『感情』も分析して、ダッシュボードで見れるようにした。あと、内容を解析して、自動で『これはバグっぽい、すぐ対応しろ』『これは新機能の要望だから、プロダクトチームに回せ』って振り分けるようにした」
マネージャーの目が、マジで「$」マークになってるのが見えました。
「Wait, Alex. どういうこと?ルールベースで『○○って単語が含まれてたら』みたいな、今までのしょぼい奴?」
アレックスは首を振った。
「いや、AI。自然言語処理のモデルを使ってる。こっちでファインチューニングしたから、ウチの業界の専門用語でも、結構、精度出てるよ。ほら、今テストメール送るから見てて」
彼が、わざと汚いスラングまじりで「このクソ機能、金返せ!」みたいなメールを送ると、管理画面のダッシュボードに、リアルタイムで「Sentiment: Extremely Negative (98%)」「Tag: Urgent / Bug」って表示が点灯した。
シーン……。
マネージャーが、口火を切った。
「…Alex. This is a game changer.(アレックス、これ、革命的だぞ)」
その日、僕は自分のデスクに戻って、さっき褒められたばかりの「スムーズに動くダイアログ」のコードを、ただ無言で眺めてました。
俺がこのダイアログのアニメーションに2日間かけてる間に、アレックスは「仕事のやり方そのもの」を変えるコードを書いてた。
僕のWPFアプリは、ただの「器」。
アレックスが作ったバックエンドは「脳みそ」。
強烈な敗北感。そして、恐怖。
僕の「WPF職人」としてのプライドは、海外の合理主義と「AI」という名の黒船に、粉々に打ち砕かれた瞬間でした。
「いやいや、でも、AIって言っても、どうせPythonでしょ?」
「俺、C#エンジニアだし。デスクトップだし。関係ない(と思いたい)」
「あんなの、数学の博士号持ってるヤツらの遊びだろ?」
僕の頭の中は、典型的な「AIアレルギー患者」の言い訳でいっぱいになりました。
だって、怖いじゃないですか。
自分が必死に磨いてきた「WPFのスキル」が、この海外の地で、明日から「それ、AIで自動化できるよね?」って言われちゃうかもしれない。
ビザの更新にも関わるし、生活がかかってる。
「俺、このままだと、ヤバいんじゃないか?」
海外で働くエンジニアとして、日本にいる時よりも、技術の「トレンド」と「価値」には敏感であるべきだったのに。
僕は、自分が「井の中のWPF職人」になっていたことに、その時、初めて気付いたんです。
「AIなんて、バックエンドの、しかもPythonの連中がやることでしょ?」
そう思ってる、そこのC#エンジニアのあなた。
僕も、そう思ってました。
でも、違った。
このスプリントレビューの夜、僕は悔しさのあまり、ビールを飲みながら「C# AI backend」とか「.NET AI implementation」とか、ヤケクソ気味にググり始めたんです。
そしたら…。
「え?ウソだろ?」
「C#って、こんなことになってたの?」
僕が見つけたのは、Python野郎だけのものだと思っていたAIの世界に、堂々と殴り込みをかけるための「.NETの武器庫」でした。
このブログは、僕と同じように「AI?ナニソレ美味しいの?」と思っていた海外(あるいは国内)のC#エンジニアが、AIという「黒船」にビビるのをやめて、「武器」として乗りこなすための、実録サバイバルガイドです。
次回、【承】の章では、僕がその夜に発見した「AIの正体」と、WPF職人(僕たち)がバックエンドでAIを実装するために今すぐ使える「.NETの武器」について、具体的に切り込んでいこうと思います。
AIの「正体」— .NET(俺たち)の武器でどう戦うか
「C# AI backend」…
ビールの缶を片手に、深夜のデスクで無心にググる。
(頼む、何かあってくれ…)
スプリントレビューでの、あのアレックス(仮名)のドヤ顔。
「AIで自動化した」の一言で、マネージャーの目が「$」マークになった、あの瞬間。
俺が2日かけたUIアニメーションが、まるで子供のお遊戯みたいに霞んで見えた、あの敗北感。
「AIなんて、数学者か、Pythonを崇拝してるデータサイエンティスト様の領域だろ」
「俺らWPF(C#)エンジニアは、所詮、彼らが作った『脳みそ』を入れる『綺麗な箱』を作るだけなのか?」
そんな卑屈な思いが、検索結果のリンクをクリックする指を重くする。
…が、表示されたMicrosoftの公式ドキュメントを見て、僕は文字通り、缶ビールを吹き出しそうになった。
「は? ……ウソだろ?」
そこに書かれていたのは、僕が知っているC#、僕が毎日使っている.NETの世界が、とんでもない「武器」を隠し持っていたという事実だった。
まず、俺(そして、たぶんコレを読んでる多くのC#エンジニア)が勘違いしていた、根本的なデマから正す必要があった。
【デマ】AI開発 = 複雑な数学とPythonで、ゼロからAIモデル(脳みそ)を作ること
これ、大間違い。
もちろん、そういう「AIを“発明”する」領域もある。それは確かに、数学の怪物たちが集う場所だ。
でも、あのアレックスがやったこと。そして、世の中の「AI導入事例」の9割は、これじゃない。
彼らがやっているのは、「AIを“発明”する」ことじゃなく、「すでにある賢いAIを“使う”」こと。
例えるなら、「ミシュラン三ツ星のフレンチをゼロから創作する」のがPython数学者の世界だとしたら、俺たちがやるべきは「三ツ星シェフ(AIモデル)を店(自社システム)に呼んできて、最高の料理(AIの分析結果)を提供してもらう」ことだ。
俺たちは、シェフになる必要はない。
優秀な「レストランの支配人(=エンジニア)」になればいい。
そして、その「優秀なシェフを呼んでくる」ための武器が、.NETのエコシステムに、とっくの昔に揃っていたんだ。
僕がその夜、震える手でブックマークした「.NET AI 逆襲の三種の神器」。
これを、あの日の僕と同じように「AIコワイ」ってなってるC#エンジニアの同志たちに共有したい。
武器①:【API】Azure AI Services (旧: Cognitive Services)
〜AIを「フルコース」で注文する〜
まず、これ。
僕が「アレックスがやったのは、たぶんコレだ」と確信したヤツ。
これは、Microsoftが自社の膨大なデータと研究で鍛え上げた「超高性能なAIシェフ軍団」を、クラウド(Azure)に常駐させてくれてるサービスだ。
俺たちC#エンジニア(じゃなくてもいいんだけど)がやることは、ただ一つ。
「HTTPリクエスト(API)を投げる」
だけ。
WPFアプリから HttpClient でWeb API叩いたこと、あるでしょ?
あれと、まったく同じ。
「この文章、ポジティブ?ネガティブ?(=感情分析)」
「この画像に、何が写ってる?(=画像認識)」
「この日本語、英語に翻訳して(=機械翻訳)」
「この音声、テキストに起こして(=音声認識)」
これらを、俺のローカルPCでも、会社のオンプレミスサーバーでもなく、Azure上で爆速で処理して、結果のJSONだけを返してくれる。
System.Text.Json でデシリアライズして、WPFの画面にバインドする。
…ほら、いつも俺たちがやってる仕事だ。
AIを「実装」するんじゃない。AIを「**消費 (Consume) **」する。
これこそ、AI導入の「最初の一歩」として、最も敷居が低い、最強の入り口だ。
あのスプリントレビューで「革命的だ」と称賛された機能が、もしAPIコール数行で実現できるとしたら?
俺がUIアニメーションにかけた2日間で、同じものが作れたかもしれない。
「AIの複雑さ」に関する最大のデマは、ここで完全に崩壊した。
複雑なのはMicrosoftの中の人が全部やってくれてる。俺たちは、その「結果」だけを、いつものC#コードで受け取るだけ。
武器②:【フレームワーク】ML.NET
〜AIを「ウチの厨房」で育てる〜
AzureのAPIは最強だ。
でも、弱点もある。
「クラウド(Azure)が前提」であること。そして「シェフ(AIモデル)が、Microsoftの用意した汎用的なヤツ」であることだ。
もし、こうなったら?
「ウチの業界の、特殊な専門用語ばっかりのメールを分析させたい」
「インターネットに繋がってない、オフラインの工場内のPCで動かしたい」
「(WPF使いとして)デスクトップアプリに、AI機能を”内蔵”させたい」
ここで登場するのが、ML.NET。
こいつは、正真正銘、Microsoftが作った「.NETネイティブ」の機械学習フレームワークだ。
Pythonじゃない。C#やF#で、AIモデルを「育てる(トレーニング)」ことができる。
「うわ、結局、数学とアルゴリズムの話かよ…」
と、ここでブラウザを閉じようとした、そこのあなた。待ってほしい。
ML.NETの真に恐ろしいところは、AutoML (自動機械学習) という機能。
「Model Builder」っていう、Visual StudioのGUIツール(ウィザード)が、俺たちエンジニアにこう聞いてくる。
「Hey、何をしたいんだい?」
(僕)「えっと、このCSVデータ(過去の売上)を元に、来月の売上を『予測』したい」
「OK。じゃあ、予測したい列はどれ?」
(僕)「『売上高』の列」
「了解。じゃあ、あとは任せとけ。一番いい感じのAIアルゴリズムとパラメータを、俺が全自動で試して、最強のモデルを作っとくわ」
……まじで、これだけ。
僕たちC#エンジニアは、Pythonがどうとか、どのアルゴリズム(回帰だの分類だの)がどうとか、そういうのを(最初は)知らなくていい。
「何をしたいか(=予測、分類、異常検知など)」をGUIでポチポチ選ぶだけで、ML.NETが「最適なAIモデル(のC#プロジェクト)」を自動で生成してくれる。
あとは、その生成されたプロジェクトを、俺たちのWPFアプリやバックエンドAPIから参照して、model.Predict(inputData) って呼び出すだけ。
Azure APIと違って、完全にオフラインで、ローカルで、俺たちの.NETプロセス内で動くAIの完成だ。
これは「AIを使う」の、一歩先。
「自分たちのデータで、自分たち専用のAIを育てる」という領域。
それを、慣れ親しんだC#とVisual Studioで完結できる。
武器③:【ランタイム】ONNX Runtime
〜Python野郎が作った「最強の武器」を、横取りする〜
さて。
Azure API(簡単・クラウド)とML.NET(自前・.NETネイティブ)を知った。
これだけでも、正直、食っていける。
でも、エンジニアとしての「欲」が出てくる。
「わかる。わかるけどさ、結局、世の中の最新SOTA(最高性能)モデルって、GoogleとかMetaが作ってて、Python (TensorFlow, PyTorch) で公開されてるじゃん?」
「あの、画像からスゴイ絵を生成するAIとか、超絶賢いチャットAIとか、ああいう『本物』は、C#じゃ無理なんでしょ?」
…無理じゃなかった。
ここで登場するのが、ONNX (Open Neural Network Exchange) という「AIモデルの共通規格」と、それをC#からブッ叩くための「ONNX Runtime」だ。
例えるなら、ONNXは「AIモデル界のPDF」みたいなもの。
Python (PyTorch) で作ろうが、何で作ろうが、最後に「.onnx」っていう共通ファイル形式でエクスポートできる。
そして、ONNX Runtimeは「ONNXファイル(AIモデル)を実行するための、超高速な実行エンジン(ビューワー)」だ。
もちろん、C# (.NET) から、ネイティブにサポートされてる。
これが、何を意味するか?
- 世界中の天才データサイエンティストが、PythonとPyTorchと高級GPUマシンで、血反吐を吐きながら「最強のAIモデル」をトレーニングする。
- 彼らが、そのモデルを「hoge.onnx」というファイルで公開してくれる。
- 俺たちC#エンジニアは、それをダウンロードしてくる。
- 自分のC# (WPFでもAPIでも) プロジェクトに
NuGetでMicrosoft.ML.OnnxRuntimeを追加する。 - わずか数行のC#コードで、その「最強のAIモデル」をロードし、実行(推論)する。
……お分かりだろうか。
AI開発で、一番しんどくて、金と時間がかかる「トレーニング(学習)」の部分は、全部Python野郎(と大企業)にやらせておいて、俺たちは、その「完成品(.onnxファイル)」だけを、涼しい顔でC#アプリに組み込んで「推論(実行)」だけできるってことだ。
こんなに「おいしい」話があるか?
あの夜、僕が「C# AI backend」でググって見つけたのは、この「三種の神器」だった。
AIは、Python野郎だけの聖域じゃなかった。
俺たち.NETエンジニアには、
① 超手軽な「Azure AI (API)」があり、
② 自前で育てられる「ML.NET (AutoML)」があり、
③ Pythonの成果物を横取りできる「ONNX Runtime」がある。
これを知った瞬間、スプリントレビューでの敗北感は、強烈な「高揚感」に変わっていた。
「アレックス、見てろよ」
「俺のWPFアプリが、ただの『綺麗な箱』で終わると思うなよ」
AIという「黒船」は、もう恐怖の対象じゃなかった。
それは、俺のWPF(C#)エンジニアとしてのキャリアを、次のステージにブーストしてくれる「強力なエンジン」に見えた。
問題は、「じゃあ、この武器をどう使うか」だ。
次回、【転】の章。
僕はまず、この武器を使って「何を」したか。
「使う」AI(Azure)と「育てる」AI(ML.NET)を、具体的にどう組み合わせて、最初の「実用的な(そしてマネージャーを唸らせる)プロトタイプ」を作り上げたか。
その、泥臭いけど超重要な「最初の一歩」の話をしようと思う。
「使う」AIから「育てる」AIへ — AzureとML.NETの「おいしい」とこ取り
あの夜、僕は「.NET AI 逆襲の三種の神器」(Azure AI, ML.NET, ONNX)という名の地図を手に入れた。
高揚感は最高潮だ。
まるで、伝説の剣(Excalibur)のありかを知ってしまった気分。
でも、地図を手に入れただけじゃ、あの黒船(アレックス)には勝てない。
剣は、振らなきゃ意味がない。
問題は、「どう振るうか」だ。
エンジニアとして、いや、職人としてのプライドが、僕にこう囁いた。
「まずは、アレックスがやったことを、俺の流儀(C#)で再現する」
彼がやったのは、「サポートメールの感情分析」と「タグの自動分類」。
「承」で学んだ知識を総動員する。
これは、三種の神器のうち、①「Azure AI」か、②「ML.NET」でイケるはずだ。
僕は、まず「最速」を選んだ。
伝説の剣が本当に切れるのか、まずは鞘から抜いて、手近な木を斬ってみる。
そう、① Azure AI Services だ。
週末。家族が寝静まった深夜、僕は自分の書斎で、愛用のVisual Studio(もちろんダークモード)と、ブラウザのAzureポータルを開いた。
「AI?複雑?知るか。とりあえず、APIを叩くまでだ」
ステップ1:Azure無料アカウントの登録、そして「AIシェフ」の確保
まず、Azureの無料アカウントをサクッと作る。クレジットカードは必要だけど、12ヶ月の無料枠と、最初の30日間で使えるクレジット(確か200ドル分くらい)がもらえる。これで遊ぶには十分すぎる。
次に、Azureポータルで「Azure AI Services」(昔のCognitive Services)を検索。
ありとあらゆるAI機能(視覚、音声、言語、決定…)が並んでいて、ちょっとビビる。
「多すぎだろ…」
落ち着け、俺。やりたいのは「感情分析」だ。
それは「Language(言語)」サービスに含まれている。
ポチポチとリソースを作成。
リージョン(サーバーの場所)を選び、価格レベルを「Free F0」(無料枠)に設定。
数分後。
僕専用の「AI Languageサービス」のエンドポイント(APIのURL)と、認証キー(パスワード)が発行された。
所要時間、約10分。
この時点で、僕は「Microsoftが誇る、超高性能な自然言語処理AI」を、自由に呼び出せる権利を手に入れた。
数学?Python?影も形もない。
ステップ2:C# (WPF) からの「AIシェフ」呼び出し
次に、Visual Studioを開く。
実験用に、WPFアプリのプロジェクトを新規作成。
(コンソールアプリでも良かったんだけど、そこはWPF職人としての意地だ。最終的にUIに表示してニヤニヤしたい)
Package Manager Consoleを開き、例の呪文を唱える。
PM> Install-Package Azure.AI.TextAnalytics
これだけ。
HttpClient で生REST APIを叩いてもいいんだけど、Microsoftが超親切な.NET用SDK(クライアントライブラリ)を用意してくれている。これを使わない手はない。
さて、画面に TextBox(txtInput)と Button(btnAnalyze)、結果表示用の TextBlock(lblResult)を適当に配置。
ボタンのクリックイベント(コードビハインドで失礼。MVVMは後だ)に、魂のコードを書き込む。
C#
// using Azure;
// using Azure.AI.TextAnalytics;
// using System.Windows;
private async void btnAnalyze_Click(object sender, RoutedEventArgs e)
{
// Azureポータルからコピペしてきたキーとエンドポイント
string endpoint = "https://your-ai-service-name.cognitiveservices.azure.com/";
string apiKey = "your-secret-api-key";
// AIシェフ(クライアント)の準備
var client = new TextAnalyticsClient(new Uri(endpoint), new AzureKeyCredential(apiKey));
string inputText = txtInput.Text;
if (string.IsNullOrEmpty(inputText)) return;
try
{
// !!!!!! AI、起動 !!!!!!
// 「このテキストの感情を分析してくれ!」とシェフに注文
DocumentSentiment documentSentiment = await client.AnalyzeSentimentAsync(inputText);
// !!!!!! 結果、到着 !!!!!!
lblResult.Text = $"感情: {documentSentiment.Sentiment}\n";
lblResult.Text += $"ポジティブ度: {documentSentiment.ConfidenceScores.Positive:P2}\n";
lblResult.Text += $"ニュートラル度: {documentSentiment.ConfidenceScores.Neutral:P2}\n";
lblResult.Text += $"ネガティブ度: {documentSentiment.ConfidenceScores.Negative:P2}\n";
}
catch (RequestFailedException ex)
{
MessageBox.Show($"AIシェフが怒ってる: {ex.Message}");
}
}
書いたコードは、実質10行もない。
非同期(async/await)でAPIを呼び出す、いつもの.NETの作法だ。
ステップ3:震える指で、実行(F5)
ビルド。実行。
見慣れたWPFのそっけないウィンドウが立ち上がる。
TextBox に、恐る恐る入力してみる。
「I love this product! It's amazing!」
ボタンをクリック。
…一瞬(本当に0.5秒くらい)の間。
TextBlock が更新された。
感情: Positive
ポジティブ度: 99.00%
ニュートラル度: 0.00%
ネガティブ度: 1.00%
「……うぉっ」
声が出た。
次。アレックスがデモでやったみたいな、意地悪なやつ。
「This new feature is absolute garbage. I want my money back.」
(この新機能、マジでゴミ。金返せ)
クリック。
感情: Negative
ポジティブ度: 0.00%
ニュートラル度: 1.00%
ネガティブ度: 99.00%
「……マジかよ」
深夜の書斎で、僕は膝から崩れ落ちそうになった。
できた。
アレックスが「AIで自動化した」とドヤ顔で言っていたことの「核」の部分が、Azureのセットアップ含めて、わずか30分足らずで、僕の手元のWPFアプリで動いてしまった。
「AIは複雑」という神話が、音を立てて崩壊した瞬間だった。
僕がAI導入に必要だったのは、数学の知識でも、Pythonの環境構築でもなかった。
「Azureの無料アカウント」と「NuGetでSDKをインストールする勇気」
そして、
「await client.AnalyzeSentimentAsync()」
この一行を書く、ただそれだけだった。
…しかし。
僕は、ここで満足するような「イエスマン」じゃない。
(海外でWPF職人をやってる人間は、大抵、ちょっと偏屈なんだ)
Azure AIはスゴイ。スゴイが、弱点も見えた。
「これ、ウチの会社の『専門用語まみれの苦情メール』を、ちゃんとネガティブって判定できるのか?」
例えば、僕らの業界(仮に、製造業の部品管理システムとする)で、「『図番XXXの納期回答が、仕様BのままサイレントFIXされた』」みたいなメールが来たとする。
これは、顧客からしたら「ヤバイ!仕様が違う!」という、超絶ネガティブなクレームだ。
でも、Azureの汎用AIシェフ(モデル)は、この文章に「garbage」とか「terrible」みたいな分かりやすいネガティブ単語が入ってないから、
「感情: Neutral(ニュートラル)」
とか、ヌルい回答を返してくる可能性が高い。
アレックスは言っていた。
「こっちでファインチューニングしたから、ウチの業界の専門用語でも、結構、精度出てるよ」
Azure AIは「AIを“使う”」世界。
アレックスがやったのは、その一歩先。「AIを“育てる”」世界だ。
…いいだろう。
ならば、俺も「育てる」側に回ってやる。
僕は、三種の神器の二つ目、② ML.NET に手を伸ばした。
「C#で、自分たち専用のAIモデルを育てる」という、アレだ。
ステップ4:ML.NET AutoML(自動機械学習)との対峙
まず、Visual Studio Installerで「ML.NET Model Builder」をインストールする。(これもポチポチ押すだけ)
これで、僕のVisual Studioに「AIを自動で作ってくれるウィザード」が追加された。
次に、一番面倒な作業。
「データ」の準備だ。
幸い、社内のサポートデスクに頼み込んで、「過去のサポートメール(ダミーデータ)」と「それに対応するタグ(『緊急バグ』『仕様問合せ』『要望』など)」が書かれたCSVファイルを、こっそり手に入れた。(こういう時のフットワークは、海外に来てから軽くなった)
WPFプロジェクトを右クリック。
「追加」→「Machine Learning Model…」
来た!
Model Builderのウィザードが起動する。
僕がやったのは、本当に、これだけ。
- シナリオ選択: 「何がしたいんだい?」→「テキスト分類 (Text classification)」を選択。(メールをタグに分類したいから)
- データ入力: 「データはどこ?」→ さっき手に入れたCSVファイルを指定。「予測したい列(タグ)」と「学習に使う列(メール本文)」を選ぶ。
- トレーニング: 「どれくらいAIを鍛える?」→ とりあえず「10分 (Time to train)」と設定。
- 「トレーニング開始」ボタンを、クリック!
……僕のノートPCのファンが、**「ヴオオオオオン!!!」**と、聞いたことのない轟音を立て始めた。
Model Builderの画面には、AutoMLが「SDCA(だの)」「L-BFGS(だの)」、僕が聞いたこともないAIアルゴリズムを、片っ端から試しては、その精度(Accuracy)を競わせている様子がリアルタイムで表示されている。
僕は、その轟音を聞きながら、コーヒーを淹れるしかなかった。
僕の代わりに、Microsoftが作ったAutoMLが、僕のPCのリソースを全開で使って、最強の「テキスト分類AIモデル」を作ろうと格闘してくれている。
そして、10分後。
ファンが静かになった。
「トレーニングが完了しました。最高の精度:94.2% (アルゴリズム: SDCA)」
…は?
もう、できたの?
ステップ5:C#への「AIモデル」組み込み
ウィザードが、次のステップ「評価 (Evaluate)」と「コード (Code)」を提示してくる。
「コード」タブを押すと、そこには、信じられないものが表示されていた。
「お前が作ったAIモデルを使うなら、このC#コードをコピペしろ」
そこには、
「YourModelName.consumption.cs」
「YourModelName.mlnet」
という2つのファイルが自動生成されており、それを使うためのサンプルコードが書かれていた。
C#
// 1. モデルの入力データ(メール本文)を用意
YourModelName.ModelInput sampleData = new YourModelName.ModelInput()
{
Col0 = @"図番XXXの納期回答が、仕様BのままサイレントFIXされた",
};
// 2. !!!!!! AIモデル、起動 !!!!!!
// (注:このモデルは Azure API じゃない。俺のPC上で、オフラインで動いてる)
var predictionResult = YourModelName.Predict(sampleData);
// 3. !!!!!! 結果、到着 !!!!!!
// predictionResult.PredictedLabel には "緊急バグ" が入ってる!
Console.WriteLine($"予測されたタグ: {predictionResult.PredictedLabel}");
僕は、震える手で、このコードをWPFアプリに移植した。
Azure AIを呼び出すコード(btnAnalyze_Click)の隣に、ML.NETを呼び出す新しいボタン(btnAnalyzeLocal_Click)を作った。
そして、実行(F5)。
例の「『図番XXXの納期回答が、仕様BのままサイレントFIXされた』」をTextBoxにコピペして、新しい「ローカルAIで分析」ボタンを押す。
結果。
「予測されたタグ: 緊急バグ」
……勝った。
僕は、天を仰いだ。
Azure AI(汎用AIシェフ)では「Neutral」と判定されたであろう業界用語まみれの文章を、僕がC#とVisual Studioだけで「育てた」AIモデルが、完璧に「緊急バグ」だと見抜いた。
もちろん、オフラインで。僕のWPFアプリの中で、完結して動いている。
これが、僕が踏み出した「最初の一歩」だった。
AIは、もはや「黒船」でも「Python野郎の聖域」でもなかった。
「使う」AI(Azure)なら、30分で試せる「ただのAPI」。
「育てる」AI(ML.NET)ですら、AutoMLが「数学とアルゴリズム」の面倒をすべて肩代わりしてくれる「ウィザード」。
僕たちC#エンジニアがAIを始めるにあたって、複雑さに関する懸念や神話は、すべてデマだった。
必要なのは、Pythonを学ぶ時間じゃない。
Visual Studioの「モデルビルダー」をインストールし、Azureの「無料枠」にサインアップする、その「クリック一回」の勇気だけだったんだ。
さて、これで僕も「AI、チョットデキル」C#エンジニアの仲間入りだ。
でも、話はこれで終わりじゃない。
この「ローカルで動く、自前のAIモデル」を手に入れたことで、僕の「WPF職人」としてのキャリアに、とんでもない「新しい道」が見えてきた。
そして、三種の神器の三つ目、「ONNX」の存在が、さらにその道を広げていくことになる。
次回、【結】。
このAIスキルが、単なる「技術」ではなく、なぜ僕たち(特に海外で働く)エンジニアの「生存戦略」そのものになるのか。
そして、アレックス(Python野郎)と、僕(C#職人)が、どう共存し、あるいは戦っていくのか。
その最終章を語りたいと思う。
AIスキルは「技術」じゃない、「生存戦略」だ
深夜の書斎。
ノートPCのファンは、もう静かになっている。
僕がVisual Studioのウィザード(AutoML)で「10分間鍛えろ」と命令して作った、自前のAIモデル。
そいつが、僕のWPFアプリ上で、Azureの汎用AIが見抜けなかった「業界用語まみれのクレーム」を、「緊急バグ」と一発で見抜いた、あの瞬間。
僕は、ガッツポーズもせず、ただ、静かに息を吐いた。
「……勝った」
アレックス(仮名)に勝ったとか、そういうんじゃない。
スプリントレビューで感じた、あの「俺のスキル(WPF)、もうオワコンなのか?」という強烈な恐怖。
その、得体の知れない「AIという名の怪物」に、僕は、勝ったんだ。
あの日、僕を震えさせた怪物の正体は、
「await client.AnalyzeSentimentAsync()」
という、たった一行のAPIコールであり、
「Model Builder(自動機械学習)」
という、Visual Studioの便利なウィザード機能だった。
なんというか、拍子抜けした。
と同時に、とんでもない「興奮」が、腹の底から湧き上がってきた。
「待てよ。これ、ヤバくないか?」
僕が手に入れたこの「AIをC#で扱うスキル」は、単なる新しい技術スタック(流行りのフレームワークを覚えた、とか)じゃない。
これは、特に僕のように海外で働くエンジニアにとって、最強の「生存戦略」そのものだと気付いたんだ。
AIが「技術」ではなく「人生術」である理由
日本で働いていると、もしかしたら「言われたものを、キッチリ作る」ことが、一番の評価に繋がるかもしれない。
「〇〇さんは、あの複雑な画面仕様を、バグなく完璧に実装できる」
それが「職人」としての価値だった。僕も、そう信じて疑わなかった。
でも、海外(特に僕のいるヨーロッパ)の現場は、違う。
もちろん品質は大事だ。でも、それ以上に問われるのは、
「で、それ、ビジネスにどう貢献するの?」
という一点。
マネージャーは、僕のWPFアプリのダイアログが「ぬるぬる動く」こと(僕が2日かけたアレ)には、「Cool!」とは言う。
でも、アレックスの「AIでサポート業務が自動化できる」というデモには、「This is a game changer.(革命的だ)」と言った。
この差だ。
僕がやっていたのは「How(どう作るか)」の改善。
アレックスがやったのは「What(何を解決するか)」の提示。
僕がUIアニメーションで稼げる「会社の利益」は、たぶん、ゼロだ。(ユーザー体験は上がるけど、直接的なカネにはなりにくい)
アレックスがAIで稼げる「会社の利益」は、サポート担当者2人分の人件費(年間ウン千万円)かもしれない。
これが「価値」の差だ。
海外では、この「価値」を自分で提示できないエンジニアは、驚くほどあっさり「不要」と判断される。
ビザの更新、給与交渉、そして、いつ来るかわからないレイオフ(クビ)の波。
僕たちは、常に「俺には、これだけの価値がある」と、胸を張って証明し続けなきゃいけない。
その「価値の証明」として、「AI」は、強すぎる。
「AI、チョットデキル」
この一言が、僕の立ち位置を、「言われたものを作るWPF職人」から、「ビジネス課題をAIで解決できる、C#エンジニア」に変えてくれる。
「サポートデスクのコストを、AIで30%削減する提案です。プロトタイプ、作ってきました」
「工場の検品ラインの目視チェック、AIで自動化しませんか?WPFとカメラで、こういうのが作れます」
こんなセリフが言えるエンジニアを、誰が「不要」だなんて言える?
これが、僕が「AIは生存戦略だ」と断言する理由だ。
僕たちの「給料」と「雇用」に、直結する話なんだよ。
「WPF職人」×「AI」= 最強のクライアントサイド・エンジニア
「わかった。でも、結局、AIってバックエンド(アレックス)の仕事なんでしょ?」
「俺たちWPFエンジニアは、彼らが作ったAPIを叩くだけの『ガワ』作りなの?」
そう思っていた時期が、僕にもありました。
「転」でML.NETを使って、ローカルで動くAIモデルを作った、あの時までは。
思い出してほしい。
「三種の神器」には、まだ使っていない最強の武器が残っている。
そう、③ ONNX Runtime だ。
こいつは、「Python野郎が作った『最強のAIモデル(.onnx)』を、横取りしてC#で動かす」という、ジャイアンみたいな代物だった。
これが、何を意味するか。
AIは、もはやバックエンドの専売特許じゃない。
世界中の天才たちが作った、画像認識、音声認識、異常検知の「超高性能なAIモデル(.onnxファイル)」。
それを、俺たちのWPFアプリ(クライアントPC)に**”内蔵”**できるんだ。
例えば、こうだ。
- WPF × ONNX(画像認識):工場のラインに設置したカメラ映像を、俺のWPFアプリでリアルタイムに表示する。その映像フレームを、バックエンドに(いちいち)送信するんじゃない。WPFアプリに内蔵したONNXモデルが、クライアントPCのGPUを使って、リアルタイムで「不良品」を検知し、アラートを出す。オフラインでも動く。超高速だ。
- WPF × ONNX(音声認識):(これは実際に僕が次のスプリントで提案しようと目論んでるネタだ)サポート担当者が使う内線電話アプリをWPFで作る。担当者が喋った内容を、バックエンドに(いちいち)送信するんじゃない。ローカルのONNXモデルがリアルタイムで「音声認識(文字起こし)」し、さらにML.NETモデルが「クレーム内容を分類」し、関連するマニュアルをWPFの画面に自動でポップアップさせる。
どうだ?
ワクワクしてこないか?
AIは、クラウド(Azure)で「使う」だけじゃない。
ローカル(ML.NET)で「育てる」だけでもない。
世界中の英知(ONNX)を、俺たちの主戦場である「デスクトップ(WPF)」に持ち込んで、**最強の「エッジAIアプリ」**を作ることができる。
WPFの「リッチな表現力」と、AIの「知能」。
これ、最悪の(いや、最高の)組み合わせだろ。
黒船を「降りる」な、「乗っ取れ」
あのアレックス(Python野郎)は、もう僕にとって「恐怖」の対象じゃない。
彼は、最高の「パートナー」だ。
彼は、Pythonと数学で、最強の「AIモデル(脳みそ)」を育てるのが得意。
僕は、C#とWPFで、最高の「UI(体)」を作るのが得意。
これからは、こういう分業になる。
「アレックス、今度、こういうAIモデル(.onnx)作ってくれよ。こっちのWPFアプリに組み込んで、現場の作業、自動化するからさ」
「ああ、いいぜ。その代わり、俺が作ったAIが吐き出す結果、お前のWPFでもっとイイ感じにグラフ化して、マネージャーに見せられるようにしてくれよ」
最高じゃないか。
あのスプリントレビューの日、AIという黒船が、僕の「WPF職人」としてのプライドを粉々に打ち砕いた。
でも、僕は、その船から逃げなかった。
船に乗り込んで、構造を調べ(Azure, ML.NET)、操縦桿の握り方(ONNX)まで見つけてしまった。
結論を言おう。
「WPF職人」が、無理して「AIデータサイエンティスト」になる必要は、まったくない。
僕たちが目指すべきは、
「AIを“使いこなせる”、WPF職人」
だ。
それだけで、あなたの市場価値は、今の5倍、いや10倍になる。
海外で働く僕たちにとって、それは「給与」であり、「ビザ」であり、「人生の選択肢」そのものだ。
AIは、Python野郎だけの聖域じゃなかった。
それは、俺たちC#エンジニアのキャリアを、次のステージにブーストしてくれる、最強の「武器」だったんだ。
この記事を読んで、「AI、ちょっと怖いかも」と思っていた、かつての僕のようなあなたへ。
もう、ビビる必要はまったくない。
あなたに必要なのは、Pythonの本でも、統計学の教科書でもない。
今すぐ、あなたのVisual Studioを開いてほしい。
そして、「Visual Studio Installer」で「ML.NET Model Builder」にチェックを入れて、インストールしてみてほしい。
あるいは、Azureの「無料アカウント」を作って、Azure.AI.TextAnalytics をNuGetでインストールしてみてほしい。
それが、あなたの「生存戦略」の、輝かしい第一歩になる。
黒船は、もう怖くない。
さあ、一緒に乗っ取ってやろうぜ。

コメント