simonw/llm: コマンドラインから生成AIモデルを気軽に実行できるツールがとても便利

simonw/llm: コマンドラインから生成AIモデルを気軽に実行できるツールがとても便利

Clock Icon2025.04.23

最近は Claude Code に入門 したりしていましたが、 「もう少し気軽にコマンドラインに組み込めるものが無いかなあ…」 と 感じていました。 ワークスペースに依存せず、ワンショットで、 サクッと生成AIを呼び出したいことも多いのです。

そんなときに Simon Willison 氏が開発された llm というツールを発見して、 「まさに求めていたものだ!」となりました。

本ブログにて simonw/llm を紹介し、 いくつか機能を触ってみます。

simonw/llm

https://github.com/simonw/llm

このツールはコマンドラインから大規模言語モデルを操作するための CLIユーティリティおよびPythonライブラリです。 OpenAIのようなリモートAPIだけでなく、 ローカルマシンにインストールして実行できるモデルにも対応しています。 プロンプトの実行、結果のSQLiteへの保存、埋め込みの生成など、 多様な機能を提供しています。

インストールする

Quick start どおりに進めます。 今回は macOSにて、brew を使ってインストールしました。

brew install llm

llm --version
# llm, version 0.24.2

OpenAI APIキーを事前にセットしておきます。

export OPENAI_API_KEY="sk-proj-example"

さっそく利用できるか確認してみましょう。

llm "hello"
# Hello! How can I assist you today?

いろいろ触ってみる

気になる機能をいくつか触ってみました。

インタラクティブなチャット

llm chat でインタラクティブに対話できます。

llm chat で対話開始。quit で終了
$ llm chat
Chatting with gpt-4o-mini
Type 'exit' or 'quit' to exit
Type '!multi' to enter multiple lines, then '!end' to finish
> ダジャレを1つ頂戴
もちろんです!「お寿司屋さんに行ったら、シャリが足りなくてシャリなかった!」どうですか?
> もう1つ
もちろん!「電車に乗ったら、隣に座った人がデンシャに見えた!」どうでしょう?
> quit

ログ記録

デフォルトでプロンプトとその応答が SQLite データベースに 保存されます。 ログ記録をOFFにするには llm logs off を実行します。

### ログ記録状況の確認
llm logs status
# Logging is ON for all prompts
# Found log database at /Users/kawahara.masahiro/Library/Application Support/io.datasette.llm/logs.db
# Number of conversations logged:   21
# Number of responses logged:   23
# Database file size:       244.00KB

### ログ記録をOFFにする
llm logs off

ストリーミング無効化

デフォルトではストリーミングが有効化になっており、 生成された文字が順番に出力されます。 無効化するには --no-stream オプションを付与します。

モデルの選択と追加

llm models で利用できるモデル一覧が確認できます。 デフォルトは gpt-4o-mini になっています。

llm models
# OpenAI Chat: gpt-4o (aliases: 4o)
# OpenAI Chat: chatgpt-4o-latest (aliases: chatgpt-4o)
# OpenAI Chat: gpt-4o-mini (aliases: 4o-mini)
# OpenAI Chat: gpt-4o-audio-preview
# OpenAI Chat: gpt-4o-audio-preview-2024-12-17
# OpenAI Chat: gpt-4o-audio-preview-2024-10-01
# OpenAI Chat: gpt-4o-mini-audio-preview
# OpenAI Chat: gpt-4o-mini-audio-preview-2024-12-17
# OpenAI Chat: gpt-3.5-turbo (aliases: 3.5, chatgpt)
# OpenAI Chat: gpt-3.5-turbo-16k (aliases: chatgpt-16k, 3.5-16k)
# OpenAI Chat: gpt-4 (aliases: 4, gpt4)
# OpenAI Chat: gpt-4-32k (aliases: 4-32k)
# OpenAI Chat: gpt-4-1106-preview
# OpenAI Chat: gpt-4-0125-preview
# OpenAI Chat: gpt-4-turbo-2024-04-09
# OpenAI Chat: gpt-4-turbo (aliases: gpt-4-turbo-preview, 4-turbo, 4t)
# OpenAI Chat: gpt-4.5-preview-2025-02-27
# OpenAI Chat: gpt-4.5-preview (aliases: gpt-4.5)
# OpenAI Chat: o1
# OpenAI Chat: o1-2024-12-17
# OpenAI Chat: o1-preview
# OpenAI Chat: o1-mini
# OpenAI Chat: o3-mini
# OpenAI Completion: gpt-3.5-turbo-instruct (aliases: 3.5-instruct, chatgpt-instruct)
# Default: gpt-4o-mini

モデルを切り替えるには -m(もしくは --model) オプションを指定します。

llm "こんにちわ" --model o3-mini
# こんにちは!今日はどのようなお手伝いをしましょうか?

デフォルトモデルは llm models default xxx で変えられます。

llm models default
# gpt-4o-mini

llm models default o3-mini
llm models default
# o3-mini

また、プラグインをインストールすることで、 他のモデルを新規に追加できます。 以下技術記事にBedrockの追加例があります。

https://zenn.dev/watany/articles/fb6cbc6d13b1a0

標準入力との連携

標準入力をプロンプトとして送信できます。これが便利。

echo "こんにちわ" | llm
# こんにちは!今日はどんなことをお話ししましょうか?

標準入力と引数の両方を付与した場合、 パイプされたコンテンツの後に引数の内容が付与されます。

cat query/daily-aws-cost.sql | llm 'このSQLを一言で説明して'
# AWSの利用コストを日別に集計し、各日のコストを表示するクエリです。

マルチモーダル

マルチモーダルが対応しているモデルにて、 テキスト以外を入力にできます。 -a オプションで付与できます。

llm "この画像からテキストを抽出して" -a https://classmethod.jp/wp-content/uploads/2023/01/renewal-logo.png
# 画像から抽出したテキストは以下の通りです。
#
# **classmethod**

llm "この犬かわいい?" -a dog.png
# かわいい犬ですね!毛の感じや表情がとても愛らしいです。犬はいつも癒しの存在です。

システムプロンプト

システムプロンプト(-s/--system)を記載できます。

cat query/daily-aws-cost.sql | llm -s 'このSQLを一言で説明して'
# このSQLクエリは、AWSの利用コストを日別に集計し、各日の合計コストを計算するためのものです。

システムプロンプトはテンプレートとして保存できます。

llm -s "日本語で要約して" --save summary-ja

cat README.md | llm -t summary-ja
# LLMは、リモートAPIや自分のマシン上で実行できるモデルを通じて、大規模言語モデル(LLM)と対話するためのCLIユーティリティおよびPythonライブラリです。...略...

llm -s "日本語で3行リストまとめして" --save matome

curl -s https://dev.classmethod.jp/articles/opt-out-aws-control-tower-cloudtrail/ \
| pandoc --from html --to gfm \
| llm -t matome
# 1. **CloudTrailのオプトアウト**: AWS Control TowerにおけるCloudTrailログ出力をオプトアウトすることで、CloudWatch Logsのコストを削減できる。
# 2. **S3とCloudWatch Logsのコスト**: S3出力は転送コストと保存料金がかかるが、CloudWatch Logsのコストはロググループの取り込み料金が大部分を占め、約10倍のコストが発生することがある。
# 3. **手順と考慮事項**: カスタムCloudTrail証跡を作成し、一定期間待機した後にCT管理CloudTrailをオプトアウトする手順を踏む必要があり、移行によるコストやGuardDutyの通知についても注意が必要。

登録したテンプレートは llm templates で確認可能です。

llm templates
# summary-ja : system: 日本語で要約して

よく使う依頼をテンプレートにしておくと捗りそうです。

スキーマ

構造化された出力(JSON)を生成したいときに役立ちます。

llm --schema 'name, age int, one_sentence_bio' \
    'invent a cool dog' \
| jq
# {
#   "name": "Spark",
#   "age": 3,
#   "one_sentence_bio": "Spark is a playful, intelligent mixed breed with a shimmering coat that reflects light like a prism, making him a vibrant companion and a beacon of joy on every adventure."
# }

### 複数アイテムも出せる
llm --schema-multi 'name, age int, one_sentence_bio' \
    'invent 3 really cool dogs' \
| jq
# {
#   "items": [
#     {
#       "name": "Zephyr",
#       "age": 3,
#       "one_sentence_bio": "Zephyr is an agile, wind-loving Borzoi who competes in parkour competitions, using his long limbs to leap effortlessly over obstacles."
#     },
#     {
#       "name": "Pixel",
#       "age": 2,
#       "one_sentence_bio": "Pixel is a tech-savvy Dachshund who can fetch your phone and even help you program it with her unique ability to interact with apps."
#     },
#     {
#       "name": "Nova",
#       "age": 4,
#       "one_sentence_bio": "Nova is a stunning, blue-eyed Siberian Husky with a talent for dance, known for her captivating performances at local dog shows."
#     }
#   ]
# }

スキーマも同様に テンプレート化 可能です。

プラグイン

プラグインをインストールしてLLMを拡張できます。

試しに llm-jq を入れてみます。

### llm-jq のインストール
llm install llm-jq

### サンプル
aws lambda list-functions --output json \
| llm jq "関数名とランタイムをリストする"
# {
#   "FunctionName": "test-xxx",
#   "Runtime": "python3.13"
# }
# {
#   "FunctionName": "test-yyy",
#   "Runtime": "npdejs20.x"
# }
# .Functions[] | {FunctionName, Runtime}

プラグイン一覧は以下を参照ください。

https://llm.datasette.io/en/stable/plugins/directory.html

おわりに

simonw/llm を触ってみました。

自然にパイプライン処理で組み込めるのが素敵です。 「スクリプトやコマンド出力の解説/要約」や「マニュアルの日本語訳」 あたりで大活躍しそうです。 豊富なプラグインも魅力的ですね。

以上、参考になれば幸いです。

参考

https://github.com/simonw/llm

https://zenn.dev/watany/articles/fb6cbc6d13b1a0

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.