個人的なメモ

Tomohiro Suzuki @hiro128_777 のブログです。Microsoft MVP for Developer Technologies 2017- 本ブログと所属組織の公式見解は関係ございません。

C# を使ってローカル PC の CPU か NPU かでお手軽にエッジ AI を始める方法

 

はじめに

LLM を使うのはもう当たり前ですが、最近はローカル PC の SLM も手軽に試せる環境が整ってきました。
そこで、C# を使ってローカル PC の SLM でお手軽にエッジ AI を始める方法をご紹介します。
 

CPU か NPU か

これまでは NVIDIA の GPU を使うのが一般的でしたが、GPU を搭載したラップトップ PC を所持している方は少ないと思いますので、お手軽に試す場合の選択肢は CPU か NPU になります。NPU で SLM を簡単に試す方法も現状では Copilot+ PC 上での Phi Silica or Deepseek R1 Distilled に限られるので、第一の選択肢は CPU ということになります。
 

CPU で SLM を試すには

C# を使って CPU 上で SLM を自由に操作するには ONNX ランタイムを使います。

  • ONNX ランタイムに最適化されたモデルが提供されている
  • 16GB の メモリで実用的な速度で動く

という条件を考えた場合には Microsoft の Phi シリーズがおすすめです。

モデルは Hugging Face から DL できます。
CPU で動かす場合には、CPU 上の ONNX ランタイムを使用して実行できるように最適化されたモデルを使用します。
2025/3 現在では以下のモデルが提供されています。

CPU 上の ONNX ランタイム対応の提供モデル一覧(2025/03 現在)
Phi 3 Phi 3.5 Phi 4
Short Context Long Context Short Context Long Context Short Context Long Context
Mini ◯ 4k ◯ 128k X ◯ 128k X ◯ 128k
Smal X X X X X X
Medium ◯ 4k ◯ 128k X X X X

 
ホストされているサイトやダウンロード方法については以下の記事を参照ください。
hiro128.hatenablog.jp
 

NPU で SLM を試すには

C# を使って NPU 上で SLM を自由に操作するには Copilot+ PC 上でWindows Copilot Runtime を使います。
learn.microsoft.com

モデルは Phi Silica となります。
サポートしている Windows 11 Insider Preview Build を使用していれば、Windows Update で降ってきます。

Phi Silica を使うには現在以下の環境が必要です。

  • Copilot+ PC (Snapdragon X)
  • Windows App SDK (1.7.0-experimental3)
  • Windows 11 Insider Preview Build 26120.3073 (開発およびベータ チャネル)

 
Phi Silica を使う前に読んでおくとよい記事をまとめました。
hiro128.hatenablog.jp
 
公式のサンプル WinUI アプリで Phi Silica を試す方法は以下を参照下さい。
hiro128.hatenablog.jp
 
コンソールアプリで自由に Phi Silica を試す方法は以下を参照下さい。
hiro128.hatenablog.jp
 
 

Phi Silica を試す前に読んでおくとよいおすすめのドキュメント

 

はじめに

自分の備忘録を兼ねて、Phi Silica を試す前に読んでおくとよいおすすめのドキュメントをまとめました。
日本語の情報は最新でないことが多いので、英語版のリンクです。ブラウザの翻訳機能で日本語表示にすれば問題ありません。
 

環境作成

前提条件

Copilot+ PC (Snapdragon X) が必要です。
learn.microsoft.com
 

Windows App SDK experimental channel のリリースノート

Phi Silica の利用には 1.7.0-experimental3 が必要です。
learn.microsoft.com
 

アプリ作成に必要な情報

Windows App SDK Phi Silica の API リファレンス

learn.microsoft.com
 

公式の Windows Copilot Runtime WinUI サンプルアプリ

github.com
 

筆者作成の Language Model を試すコンソールアプリ

github.com
 

トラブルシューティング

System.Runtime.InteropServices.COMException が発生する場合の対応策

  • LanguageModel.CreateAsync()をコールすると System.Runtime.InteropServices.COMException が発生する場合
  • LanguageModel.IsAvailable()をコールすると System.Runtime.InteropServices.COMException: 'クラスが登録されていません' が発生する場合

github.com

Phi Silica の Language Model を検証できるコンソールアプリ

 

はじめに

公式のサンプルは WinUI3 アプリで、パラメータをいじりながら Phi Silica の検証をするには使い勝手が悪かったので
もっとシンプルに Phi Silica の Language Model を検証できるコンソールアプリを作成しました
github.com

  • Windows Copilot Runtime API を使用します。
  • C# で書かれています

 

推奨環境

  • Copilot+ PC (Snapdragon X)
  • Windows App SDK (1.7.0-experimental3)
  • RAM 16GB 以上
  • Windows 11 Insider Preview Build 26120.3073 (開発およびベータ チャネル)

 

目的

  • Phi Silica の検証
  • Phi Silica でエッジ AI アプリを作る前に、精度が出るか確認したい
  • NPU が動いているのを手っ取り早く確認したい

 

特長

設定ファイルは json

以下の項目を設定できます

  • 翻訳の ON/OFF
  • RAG の ON/OFF

 

プロンプトを一度英語に翻訳して問い合わせ、結果を再度日本語にできる

Phi Silica は英語に最適化されているため、プロンプトを一度英語にして問い合わせ結果を再度日本語にすることで精度を高められる可能性があります。翻訳の ON/OFF は設定ファイルのオプションで指定します。
(残念ながら現状あまり効果が出ていません)
 

RAG に対応

md, txt で付加情報を与えることでで RAG に対応しています。特に翻訳した時の固有名詞を与えることで、精度を高められます。

ベクトル検索は Build5Nines 氏の SharpVector
を使用しています。
github.com
 

処理フロー
  1. システムプロンプトを英語に翻訳する
  2. ユーザープロンプトを英語に翻訳する
  3. 英語にしたプロンプトで問い合わせ
  4. レスポンスでベクトルデータベースに問合せし、RAG のデータ取得
  5. RAG のデータを付加して日本語に翻訳

 

設定ファイルのフォーマット

settings.json

{
  "isTranslate": "<true or false>",
  "isUsingRag": "<true or false>",
  "systemPrompt": "<Your system prompt>",
  "userPrompt": "<Your user prompt>",
  "additionalDocumentsPath": "<Your documents path>" // RAG 用ファイルの Path
}

Phi モデルをローカルで検証できるサンプルアプリ

 

はじめに

Phi モデルをローカルで検証できるサンプルアプリを作成しました。
github.com

  • ライブラリは ONNX です
  • C# で書かれています

 

推奨環境

  • 最低 RAM 16GB 以上
  • 推奨 RAM 32GB 以上

 

目的

  • Phi3, Phi3.5 をローカル CPU で動かす検証の用途
  • Phi3, Phi3.5 でエッジ AI アプリを作る前に Phi3, Phi3.5 で求めている精度が出るか確認できる
  • Phi3, Phi3.5 でエッジ AI とりあえず遊んでみる

 

特長

設定ファイルは json

以下の項目を設定できます

  • ローカルに保存したモデルの Path
  • 翻訳の ON/OFF
  • RAG の ON/OFF

 

プロンプトを一度英語に翻訳して問い合わせ、結果を再度日本語にできる

Phi シリーズは英語に最適化されているため、プロンプトを一度英語にして問い合わせ結果を再度日本語にすることで精度を高められます。翻訳の ON/OFF は設定ファイルのオプションで指定します。
 

RAG に対応

md, txt で付加情報を与えることで RAG に対応しています。特に翻訳した時の固有名詞を与えることで、精度を高められます。

ベクトル検索は Build5Nines 氏の SharpVector
を使用しています。
github.com
 

処理フロー
  1. システムプロンプトを英語に翻訳する
  2. ユーザープロンプトを英語に翻訳する
  3. 英語にしたプロンプトで問い合わせ
  4. レスポンスでベクトルデータベースに問合せし、RAG のデータ取得
  5. RAG のデータを付加して日本語に翻訳


 

設定ファイルのフォーマット

settings.json

{
  "modelPhi35Min128k": "<Your model path>",
  "modelPhi3Med4k": "<Your model path>",
  "modelPhi3Med128k": "<Your model path>",
  "modelPhi3Min4k": "<Your model path>",
  "modelPhi3Min128k": "<Your model path>",
  "modelPhi4Unofficial": "<Your model path>",
  "isTranslate": "<true or false>",
  "isUsingRag": "<true or false>",
  "systemPrompt": "<Your system prompt>",
  "userPrompt": "<Your user prompt>",
  "additionalDocumentsPath": "<Your documents path>" // RAG 用ファイルの Path
}

 

モデルのダウンロード

Hugging Face からダウンロードします。
huggingface.co


ダウンロードするコマンドについてはアプリに付属の download_model_cmd.txt を参考にしてください
 

Phi Silica (Language Model)で日本語の実用性があるか試してみた。

 

はじめに

コンソールアプリで、Phi Silica が動かせるようになったのが分かったので、検証アプリを作成して日本語で実用性があるか試してみました。
当然ながら、現状 Experimental リリースですので不具合がたくさんあって当たり前という前提での検証です。

Phi Silica バージョン:2025-02 arm64 ベースのシステムの Phi Silica version 1.7.516.0 (KB5053338)

 

検証 1

システムプロンプト
あなたは歴史学者です。あなたの知識を最大限活用して質問内容について解説してください。

 

ユーザープロンプト
徳川家康について600字以内で説明してください

 

レスポンス
徳川家康は、日本の関ヌカ時代の?遷(1600年)までの緊迫した政治的混乱時期に成功にとどまった戦国大名です。1590年の元隰豊臣秀秀(以後豊迥)の出身と、織田義氏を主要な家族とします。家康は横山忠勝とともに、討倒織川忠(豊迥)の敗北と戦えず試続け、名門の煙火にとんがりくる。成功に反って生き抜かながたくとなった日曜?豊?孟。その驚石にもかかされ、1596年に北関近衛長の世臣として、安房の扶助とともに政敵を失う。その後、埼玉では?高に従事すし、日光出来臣と大顧に相続しん。でござさらう耀託にて、?豪しかの子と和大名の連行が?(つとば)つくたまて豊?岬が繰(まな)き。そきかすたにおけて、平祀家康が出立つ。

天の傲政(天下鎮元)をとなべて輸まの武政が調る。この俑事役が成るために、関ヂ族、佐野斉豊呂の??(訝しのたみら)なる家臣を盛(なる)つく。家康は関所の改名をし?(うり)なる名を取り朽んる、東京(江戸)と称を得た。慢(もど)てしにお仲と嫡臣が陲つきてかりまたの子供ととのまつつな。?地下剛

回答内容がどうこうという次元ではなく、途中から日本語が破綻していており、まだ実用はできない感じですね。
 

検証 2

システムプロンプト
** あなたは日本人で50年以上日本に住んでいます。あなたの知識を最大限活用して質問内容について解説してください。

 

ユーザープロンプト
東京について600字以内で説明してください

 

レスポンス:
<|assistant|)

東京は日本の忙しい都市で豊かな人文書物と魅力的な都市景観が見られる場所です。豊かで速度のある発展を遂げる繁華通さなじ忙しい市の中心。公的と私的な空間は互いに繰り延ばされており、伝統とモダニズムが静かに共存しています。例えば、歴史的な皇居と静かで沿ったアモデルシェルズ、独特の文化風景が息をのせ継ぐ。 騒

こちらも、chat format の一部が出力されていたり、レスポンスが途中で終了していたりと、まだ実用はできない感じですね。
 

比較用:英語での検証

システムプロンプト
You are Japanese and have lived in Japan for over 50 years. Please explain the question to the best of your knowledge.

 

ユーザープロンプト
Please describe Tokyo in 600 characters or less.

 

レスポンス:
Tokyo, the capital city of Japan, is a bustling metropolitan area that combines a blend of traditional culture and modern modernity. Famous for both its historic sites like Senso-ji Temple and Meiji Shrine, alongside towering architectural marvels and innovations like Shiodome and Tokyo Skytree, it's a global tech mecca in Shinjuku and Shibuya. A world culinary hub, it hosts Michelin-starred dining and Izakayas offering ramen. Tokyo's vibrant district, Harajuku, is renowned for its fashion-forward youth. Amid the city's relentless dynamic, calm is found in localized spots, Zozojiwa and garden oases like Rikugani.

 

まとめ

英語ではかなり実用性がある回答が出せるので、Phi Silica も基本的には英語前提のモデルのようです。
ただ、モデル自体もアップデートが WIndows Update で配信されており、正式リリースまでにどれくらい改善されるか見守ることにします。