top of page

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"

}

]

}



最新記事

すべて表示
AIが恐ろしい

こんにちは!最近はなぜかブログモチベが高いです。 本題ですが、ここ1、2年で私の働き方は大きく変わりました。 と言っても会社の制度が変わったり、業務時間が変わったりしたわけではありません。 そう、AIによって業務の効率が大幅に改善したのです。 分からないことが業務で生じたとき、必ず私はcopilot君(MicrosoftのAI)に 「こういう状態のときにこうなるのはなぜ?」と聞きます。 すると割と

 
 
 

コメント


bottom of page