C# と ローカル SLM で Edge AI を試してみた

0.9K Views

March 30, 25

スライド概要

C#を利用してローカルPCでのSLM(Small Language Model)の検証を行い、どの程度の機能を実現できるかを探ります。特に、日本語応答生成の品質・速度の両立について考察します。具体的なコードの紹介や検証結果も共有します。

profile-image

SIerの人。Xamarin.iOS が好き。Azure と戯れるのが仕事。Visual Studio for Mac が Win版と同等になる日を切望。Microsoft MVP Developer Technologies 2017-

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

日本語 C# と ローカル SLM で Edge AI を試してみた。 Tomohiro Suzuki @hiro128_777 2025-3-30

2.

自己紹介 鈴木友宏 生成 AI を用いた開発変革のコンサルを行っています。 C# Tokyo 運営メンバー Twitter:@hiro128_777 blog:https://hiro128.hatenablog.jp/ このスライドの URL 2

3.

ご注意 • このスライドは 2025/3 時点の情報に基づいています。 3

4.

動機 ✓ クラウドの LLM を利用するのは一般的になっていますが、最近ではローカル PC で SLM を気軽に試せる環境も整ってきました。 ✓ 今回は、現時点で C# を使用してローカル PC の SLM でどれくらいのことができるのかを 検証したくなったので、確認してみました 4

5.

今回の検証に利用したコード 以下のリポジトリを参照下さい。 https://github.com/TomohiroSuzuki128/phi-console-app/ 5

6.

GPU or CPU or NPU ✓ NVIDIA の GPU を搭載したノート PC を持っている人は多くない ✓ NPU で SLM を手軽に試す方法は Copilot+ PC 上の Phi Silica または DeepSeek-R1 Distilled に限ら れている ✓ 現実的には CPU が最も手軽な選択肢となる C# 対応のモデルとライブラリ(2025/03 現在) Phi4 Phi3.5 Phi3 GPU ONNX Runtime ONNX Runtime ONNX Runtime CPU ONNX Runtime ONNX Runtime ONNX Runtime NPU Phi Silica DeepSeek-R1 Windows Copilot Runtime Ollama 6

7.

CPU で SLM を試すには C# を使って CPU 上で SLM を操作するには ONNX ランタイムを使います。 ✓ ONNX ランタイムに最適化されたモデルが提供されている ✓ 16GB の メモリで実用的な速度で動く という条件を考えた場合には Microsoft の Phi シリーズがおすすめです。 CPU / ONNX Runtime に最適化されたモデルは Hugging Face から DL できます。 CPU 上の ONNX Runtime 対応の提供モデル一覧(2025/03 現在) Phi 3 Phi 3.5 Phi 4 Mini ◯ 4k ◯ 128k ◯ 128k ◯ 128k Smal × × × Medium ◯ 4k ◯ 128k × × 7

8.

NPU で SLM を試す前提条件 C# を使って NPU 上で SLM を操作するには Copilot+ PC 上で Windows Copilot Runtime を使います。 ✓ モデルは Phi Silica となります。 ✓ 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 以上 (開発およびベータ チャネル) 8

9.

CPU で SLM を操作する簡単なアプリを作成してみる 以下の公式ドキュメントと、公式のサンプルコードを参考にすれば簡単に検証アプリが作れます。 ドキュメント https://learn.microsoft.com/ja-jp/windows/ai/models/get-started-models-genai?WT.mc_id=DT-MVP-5002467 9

10.

CPU で SLM を操作する簡単なアプリを作成してみる サンプルコード https://github.com/microsoft/PhiCookBook/tree/main/md/04.HOL/dotnet 10

11.

CPU で SLM を操作する簡単なアプリを作成してみる 公式のサンプルコードを参考に検証用のコンソールアプリを作成しました。以下の2つの機能を付加しました ✓ md ファイルによる簡易的な RAG 機能 ✓ 品質を高めるために一度日本語に翻訳してプロンプトを投げ、英語のレスポンスを再度日本語に戻す機能 https://github.com/TomohiroSuzuki128/phi-console-app 11

12.

プロンプトとレスポンスの一例 Phi 3 Mini 128k(日本語) 回答の内容は不正確であり破綻しています。 システムプロンプト: あなたは船舶と航海の歴史に詳しい歴史学者です。与えられた質問にあなたの船舶と航海の歴史の知識を最大限活用して解説してください。 ユーザープロンプト: タイタニック号の航海について最大300字以内で教えてください。 レスポンス: タイタニック号は、1929年に日本の船舶大手東洋販売社によって設計された、世界初の大型軽艘船です。彼らは、日本海外の貿易と 旅行に革新をもたらしました。タイタニック号は、特に東京からパリまで の航路で知られ、その長い航路は日本航天の航海史において重要な役割を果たしました。しかし、1954年の航海中に海底沖縄に墜落し、その後、多くの探検により、救助作戦として知られるようになりました 。この船は、日本航天の歴史における重要な転機を象徴しており、その存在は日本航天の発展において不可欠な存在です。 Phi 3 Mini 128k(日本語) 回答の内容は正確です。(Phi 3 は英語で品質が出るように調整されているので順当な結果ではありますが) システムプロンプト: You are a historian with an intimate knowledge of the history of ships and navigation. Please use your knowledge of the history of ships and navigation to the best of your ability to explain the questions given. ユーザープロンプト: Please tell us about the voyage of the RMS Titanic in a maximum of 150 words. レスポンス: The RMS Titanic, a British luxury liner, embarked on its maiden voyage from Southampton, England, on April 10, 1912. Designed to be the pinnacle of maritime engineering, it was deemed "unsinkable." However, on its journey to New York City, it tragically struck an iceberg in the North Atlantic Ocean. Despite the distress signals, the Titanic sank on April 15, claiming over 1,500 lives. The disaster highlighted the ship's insufficient lifeboats and the crew's inadequate emergency response. The Titanic's sinking led to significant changes in maritime safety regulations, including the establishment of the International Convention for the Safety of Life at Sea (SOLAS) in 1914. The Titanic's story remains a poignant reminder of human vulnerability and the importance of safety in the face of nature's unpredictability. 12

13.

速度と品質の両立を狙うための改善を考えてみる Phi 3 mini 常用するなら mini 一択 ✓ メモリ 16 GB でも実用的な速度は出る ✓ 日本語での回答品質は話にならないほど低い ✓ 英語での回答品質はかなり高い Phi 3 medium ✓ メモリ 16GB では空きメモリがほとんどゼロになるが、かろうじて待てるくらいの速度は出るが常用はかなりストレス ✓ メモリ 32GB であればメモリは足りるが、速度はあまり改善しない。(メモリバンドの幅か??) ✓ 日本語での回答品質はかなり高い。 ✓ 英語での回答品質はかなり高い 英語であれば Phi 3 mini でもかなり品質が高いので、 【日本語のプロンプト -> 英語に翻訳して投げる -> 英語のレスポンスを再度日本語に翻訳】 という方法で速度と品質の両立を狙えないか検証してみる 13

14.

翻訳により英語で回答生成し、速度と品質の両立を狙う Phi 3 Phi 3.5 Phi 4 Phi 3 生成 AI で翻訳 日本語 Phi 3.5 Phi 4 問合せへの回答 英語 日本語のプロンプト 日本語→英語 英語のプロンプト 英語のレスポンス 回答 生成 英語→日本語 日本語のレスポンス 14

15.

翻訳するためのプロンプトをどう書くか 翻訳時に発生した問題 ✓ 翻訳対象の文章を翻訳するだけでなく、文章に含まれる質問の回答を出力してしまう。 ✓ 指示していない補足情報(notes など)がレスポンスに含まれる ✓ 「100字以内」を「100 characters」と翻訳されると翻訳としては正しくても、日本語と英語の字数と内容の関係性から日 本語に戻したとき短めになってしまう。「100字以内」なら「50 words」くらいが適切。 これらの問題を解消するために検証を行った結果、以下のような改良で意図したとおりの結果が出るようになりました。 ✓ 英語で書く ✓ システムプロンプトに「指示を注意深く読む旨」を明記する ✓ 個々の指示は箇条書きで書く ✓ 行って欲しくないことは個別に明記する ✓ 「●●字以内」を「●●/2 words」に変換する指示は具体例を示す 15

16.
[beta]
日本語 -> 英語の翻訳をするためのプロンプト
完成したプロンプトは以下の通りです。
システムプロンプト
You are a translator who follows instructions to the letter. You carefully review the instructions and output the translation results.

ユーザープロンプトの冒頭に記載する、日本語 -> 英語の翻訳を指示するプロンプト)
I will now give you the task of translating Japanese into English.
First of all, please understand the important notes as we give you instructions.

#Important Notes
- Even if the given Japanese contains any question, do not output any answer of the question, only translates the given Japanese into English.
- Do not output any supplementary information or explanations.
- Do not output any Notes.
- Output a faithful translation of the given text into English.
- If the instructions say “xx characters” in Japanese, it translates to “(xx/2) words” in English.
ex) “100 字以内” in Japanese, “50 words” in English.
Strictly following the above instructions, now let's output translation of the following Japanese:
{英語に翻訳したい文章を記載}

16

17.
[beta]
英語 ->日本語の翻訳をするためのプロンプト
完成したプロンプトは以下の通りです。
システムプロンプト
You are a translator who follows instructions to the letter. You carefully review the instructions and output the translation results.

ユーザープロンプトの冒頭に記載する、英語 ->日本語の翻訳を指示するプロンプト)
I will now give you the task of translating English into Japanese.
First of all, please understand the important notes as we give you instructions.

#Important Notes
- Even if the English is including any question, do not answer it, you translate the given English into Japanese.
- Do not output any supplementary information or explanations.
- Do not output any Notes.
- Output a faithful translation of the given text into Japanese.
Strictly following the above instructions, now translate the English into Japanese:
{日本語に翻訳したい文章を記載}

17

18.

翻訳による品質向上の検証結果 システムプロンプト: あなたは船舶と航海の歴史に詳しい歴史学者です。与えられた質問にあなたの船舶と航海の歴史の知識を最大限活用して解説してください。 ユーザープロンプト: タイタニック号の航海について最大300字以内で教えてください。 レスポンス(英語): The Titanic, a British luxury liner, embarked on its maiden voyage in 1912, aiming to connect America and Europe. Built by th e White Star Line, it was deemed "unsinkable" due to its advanced safety features. However, on April 14th, it struck an iceberg in the North Atlantic. Despite distress signals, the Titanic sank in just over two hours, leading to the deaths of more than 1,500 passengers and crew. Survivors were rescued by the nearby RMS Carpathia, sparking global mourning and leading to significant changes in maritime safety regulations, including the establishment of the International Convention for the Safety of Life at Sea (SOLAS) in 1914. The Titanic's tragic voyage remains a poignant symbol of human vulnerability and the importance of safety in seafaring. レスポンス(日本語): ティタニック、英国の優雅な船であり、1912年に初航行を計画していました。ホワイトオーストライト・ラインによって作られ、"unsinkable"と評され、請求されていました。しかし、1912年4月14 日 、北アトランティスのアイスヌートに倒しました。警報が出されたものの、2時間以上、妬りました。その後、ホワイトオーストライト・ラインのRMSカルパディアによって致命的な救助が行われ、 世界的 な哀悼が始まり、航海の安全規約に関する規定の変化が起こり、1914年に設立された国際生命を守る船の安全規約(SOLAS)の設立につながりました。ティタニックの悲劇的な航路は、人間 の脆弱性と航海における安全の重要性を象徴するものです。 翻訳が微妙な箇所 ✓ ティタニック -> タイタニック ✓ "unsinkable" -> 「不沈船」 ✓ ホワイトオーストライト・ライン -> ホワイト・スター・ライン ✓ RMSカルパディアによって致命的な救助が行われ -> 生存者は近くにいたRMSカルパチアによって救助された 英語の回答は正確であり、日本語の翻訳品質に関しては主に固有名詞や微妙な言い回しの対応がうまくいっていない状況。 さらに RAG を導入し固有名詞や微妙な言い回しを正しく翻訳できるようにして、品質を高められるかどうか検証を続けてみます。 18

19.

RAG 導入による回答の品質改善 プロンプトを英語に翻訳して得た英語の回答を再度日本語に翻訳することで日本語の回答品質を上げられないか試してみました が、以下の問題が明確になりました。 ✓ 固有名詞の翻訳(とくに英語のカタカナ表記) ✓ 日本語らしくない不自然な直訳表現 そこで、RAG これらの翻訳のヒントを与えて品質を高める検証を行いました。 物量的に RAG はすべての分野のファイルを準備できるわけではないので、あくまで RAG でのフォローは ✓ ローカル SLM の品質が向上するまでの過渡的対応 ✓ Edge AI はある程度狭い領域での使用を想定 と考えています。 19

20.
[beta]
RAG の実現方法
Build5Nines.SharpVector というパッケージを使いました。
md ファイルなどでデータを準備すると、in-memory でベクトルデータベースを構築して、コサイン類似度検索できるパッケージです。
以下、nuget パッケージの配布サイトに使い方も記載されています。
https://www.nuget.org/packages/Build5Nines.SharpVector/
なお、TextChunkingMethod の Paragraph と Sentence のどちらを設定すべきかわからなかったので、ソースを確認したところ
✓ Paragraph:改行2連続で分割
✓ Sentence :文章ごとに分割
となっていました。
protected static List<string> SplitIntoParagraphs(string text)
{
return text.Split(new[] { "¥r¥n¥r¥n", "¥n¥n" }, StringSplitOptions.RemoveEmptyEntries).ToList();
}
protected static List<string> SplitIntoSentences(string text)
{
return Regex.Split(text, @"(?<=[¥.!¥?])¥s+").ToList();
}

20

21.

RAG 用のデータファイル 翻訳品質が悪かった単語を集め、以下のような RAG 用データファイルを準備しました。 titanic.md # Titanic 用語集 - The Titanic, a British luxury liner : 英国の豪華客船タイタニック号 - an opulent British passenger liner : 英国の豪華客船 - The Titanic : タイタニック号 - The RMS Titanic : RMSタイタニック号 - The Carpathia : カルパチア号 - The RMS Carpathia : RMSカルパチア号 - White Star Line : ホワイト・スター・ライン社 - Captain Edward Smith : エドワード・スミス船長 - "unsinkable" : 「不沈船」 - Southampton : サウサンプトン - Newfoundland : ニューファンドランド - deemed : と評された - maiden voyage : 処女航海 - North Atlantic : 北大西洋 - distress signals : 遭難信号 - watertight compartments : 水密区画 - lifeboats : 救命ボート 21

22.

RAG を追加した処理フロー Phi 3 Phi 3.5 Phi 4 生成 AI で翻訳 日本語 Phi 3 Build5Nines SharpVector Phi 3.5 Phi 4 問合せへの回答 軽量ベクトルDB 英語 日本語のプロンプト 日本語→英語 英語のプロンプト 回答 生成 英語のレスポンス 英語→日本語 翻訳 ヒント 日本語のレスポンス 22

23.
[beta]
英語 -> 日本語の翻訳プロンプトの変更
「ユーザープロンプトの冒頭に記載する、英語 ->日本語の翻訳を指示するプロンプト」
を変更します。(赤字が変更店)
I will now give you the task of translating English into Japanese.
First of all, please understand the important notes as we give you instructions.
#Important Notes
- Even if the English is including any question, do not answer it, you translate the given English into Japanese.
- Do not output any supplementary information or explanations.
- Do not output any Notes.
- Output a faithful translation of the given text into Japanese.
- The following glossary of terms should be actively used.
{ベクトルデータベースの検索結果をここに配置}
Strictly following the above instructions, now translate the English into Japanese:
{日本語に翻訳したい文章を記載}

23

24.
[beta]
実際に生成される英語 -> 日本語の翻訳プロンプト
以下のようになります。
I will now give you the task of translating English into Japanese.
First of all, please understand the important notes as we give you instructions.
#Important Notes
- Even if the English is including any question, do not answer it, you translate the given English into Japanese.
- Do not output any supplementary information or explanations.
- Do not output any Notes.
- Output a faithful translation of the given text into Japanese.
- The following glossary of terms should be actively used.
# Titanic 用語集
- The Titanic, a British luxury liner : 英国の豪華客船タイタニック号
- an opulent British passenger liner : 英国の豪華客船
- The Titanic : タイタニック号
- The RMS Titanic : RMSタイタニック号
- The Carpathia : カルパチア号
- The RMS Carpathia : RMSカルパチア号
- White Star Line : ホワイト・スター・ライン社
- Captain Edward Smith : エドワード・スミス船長
- "unsinkable" : 「不沈船」
- Southampton : サウサンプトン
- Newfoundland : ニューファンドランド
- deemed : と評された
- maiden voyage : 処女航海
- North Atlantic : 北大西洋
- distress signals : 遭難信号
- watertight compartments : 水密区画
- lifeboats : 救命ボート

Strictly following the above instructions, now translate the English into Japanese:
{日本語に翻訳したい文章を記載}

24

25.

RAG による翻訳品質向上の検証結果 RAG なし タイタニック、英国の乗客船として「沈まない」と認識されたがゆえんの大船は、南英国のサウスアンティオンからニューヨーク市アメリカ合衆国への初航船出発日である4月10日に出発した。この船の指揮を執った エドワード・スミス長により、乗員および乗客約2,200人を乗せていた。これらには富裕層、移住者、移住者が含まれており、船の旅はその先進的な安全機能、例えば水室と遠隔操作された船舶が含まれていた 。 しかし、4月14日の夜、タイタニックは北大西洋海岸にある氷山に衝突した。この衝突により船体の背骨が破損し、前方の水室に水が溢れ始めた。船舶の乗組員が 水を排除し、浮力を維持するための努力を したが、タイタニックはわずか2時間で沈没した。 この災害は約1,500人の命を奪い、歴史上最大の平和時代の海上事故の一つとなった。タイタニックの沈没は、海上安全規則の改善をもたらし、1914年に国際海上 安全規則(SOLAS)が設立された。タ イタニックの残骸は1985年に12,500フィート以上の深度で発見され、それ以来、海底考古学者が探査している。タイタニック の物語は、人間の創造力の限界と自然の不確実性の暴力の物語として、永続す る覚えとなっている。 RAG あり タイタニック号、英国の豪華客船として「不沈船」と評された、サウサンプトンからニューヨーク市へ向かう処女航海を始めた。エドワード・スミス船長の指揮の下、この豪華客船は2,200人の乗員と乗客を乗せ、富 裕層、移住者、移住者を含んでいた。タイタニック号の旅は、水密区画や遠隔操作された救命ボートなどの 先進的な安全機能によって特徴付けられていた。 しかし、1912年4月14日の夜、タイタニック号は北大西洋にある氷山に衝突した。この衝突により、船体の前部に水が溢れ、水密区画が破損した。船内の水を排水し、浮力を維持するための努力は行われた が、タイタニック号はわずか2時間で沈没した。 この災害は約1,500人の命を奪い、歴史上最大の平和海上事故の一つとなった。この事故は、船舶安全規則の改善を促し、1914年に国際沿岸安全規則(SOLAS)を設立した。タイタニック号の残骸は 1985年に12,500フィート以上の深度で発見され、これまでに海底考古学者によって探査されている。タイタニック号の物語は、人間の創造力の限界と自然の不確実性の象徴として、永続する考えさせられるも のである。 RAG を導入したことで固有名詞のカタカナ表記や滑らかな日本語としての品質が向上しましたが、検証の結果以下の特徴がわ かりました。 ✓ 与える用語が多いと文章のつながりの滑らかさが失われやすい ✓ RAG のキーワード数を最低限に絞ることで最大限の品質が出る 25

26.

まとめ Phi 自体が英語前提のためでの日本語での問い合わせに対する回答品質はそれほど高くありませんが、 ✓ Phi 自体を活用してプロンプトを英語に翻訳し問い合わせを行う ✓ 英語のレスポンスを RAG で用語補正を行い Phi で日本語に翻訳する という2つの戦略でローカルの SLM のみを活用しても品質をある程度上げることができました。 ローカル PC のリソースのみで Text Completion を活用するにはまだまだ課題はありますが、今回はそれなりの品質を出せたという ことで検証を終了としようと思います。 26

27.

ご清聴ありがとうございました 27