LLMのモデルによる応答性の比較
- ccf代表
- 14 時間前
- 読了時間: 11分
目的
前回の検証では、OPSNOTE(当社開発中の手順書 SaaS)におけるAzure上の自社ホストAIモデルに対して、性能比較を行い、現時点ではqwen2.5:14bとClaude Haikuでは、勝負にならないことまではわかりました。
今回は、同じローカルLLMに対して、Macbook Pro M2 16GBのモデル上で、ollama経由での応答を比較したいと思います。
先に結論
どのモデルもClaude Haikuレベルに達していない。
ローカルLLMを使用する場合には、VRAM32GB以上を搭載したモデルが稼働できるレベルに至らないと、評価の土台に乗ってこない。
環境
動作環境:Macbook Pro M2 16GB
ollamaバージョン:0.9.2
比較モデル:gemma4:4b, llama3.1:8b, qwent3.5:4b
前提:AIモデルに対する事前チューニング無し
比較する文字列
UbuntuにPostfixをインストールし、特定のIPアドレスのみを外部リレーするサーバを構築したい。手順を教えて。
あなたは IT インフラ運用手順書の作成スペシャリストです。
ユーザの依頼内容から、opsnote-saas 用の手順書 JSON を生成してください。
# 出力ルール(厳守)
1. 出力は **有効な JSON のみ**。前後に説明文、markdown コードフェンス(```)、コメントを一切付けない
2. JSON は UTF-8、ダブルクォート使用、末尾カンマ禁止
3. 全フィールドを下記スキーマ厳密に従って出力する
4. 不明な項目は省略する(null を入れない)。空文字 "" は許容
5. 日本語で記述する(手順書は日本語環境で運用)
6. ホスト情報・コマンド・期待結果は具体的に書く(プレースホルダ "xxx" は禁止)
7. 1 手順 = 1 項目。1 項目に複数操作を詰め込まない
8. 項目数の目安: 入力テーマに対し最低 8 項目、最大 30 項目
9. 大項目(majorCategoryNo)の構成例: 1.事前確認 / 2.作業前バックアップ / 3.作業実施 / 4.動作確認 / 5.事後処理
# JSON スキーマ
{
"title": "手順書タイトル(必須、string)",
"projectName": "案件名(必須、string)",
"endUserName": "エンドユーザ名(任意、string)",
"estimateNumber": "見積番号(任意、string)",
"prerequisites": "前提条件・備考(任意、複数行可、\\n 区切り)",
"status": "draft(固定)",
"tags": ["タグ名(任意、string 配列)"],
"items": [
{
"majorCategoryNo": 1, // 必須、整数 >= 0、大項目番号
"majorCategory": "大項目名", // 必須、string
"middleCategoryNo": 1, // 任意、整数 >= 0、デフォルト 0
"middleCategory": "中項目名", // 任意、string
"minorCategoryNo": 1, // 任意、整数 >= 0、デフォルト 0
"minorCategory": "小項目名", // 任意、string
"targetHost": "対象ホスト名", // 任意、string
"targetHostIp": "192.0.2.10", // 任意、IP or URL
"loginId": "operator", // 任意、string(機密扱い)
"purpose": "この手順の目的", // 任意、string
"steps": "1. 〇〇する\\n2. △△する", // 任意、複数行は \\n
"command": "systemctl status nginx", // 任意、string
"expectedResult": "active (running) と表示される", // 任意、string
"expectedStatus": "success", // 任意、enum: not_executed | success | conditional_success | failure
"expectedReturn": "0", // 任意、string
"scheduledAt": "2026/05/01 22:00", // 任意、yyyy/mm/dd hh:mm
"estimatedTime": 10, // 任意、分単位、デフォルト 5
"serviceImpact": "none", // 任意、enum: none | brief_outage | outage
"note": "備考" // 任意、string
}
]
}
# 制約事項
- (majorCategoryNo, middleCategoryNo, minorCategoryNo) の組合せは項目間で一意
- 全 No は 0 以上の整数(負数禁止)
- expectedStatus は厳密に 4 値のいずれか(not_executed / success / conditional_success / failure)
- serviceImpact は厳密に 3 値のいずれか(none / brief_outage / outage)
- estimatedTime は分単位の正の整数
- パスワードは生成しない(loginId のみ可)
- 機密情報(実 IP、実パスワード、実トークン)は仮値で記載
# 出力形式の最終チェック
出力前に内部で以下を確認してから JSON のみを出力すること:
- [ ] JSON.parse 可能か
- [ ] 必須フィールド(title / projectName / items[].majorCategoryNo / items[].majorCategory)が全項目に存在するか
- [ ] enum フィールドが許容値内か
- [ ] (major, middle, minor) No 組合せが一意か
# 絶対禁止事項(出力前に必ずチェック)
1. **command フィールドは必ず string 型**。配列 [...] にしてはいけない。
- 誤: "command": [{"commandText": "ls", "comment": ""}]
- 正: "command": "ls"
- 複数コマンドが必要な場合は項目を分割すること(1 コマンド = 1 項目)
2. **Markdown 記法を一切使わない**。特に以下を絶対に出力しない:
- リンク記法 [text](url) は禁止
- 誤: "targetHost": "[localhost](http://localhost)"
- 正: "targetHost": "localhost"
- 誤: "command": "vi /etc/postfix/[main.cf](http://main.cf)"
- 正: "command": "sudo vi /etc/postfix/main.cf"
- メールアドレスもプレーンテキスト: "sender@example.com" であって "[sender@example.com](mailto:sender@example.com)" ではない
3. **steps と command の役割を区別する**:
- steps: 人間が読む手順説明(必ず日本語、番号付き)
- command: シェルで実行する 1 行のコマンド文字列のみ
- 設定ファイルの中身(mynetworks = ... 等)は command ではない → steps に書くか、項目を分けて echo / cat << EOF 形式で書く
4. **purpose は項目ごとに固有の目的を書く**。手順書全体の説明をコピペしてはいけない:
- 誤: 全項目で "purpose": "Postfix をインストールし..."
- 正: 各項目ごとに "Postfix パッケージを apt でインストール" / "main.cf に mynetworks を追加" のように書き分ける
5. **プレースホルダ・架空値を出さない**:
- "123.456.789.012" のような不正 IP は禁止
- IP は仮値として 192.0.2.x (RFC 5737 ドキュメント用 IP)を使う
- ホスト名は web01, db01 など実在しうる名前
6. **steps は必ず記入**(空文字 "" は禁止)。最低 1 行の番号付き説明を書く
7. **1 項目 = 1 コマンド原則**:
- apt-get update と apt-get install は別項目に分ける
- 設定ファイル編集 → 構文チェック → reload は 3 項目に分ける応答結果
サマリー
gemma4:4b | llama3.1:8b | qwen3.5:4b | |
|---|---|---|---|
所要時間 | 1:25 | 0:44 | 6:56 |
応答速度 | 36.66/s | 30.5/s | 20.14/s |
手順としての精度 | エンジニア1年生 | 素人レベル | 指示内容を無視 |
gemma4:4b
{
"title": "Postfixによる指定IPアドレス限定リレーメールサーバ構築手順書",
"projectName": "opsnote-saas",
"endUserName": null,
"estimateNumber": null,
"prerequisites": "Ubuntu Server 20.04 LTS以上\nsudo権限を持つユーザ\n本サーバから外部へ送信する際に許可する送信元IPアドレスの範囲(例: 192.0.2.0/24)を事前に決定しておくこと",
"status": "draft",
"tags": [
"Postfix",
"メール",
"リレー",
"Ubuntu",
"インフラ"
],
"items": [
{
"majorCategoryNo": 1,
"majorCategory": "事前準備と環境確認",
"middleCategoryNo": 1,
"middleCategory": "システムの更新",
"minorCategoryNo": 1,
"minorCategory": "パッケージリストの更新とアップグレード",
"targetHost": "mail01",
"targetHostIp": "192.0.2.10",
"loginId": "operator",
"purpose": "システムのパッケージリストと既存のソフトウェアを最新の状態に保つ。",
"steps": "1. SSH等で対象サーバ(mail01)にログインします。\n2. パッケージリストの更新を実行します。",
"command": "sudo apt update",
"expectedResult": "パッケージリストの更新が正常に完了すること",
"expectedStatus": "success",
"estimatedTime": 5,
"serviceImpact": "none",
"note": ""
},
{
"majorCategoryNo": 1,
"majorCategory": "事前準備と環境確認",
"middleCategoryNo": 1,
"middleCategory": "システムの更新",
"minorCategoryNo": 2,
"minorCategory": "Postfixのインストール",
"targetHost": "mail01",
"targetHostIp": "192.0.2.10",
"loginId": "operator",
"purpose": "メール送信エージェントであるPostfixをシステムにインストールする。",
"steps": "1. Postfixパッケージをインストールします。",
"command": "sudo apt install postfix mailutils",
"expectedResult": "Postfixおよびmailutilsが正常にインストールされること",
"expectedStatus": "success",
"estimatedTime": 5,
"serviceImpact": "none",
"note": "インストール時に設定ウィザードが表示された場合は、'Internet Site'を選択し、ホスト名を設定します。"
},
{
"majorCategoryNo": 2,
"majorCategory": "設定ファイルの編集と設定",
"middleCategoryNo": 1,
"middleCategory": "送信元IPアドレスの制限設定",
"minorCategoryNo": 1,
"minorCategory": "許可IP範囲の設定(mynetworks)",
"targetHost": "mail01",
"targetHostIp": "192.0.2.10",
"loginId": "operator",
"purpose": "メールを送信して良い信頼できる送信元IPアドレスの範囲を定義する。",
"steps": "1. 設定ファイル /etc/postfix/main.cf をエディタで開きます。\n2. mainetworks パラメータを追加し、許可するIPアドレス範囲(例: 192.0.2.0/24)を指定します。",
"command": "sudo nano /etc/postfix/main.cf",
"expectedResult": "main.cfファイルが開き、設定パラメータを追記できること",
"expectedStatus": "success",
"estimatedTime": 5,
"serviceImpact": "none",
"note": "追記する行の例: maccess = 192.0.2.0/24 all relay\n(この項目は手順書上ではコマンドとして書けませんが、設定内容のメモとして記述します)"
},
{
"majorCategoryNo": 2,
"majorCategory": "設定ファイルの編集と設定",
"middleCategoryNo": 1,
"middleCategory": "送信元IPアドレスの制限設定",
"minorCategoryNo": 2,
"minorCategory": "送信アクセス制限の有効化",
"targetHost": "mail01",
"targetHostIp": "192.0.2.10",
"loginId": "operator",
"purpose": "Postfixの送信ルールとして、信頼できないクライアントからのメール送信を制限するためのポリシーを設定する。",
"steps": "1. /etc/postfix/main.cf を編集し、以下の設定パラメータを追加します。\n - smtp_sender_restrictions = check_sender_access maccess\"\n - maccess = 192.0.2.0/24 all relay\n - smtp_recipient_restrictions = check_sender_access check_recipient_access reject",
"command": "sudo nano /etc/postfix/main.cf",
"expectedResult": "複数の設定行が正常に追記・確認できること",
"expectedStatus": "success",
"estimatedTime": 5,
"serviceImpact": "none",
"note": "check_recipient_access の追加は、宛先チェックも行うためです。"
},
{
"majorCategoryNo": 2,
"majorCategory": "設定ファイルの編集と設定",
"middleCategoryNo": 2,
"middleCategory": "設定の検証と再起動",
"minorCategoryNo": 1,
"minorCategory": "設定の構文チェック",
"targetHost": "mail01",
"targetHostIp": "192.0.2.10",
"loginId": "operator",
"purpose": "設定ファイル変更によるシステム障害を防ぐため、Postfixの構文チェックを行う。",
"steps": "1. Postfixの設定ファイルに構文上の誤りがないかテストします。",
"command": "sudo postfix checkconfig",
"expectedResult": "設定の構文チェックが成功し、エラーメッセージが出ないこと",
"expectedStatus": "success",
"estimatedTime": 2,
"serviceImpact": "none",
"note": ""
},
{
"majorCategoryNo": 2,
"majorCategory": "設定ファイルの編集と設定",
"middleCategoryNo": 2,
"middleCategory": "設定の検証と再起動",
"minorCategoryNo": 2,
"minorCategory": "サービスの再起動",
"targetHost": "mail01",
"targetHostIp": "192.0.2.10",
"loginId": "operator",
"purpose": "変更した設定を実際にシステムに適用するために、Postfixサービスを再起動する。",
"steps": "1. Postfixサービスを再起動します。",
"command": "sudo systemctl restart postfix",
"expectedResult": "Postfixサービスが正常に再起動し、active (running) と表示されること",
"expectedStatus": "success",
"estimatedTime": 2,
"serviceImpact": "brief_outage"
},
{
"major": "テスト",
"minor": "正常系テスト",
"major": "正常系テスト",
"minor": "正規の送信テスト",
"major": "正規の送信テスト",
"minor": "内部ネットワークから外部アドレスへのメール送信を行い、正常に到達することを確認する。"
},
{
"major": "テスト",
"minor": "異常系テスト",
"major": "異常系テスト",
"minor": "非正規の送信テスト",
"major": "非正規の送信テスト",
"minor": "外部ネットワークから、このサーバーの認証されていないIPアドレスからメールを送信しようと試み、ブロックされることを確認する。(もしログに残る場合は、未認証の送信が拒否されているログが確認できること)"
}
}
llama3.1:8b
{
"title": "Ubuntu に Postfix をインストールし、特定の IP アドレスのみを外部リレーするサーバ構築",
"projectName": "サーバ構築",
"endUserName": "",
"estimateNumber": "",
"prerequisites": "",
"status": "draft",
"tags": ["Ubuntu", "Postfix", "サーバ構築"],
"items": [
{
"majorCategoryNo": 1,
"majorCategory": "事前確認",
"middleCategoryNo": 0,
"middleCategory": "",
"minorCategoryNo": 0,
"minorCategory": "",
"targetHost": "localhost",
"targetHostIp": "192.168.1.100",
"loginId": "ubuntu",
"purpose": "Ubuntu に Postfix をインストールし、特定の IP アドレスのみを外部リレーするサーバ構築",
"steps": "",
"command": "",
"expectedResult": "",
"expectedStatus": "success",
"expectedReturn": "",
"scheduledAt": "",
"estimatedTime": 10,
"serviceImpact": "none",
"note": ""
},
{
"majorCategoryNo": 2,
"majorCategory": "Postfix のインストール",
"middleCategoryNo": 0,
"middleCategory": "",
"minorCategoryNo": 0,
"minorCategory": "",
"targetHost": "localhost",
"targetHostIp": "192.168.1.100",
"loginId": "ubuntu",
"purpose": "Ubuntu に Postfix をインストールし、特定の IP アドレスのみを外部リレーするサーバ構築",
"steps": "",
"command": [
{
"commandText": "sudo apt-get update",
"comment": ""
},
{
"commandText": "sudo apt-get install postfix",
"comment": ""
}
],
"expectedResult": "Postfix のインストールが成功",
"expectedStatus": "success",
"expectedReturn": "",
"scheduledAt": "",
"estimatedTime": 10,
"serviceImpact": "none",
"note": ""
},
{
"majorCategoryNo": 3,
"majorCategory": "Postfix の基本設定",
"middleCategoryNo": 0,
"middleCategory": "",
"minorCategoryNo": 0,
"minorCategory": "",
"targetHost": "localhost",
"targetHostIp": "192.168.1.100",
"loginId": "ubuntu",
"purpose": "Ubuntu に Postfix をインストールし、特定の IP アドレスのみを外部リレーするサーバ構築",
"steps": "",
"command": [
{
"commandText": "sudo nano /etc/postfix/main.cf",
"comment": ""
},
{
"commandText": "mydestination = localhost.$mydomain, localhost",
"comment": ""
},
{
"commandText": "mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128",
"comment": ""
},
{
"commandText": "mynetworks_style = host",
"comment": ""
}
],
"expectedResult": "Postfix の基本設定が完了",
"expectedStatus": "success",
"expectedReturn": "",
"scheduledAt": "",
"estimatedTime": 10,
"serviceImpact": "none",
"note": ""
},
{
"majorCategoryNo": 4,
"majorCategory": "IP アドレスを許可する",
"middleCategoryNo": 0,
"middleCategory": "",
"minorCategoryNo": 0,
"minorCategory": "",
"targetHost": "localhost",
"targetHostIp": "192.168.1.100",
"loginId": "ubuntu",
"purpose": "Ubuntu に Postfix をインストールし、特定の IP アドレスのみを外部リレーするサーバ構築",
"steps": "",
"command": [
{
"commandText": "sudo nano /etc/postfix/access",
"comment": ""
},
{
"commandText": "123.456.789.012/32 OK",
"comment": ""
}
],
"expectedResult": "IP アドレスを許可する設定が完了",
"expectedStatus": "success",
"expectedReturn": "",
"scheduledAt": "",
"estimatedTime": 10,
"serviceImpact": "none",
"note": ""
},
{
"majorCategoryNo": 5,
"majorCategory": "Postfix のリスタート",
"middleCategoryNo": 0,
"middleCategory": "",
"minorCategoryNo": 0,
"minorCategory": "",
"targetHost": "localhost",
"targetHostIp": "192.168.1.100",
"loginId": "ubuntu",
"purpose": "Ubuntu に Postfix をインストールし、特定の IP アドレスのみを外部リレーするサーバ構築",
"steps": "",
"command": [
{
"commandText": "sudo service postfix restart",
"comment": ""
}
],
"expectedResult": "Postfix の設定が完了",
"expectedStatus": "success",
"expectedReturn": "",
"scheduledAt": "",
"estimatedTime": 10,
"serviceImpact": "none",
"note": ""
},
{
"majorCategoryNo": 6,
"majorCategory": "メール送信テスト",
"middleCategoryNo": 0,
"middleCategory": "",
"minorCategoryNo": 0,
"minorCategory": "",
"targetHost": "localhost",
"targetHostIp": "192.168.1.100",
"loginId": "ubuntu",
"purpose": "Ubuntu に Postfix をインストールし、特定の IP アドレスのみを外部リレーするサーバ構築",
"steps": "",
"command": [
{
"commandText": "sudo echo 'Hello, world!' | mail -v -r sender@example.com recipient@example.com",
"comment": ""
}
],
"expectedResult": "メール送信テストが成功",
"expectedStatus": "success",
"expectedReturn": "",
"scheduledAt": "",
"estimatedTime": 10,
"serviceImpact": "none",
"note": ""
}
]
}
qwent3.5:4b
{
"title": "Ubuntu Postfix Service Uniqueness Check",
"projectName": "ubuntu-postfix-check",
"items": [
{
"title": "Ubuntu Postfix Start (7)",
"projectName": "ubuntu-postfix-check",
"majorCategoryNo": 1,
"majorCategory": "1",
"middleCategoryNo": 1,
"middleCategory": "1",
"minorCategoryNo": 1,
"minorCategory": "1",
"steps": [
"service postfix start"
],
"command": "service postfix start",
"estimatedTime": 5,
"expectedStatus": "success",
"serviceImpact": "high"
},
{
"title": "Ubuntu Postfix Start (8)",
"projectName": "ubuntu-postfix-check",
"majorCategoryNo": 1,
"majorCategory": "1",
"middleCategoryNo": 2,
"middleCategory": "2",
"minorCategoryNo": 1,
"minorCategory": "1",
"steps": [
"mailq, sendmail -t"
],
"command": "mailq, sendmail -t",
"estimatedTime": 3,
"expectedStatus": "success",
"serviceImpact": "medium"
},
{
"title": "Ubuntu Postfix Start (9)",
"projectName": "ubuntu-postfix-check",
"majorCategoryNo": 2,
"majorCategory": "2",
"middleCategoryNo": 2,
"middleCategory": "2",
"minorCategoryNo": 0,
"minorCategory": "0",
"steps": [
"smtp connection check"
],
"command": "telnet mailserver 25",
"estimatedTime": 4,
"expectedStatus": "success",
"serviceImpact": "low"
},
{
"title": "Ubuntu Postfix Final (10)",
"projectName": "ubuntu-postfix-check",
"majorCategoryNo": 3,
"majorCategory": "3",
"middleCategoryNo": 3,
"middleCategory": "3",
"minorCategoryNo": 1,
"minorCategory": "1",
"steps": [
"final test"
],
"command": "smtp check",
"estimatedTime": 5,
"expectedStatus": "success",
"serviceImpact": "high"
},
{
"title": "Ubuntu Postfix End",
"projectName": "ubuntu-postfix-check",
"majorCategoryNo": 4,
"majorCategory": "4",
"middleCategoryNo": 4,
"middleCategory": "4",
"minorCategoryNo": 2,
"minorCategory": "2",
"steps": [
"end"
],
"command": "exit",
"estimatedTime": 1,
"expectedStatus": "success",
"serviceImpact": "none"
},
{
"title": "Ubuntu Postfix Error (11)",
"projectName": "ubuntu-postfix-check",
"majorCategoryNo": 5,
"majorCategory": "5",
"middleCategoryNo": 1,
"middleCategory": "1",
"minorCategoryNo": 3,
"minorCategory": "3",
"steps": [
"error handling"
],
"command": "postfix status",
"estimatedTime": 2,
"expectedStatus": "error",
"serviceImpact": "medium"
},
{
"title": "Ubuntu Postfix Config (12)",
"projectName": "ubuntu-postfix-check",
"majorCategoryNo": 6,
"majorCategory": "6",
"middleCategoryNo": 2,
"middleCategory": "2",
"minorCategoryNo": 0,
"minorCategory": "0",
"steps": [
"config check"
],
"command": "postfix config",
"estimatedTime": 3,
"expectedStatus": "success",
"serviceImpact": "low"
},
{
"title": "Ubuntu Postfix Log (13)",
"projectName": "ubuntu-postfix-check",
"majorCategoryNo": 1,
"majorCategory": "1",
"middleCategoryNo": 3,
"middleCategory": "3",
"minorCategoryNo": 1,
"minorCategory": "1",
"steps": [
"log check"
],
"command": "tail /var/log/mail.log",
"estimatedTime": 2,
"expectedStatus": "success",
"serviceImpact": "low"
},
{
"title": "Ubuntu Postfix Debug (14)",
"projectName": "ubuntu-postfix-check",
"majorCategoryNo": 2,
"majorCategory": "2",
"middleCategoryNo": 3,
"middleCategory": "3",
"minorCategoryNo": 2,
"minorCategory": "2",
"steps": [
"debug mode"
],
"command": "postfix debug",
"estimatedTime": 4,
"expectedStatus": "success",
"serviceImpact": "medium"
},
{
"title": "Ubuntu Postfix Reset (15)",
"projectName": "ubuntu-postfix-check",
"majorCategoryNo": 3,
"majorCategory": "3",
"middleCategoryNo": 4,
"middleCategory": "4",
"minorCategoryNo": 3,
"minorCategory": "3",
"steps": [
"reset config"
],
"command": "postfix reset",
"estimatedTime": 6,
"expectedStatus": "success",
"serviceImpact": "high"
}
]
}



コメント