Windows AI Foundry Localに複数行のプロンプトを渡す方法（プレビュー版向けにむりやり）

# 概要

少し前のMicrosoft Build 2025で、Windows AI Foundry Localが発表されたので、プレビューですがさっそく使ってみました。

ローカルのLLMモデルで、コマンドプロンプトでめっちゃ簡単にチャットが始められる！すごい！

なのですが、コマンドプロンプトで改行すると入力が終わってしまうので、複数行のプロンプトを送れません。これは不便だな・・・と思って色々と工夫したら、上手く行ったようです。その方法の紹介です。

# 最初に結論まとめ

プロンプトの改行コード（ `'\r''\n'` ）を全て文字`”\n”`に置換して、全体を1行で送ればOKです。（`1行目\n2行目`のような感じ）

単に改行を削除して1行にするとやはりMarkdown等の構造が認識できなくなるようですが、文字"\n"に変えれば改行（少なくとも何らかの区切り文字）と認識してくれるようです。

# 説明

## まず、Foundry Localというのは？

PCのローカルで使えるLLMモデルを探し、ONNXファイルをDLし、それを読み込んでチャットプロンプトを開始。この作業はそんなに難しいわけではないですが、かなりプログラマ寄りの作業なので、誰でも気軽にとは行きません。

この一連の作業を、Windows上でコマンドでシームレスに実現できる機能が今回のBuildでMicrosoftから発表されました。それがFoundry Localです。

## 1行チャットの例

ざっくり言うと、次の手順でさくっとLLMとのチャットができます。

1. インストール
2. コマンドプロンプトを開く
3. `foundry model list` で使えるモデルを一覧し、希望のものを探す
4. `foundry run ＜モデル名＞ run` でチャット開始

例を見せると、こんな感じです。まずリストを表示して

```
>foundry model list
Alias                          Device     Task               File Size    License      Model ID
-----------------------------------------------------------------------------------------------
phi-4                          GPU        chat-completion    8.37 GB      MIT          Phi-4-cuda-gpu
                               GPU        chat-completion    8.37 GB      MIT          Phi-4-generic-gpu
                               CPU        chat-completion    10.16 GB     MIT          Phi-4-generic-cpu
--------------------------------------------------------------------------------------------------------
（以下略）
```

適当なモデルを1つ選択して、起動してみます。自動でダウンロードされて、チャットが始まります。

```
>foundry model run Phi-3-mini-4k-instruct-cuda-gpu
Downloading Phi-3-mini-4k-instruct-cuda-gpu...
[####################################] 100.00 % [Time remaining: about 0s]        42.8 MB/s
🕘 Loading model...
🟢 Model Phi-3-mini-4k-instruct-cuda-gpu loaded successfully

Interactive Chat. Enter /? or /help for help.

Interactive mode, please enter your prompt
>
```

チャットを送信すると、こんな感じで応答が返ってきます。

```
> あなたのLLMとしてのモデル名は何ですか？
🤖  私のモデルの名称はMicrosoftのGPT-3です。GPT-3は、大規模な言語モデルの一つで、多様なタスクに対応しています。
```

実に手軽で良いですね。

## 複数行のプロンプトが上手く行かなかった例

この例のように1行で会話する分には良いのですが、複数行を渡そうとすると上手く行きません。

次の内容をペーストすると

```
次のMarkdownから、見出し1のタイトルだけを取り出して回答してください。

# まず最初に

これは記事を書くためのテスト用のMarkdownです。
```

こうなります。

```
> 次のMarkdownから、見出し1のタイトルだけを取り出して回答してください。
🤖  # 見出し1のタイトル
>
Prompt cannot be empty
An unexpected error occurred.
Exception: Index was outside the bounds of the array.

C:\Users\xxxxx># まず最初に
'#' is not recognized as an internal or external command,
operable program or batch file.

C:\Users\xxxxx>
C:\Users\xxxxx>これは記事を書くためのテスト用のMarkdownです。
```

まあ、コマンドプロンプトなので、改行で送信されてしまうのは当然ではあります。

ではどうすれば良いか。コマンドは1行にした上でまとまったテキストを渡すなら、テキストファイルを渡せば良さそうに感じますが・・・テキストファイルを渡すようなオプションは特に無さそうです。

次のようにリダイレクトで渡してみても、やはり改行でいったん切れて回答が始まってしまっているようです。

```
foundry model run Phi-3-mini-4k-instruct-cuda-gpu < "C:\test\test.txt"
```

```
Model Phi-3-mini-4k-instruct-cuda-gpu was found in the local cache.

Interactive Chat. Enter /? or /help for help.

Interactive mode, please enter your prompt
> 🤖  # 見出し1のタイトル
> Prompt cannot be empty
An unexpected error occurred.
Exception: Index was outside the bounds of the array.

```

では改行を削除して1行にしたらどうなるかというと・・・

```
次のMarkdownから、見出し1のタイトルだけを取り出して回答してください。# まず最初にこれは記事を書くためのテスト用のMarkdownです。
```

```
Model Phi-3-mini-4k-instruct-cuda-gpu was found in the local cache.

Interactive Chat. Enter /? or /help for help.

Interactive mode, please enter your prompt
> 🤖  # まず最初にこれは記事を書くためのテスト用のMarkdown
>

```

Markdownの見出し行とその次の行を一繋がりで認識してしまっています。・・・まあ、それはそうですよね。この情報では、人間が見ても分かりません。


## 複数行のプロンプトを上手く渡せた方法

テキストをリダイレクトで渡すのは前回と同じですが、テキストファイルの中の改行コードを、"\n"という文字に置換してから渡します。次のような内容がテキストファイルに保存されています。

```
次のMarkdownから、見出し1のタイトルだけを取り出して回答してください。\n\n# まず最初に\n\nこれは記事を書くためのテスト用のMarkdownです。
```

この状態で、リダイレクトでファイルを渡してみると・・・

```
foundry model run Phi-3-mini-4k-instruct-cuda-gpu < "C:\test\test.txt"
```

```
Model Phi-3-mini-4k-instruct-cuda-gpu was found in the local cache.

Interactive Chat. Enter /? or /help for help.

Interactive mode, please enter your prompt
> 🤖  # まず最初に
>
```

ちゃんと改行も含めてMarkdownを理解できているようです。まあ、本当に改行だと認識しているかどうかは謎なのですが、少なくともMarkdownの文法の区切り文字として捉えてくれているようなので、狙った効果としては成功です！

# まとめ

Windows AI Foundry Localをさっそく使ってみたところ、とても手軽で便利に感じましたが、ぱっと見だと1行チャットしか出来そうにありません。

複数行のプロンプトを渡せるような小細工をして、とりあえず動作する方法が見つかりました。まだ出たばかりの機能なので、複数行のプロンプトを渡せるようなアップデートもすぐに入る気がしますが・・・とりあえず今すぐ使うには有効なハックのようなので紹介しました。