1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

macOS 27 の `fm` コマンドを使ってみた。ターミナルからオンデバイスLLMで文章やファイルを要約する

1
Posted at

はじめに

macOS 27 Golden Gate から、Apple Intelligence の基盤モデル(Foundation Models)をターミナルから直接利用できる fm コマンドが使えるようになりました。

デフォルトではオンデバイスのモデルが使われるため、APIキーやクラウドAPIの利用料金は必要なく、オンデバイスモデルへの推論もMac上で完結します。

とりあえず触ってみて、「文章やファイルを要約させる」ところまでやってみたので、使い方と気になった制約をまとめます。

環境

M4 Mac / macOS 27.0

fm とは

Foundation Models フレームワークの CLI です。fm --help で出てくるサブコマンドは次の 7つです。

サブコマンド --help の説明 補足
available Check model availability モデルが使えるか確認する
chat Start an interactive chat session 対話セッション
count-tokens Count tokens in a prompt or instructions プロンプトや指示のトークン数をカウントする
license Show and agree to the Legal Notice & Terms 初回に sudo 付きで 1回同意する
respond Generate a response to a prompt 1回投げて応答を得る。今回の主役
schema Generate a structured output generation schema --schema で渡す構造化出力用の JSON スキーマを作る
serve Start a Chat Completions API server OpenAI 互換のローカル HTTP サーバー

モデルは既定で system(オンデバイスの Apple Foundation Model)が選択されます。

コマンド例
fm respond 'What is Swift?'
fm respond --stream 'Summarize this article'
fm chat --instructions 'You are a coding assistant'
fm count-tokens 'Hello world'
fm schema object --name Person --string name --int age

モデルは約30億パラメータで、Appleは要約・抽出・分類などを得意な用途として挙げています。一方、world knowledgeや高度な推論を目的としたモデルではないと説明されています。

初回セットアップ

はじめに利用規約を確認し同意する必要があります。

sudo fm license
fm available
出力結果
System model available

まず一言投げてみる

fm respond 'chmod コマンドを3文で説明して'
出力結果
chmod コマンドは、ファイルやディレクトリの権限を変更するために使用されます。
ユーザーが読み取り、書き込み、実行の権限を設定できます。
権限を変更することで、ファイルのアクセス許可を制御できます。

短い質問であれば数秒で答えが返ってきます。

文章を要約させる

指示は --instructions で渡し、要約したい本文は stdin で流します。

echo 'ここに要約したい文章を書く' |
  fm respond --instructions '入力を日本語で3行の箇条書きに要約して'

ファイルを要約させる

ファイルなら cat で内容を stdin に流すだけです。

cat README.md | fm respond --instructions '入力の README を読んで、このツールが何をするものか日本語で3行にまとめて'

複数ファイルをまとめて要約するならループで回せます。

for f in docs/*.md; do
  echo "## $f"
  fm respond --instructions '入力を日本語で2行に要約して' < "$f"
  echo
done > summary.md

気になった制約

プロンプトを引数で渡すと stdin が読まれない

手元の環境で試したところ、この形では stdin の本文は使われず、引数の文字列だけがプロンプトとして扱われました。

cat article.md | fm respond '要約して' # NG

本文をstdinで流すときは、指示を --instructions に置きます。
「--instructions がモデルへの指示、stdin が処理対象の本文」のように覚えると分かりやすいです。

cat article.md | fm respond --instructions '入力を要約して' # OK

コンテキストは 4096トークン

Apple の技術ノート TN3193 によると、オンデバイスモデルのコンテキストウィンドウは、1セッションあたり4096トークンです。指示やプロンプトだけでなく、生成される応答もコンテキストウィンドウを消費します。日本語はおおむね 1文字 1トークンです。

長めの記事を丸ごと投げると、次のように落ちます。

fm count-tokens "$(cat long_article.md)" # 長い記事
出力結果
Token count: 25972
cat long_article.md | fm respond --instructions '3行で要約して'
出力結果
Error: The session's transcript exceeded the model's context size.

長文に対して本格的に使うなら本文を分割して部分要約し、それをまとめ直す工夫が必要です。

まとめ

  • オンデバイスモデルを使えば、ターミナルから文章やファイルを無料・オフラインで要約できる
  • 本文は stdin、指示は --instructions。プロンプトを引数にすると stdin は使われない
  • コンテキストウィンドウが4096トークンなので、長文をそのまま処理する場合は分割などの工夫が必要
1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?