0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OllamaでローカルLLMを動かして、パラメータの違いを検証してみた【Qwen3:8b】

0
Posted at

はじめに

生成AIをアプリに組み込む際、開発中は以下のような悩みがあります。

  • APIキーの費用がかかる
  • 業務内容やテスト用の文章をクラウドに送りたくない
  • オフライン環境でも動かしたい

そこで使えるのがローカルLLMです。自分のマシン上でLLMを動かすことで、無料かつデータを外に出さずに開発ができます。

今回は Ollama を使ってMacでローカルLLMを動かし、APIのパラメータを変えると出力がどう変わるかを実際に検証してみました。

Ollamaとは

Ollama は、ローカルでLLMを簡単に動かすためのOSSツールです。

特徴:

  • コマンド一発でモデルをダウンロード・実行できる
  • localhost:11434 にREST APIサーバーが自動で立ち上がる
  • OpenAI互換のAPI/v1/chat/completions)を提供しているので、既存コードをほぼ変えずに使える
  • 100以上のモデルファミリーに対応

インストール

公式サイト(https://ollama.com/download/mac) から .dmg をダウンロードするか、Homebrew cask でインストールします。

brew install --cask ollama

brew install ollama(formula版)だと llama-server バイナリが含まれず動作しなかったため、cask版を使いました。

インストール後は自動でサーバーが起動します。バージョン確認:

ollama --version
# ollama version is 0.30.0

モデルのダウンロード

今回は Qwen3:8b を使います。AlibabaのQwen3シリーズは日本語の精度が高いようです。

ollama pull qwen3:8b

ダウンロードには数分かかります(約5GB)。完了後に確認:

ollama list
NAME        ID              SIZE      MODIFIED    
qwen3:8b    500a1f067a9f    5.2 GB    2 hours ago 

動かしてみる

対話モード(チャット)

ollama run qwen3:8b
>>> 自己紹介してください
Thinking...
Okay, the user asked me to introduce myself. Let me start by recalling my basic information. I'm Qwen, a large language model developed by Tongyi Lab. I should mention my capabilities, like understanding and generating text, answering questions, 
and creating content. Also, I need to highlight my multilingual support and the various applications I can handle, such as writing, coding, and problem-solving. It's important to keep the tone friendly and approachable, inviting the user to ask 
questions or share their needs. Let me make sure the response is clear and concise, covering key points without being too technical. I should also check for any recent updates or features that might be relevant to mention. Alright, time to put it 
all together in a natural, conversational way.
...done thinking.

こんにちは!私は通義実験室が開発した大規模言語モデルで、Qwenと呼ばれています。自然言語処理、テキスト生成、質問応答、コンテンツ創作など、さまざまなタスクをサポートできます。日本語、英語、中国語を含む多言語をサポートしており、文章の作成、プログラミング
、問題解決、知識の提供など、幅広い用途に応じてご活用いただけます。何かお手伝いできることがありましたら、遠慮なくお知らせください!😊

>>> /bye

REST APIで叩いてみる

サーバーが起動していれば、別ターミナルからcurlで叩けます:

curl http://localhost:11434/api/generate \
  -d '{
    "model": "qwen3:8b",
    "prompt": "Ollamaとは何か、一言で説明してください",
    "stream": false
  }'

レスポンスはJSON形式で返ってきます。response フィールドに生成テキストが入っています:

{
  "model": "qwen3:8b",
  "response": "Ollamaは、ローカル環境でオープンソースのLLMを手軽に動かすためのツールです。",
  "done": true,
  "total_duration": 11889763083
}

OpenAI互換APIで叩いてみる

OllamaはOpenAI互換の /v1/chat/completions も提供しています。
OpenAI SDKのbaseURLを変えるだけでそのまま使えるのが便利です:

curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3:8b",
    "messages": [
      {"role": "user", "content": "日本語で自己紹介してください"}
    ]
  }'

パラメータを変えて違いを見てみた

OllamaのAPIには options フィールドで生成挙動を細かく制御できるパラメータがあります。今回は特に効果がわかりやすい3つを実際に試してみました。

temperature(創造性 vs 一貫性)

出力の「バラつき・多様さ」を制御するパラメータです。

  • 低い(0〜0.3): 書き出しや文体が安定しやすい傾向
  • 高い(0.8〜1.5): 表現・構造が毎回変わりやすい傾向

デフォルトは 0.8。実際にどう変わるか試してみました。

① 詳細なプロンプト(日報生成)

具体的な作業内容を渡して日報を生成してみます。

# プロンプト(共通)
# 以下のメモをもとに、業務の日報を書いてください。
# ・認証機能のバグ修正(JWTトークンの有効期限処理)
# ・コードレビュー対応2件
# ・明日はデプロイ作業予定

temperature: 0.1(2回実行)

1回目の出力
**業務日報**
**日付:** 2023年10月XX日
**氏名:** [あなたの名前]

---

### **1. 本日の業務内容**
- **認証機能のバグ修正(JWTトークンの有効期限処理)**
  - 問題:JWTトークンの有効期限(`exp`フィールド)の処理に不具合があり、トークンが期限切れになっても認証が成功する不具合が発生。
  - 対応:
    - トークンの有効期限を正しく検証するロジックを修正。
    - テスト環境で再現・修正確認を行い、正常に動作することを確認。
  - 結果:不具合は解消し、認証処理の信頼性が向上。

- **コードレビュー対応(2件)**
  1. **セキュリティ関連のコードレビュー**
     - 対象:認証処理の一部。
     - 対応:レビュワーの指摘を受け、トークンのハッシュ化処理を強化し、コードの安全性を向上。
  2. **コード構造の改善提案**
     - 対象:APIコントローラーのロジック。
     - 対応:レビュワーの意見を反映し、関数の分離とコメント追加により可読性を改善。

---

### **2. 明日の業務計画**
- **デプロイ作業の準備**
  - 本日の修正内容を含むバージョンを本番環境にデプロイ予定。
  - 事前準備:
    - テスト環境での最終確認。
    - チームとの連携(インフラチーム・運用チーム)を進め中。
  - 注意点:
    - デプロイ後の監視体制を整え、異常時の対応を検討。

---

### **3. その他**
- 今後の課題:
  - デプロイ後の挙動を確認するため、運用チームとの連携を強化。
  - 他の機能のバグ修正を優先的に進める予定。

---
**備考:** 本日の業務はスケジュール通り進捗。デプロイ作業に向けた準備を進めています。
2回目の出力
**業務日報**
**日付:** 2023年10月X日
**担当者:** [あなたの名前]

---

### **1. 本日の主な業務内容**

#### **1.1 認証機能のバグ修正(JWTトークンの有効期限処理)**
- **問題概要:**
  JWTトークンの有効期限(`exp`フィールド)の処理に不具合があり、トークンが期限切れになっても認証が成功する不具合が発生。
- **対応内容:**
  - トークンの`exp`フィールドを正しく解析し、サーバー側で有効期限のチェックを実施。
  - 期限切れのトークンを無効化し、エラーレスポンスを返す処理を追加。
  - テスト環境で修正内容を確認し、正常に動作することを確認。

#### **1.2 コードレビュー対応(2件)**
1. **認証機能のリファクタリングコードレビュー**
   - リファクタリング後のコードの可読性やエラーハンドリングの改善点を確認。
   - テストケースの追加を提案し、実装を進める。
2. **ユーザー管理機能の新機能実装コードレビュー**
   - ユーザー登録時のバリデーションロジックの改善を検討。
   - ログ出力の統一化やコメントの追加を提案。

---

### **2. 明日の業務計画**
- **デプロイ作業の準備**
  - 修正内容を本番環境にデプロイする予定。
  - テスト環境での動作確認を再実施し、依存関係やバージョン管理を確認。
  - チームとの連携を進め、デプロイ後のモニタリング体制を整える。

---

### **3. その他**
- 今後の課題:
  - JWTトークンのセキュリティ強化(例:トークンの再発行機能の検討)。
  - コードレビューの頻度をさらに向上させるため、リ뷰ルールの明確化を検討。

---
**備考:**
- 本日の作業はスケジュール通り進捗。
- 明日のデプロイに向け、準備を進めます。

---
**[あなたの署名]**

temperature 0.1 でも「リ뷰ルール」と韓国語が混入していました。Qwen3は119言語以上で学習されたマルチリンガルモデルのため、言語の切り替えが不完全になり、他言語の文字が混入することがあるようです。

temperature: 1.0(2回実行)

1回目の出力
**業務日報**
**日付:2023年10月XX日**

---

### **1. 本日の主要業務**
#### **・認証機能のバグ修正(JWTトークンの有効期限処理)**
- **概要**:JWTトークンの有効期限(expフィールド)の処理に不具合があったため、修正を行いました。
- **対応内容**:
  - トークン生成時の有効期限を環境変数で設定し、一括管理可能に変更。
  - サーバー側の認証処理でトークンの有効期限を厳密に検証し、不正なトークンの利用を防ぐロジックを追加。
  - 修正後、ローカル環境でテストを実施し、正常な動作を確認。

#### **・コードレビュー対応2件**
1. **レビュー1(認証機能の改善)**
   - リ뷰対象:ユーザー認証フローのセキュリティ強化。
   - 反映内容:パスワードのハッシュ化処理を強化し、トークン生成時のランダムなシークレットキーを導入。
2. **レビュー2(APIエンドポイントの最適化)**
   - リ뷰対象:特定のAPIのレスポンス処理の効率化。
   - 反映内容:不要なデータのキャッシュ処理を削除し、エラーハンドリングを明確化。

---

### **2. 明日の予定**
- **・デプロイ作業の実施**
  - バグ修正とコードレビューの反映をもとに、本番環境へのデプロイを予定。
  - 作業手順:
    1. テ스트環境で最終的な動作確認を実施。
    2. CI/CDパイプラインをチェックし、デプロイ準備。
    3. 操作チームと連携して、デプロイスケジュールを調整。
  - **注意点**:デプロイ後のモニタリング体制を整え、異常発生時の対応を検討。

---

### **3. その他**
- 今後の課題:トークンの再発行フローの設計を検討中(セキュリティ強化のため)。
- サポート要望:運用チームと連携し、デプロイ後のログ監視体制を確認。

---
**担当者:[あなたの名前]**
**備考:** 本日は緊急バグ修正に集中し、コードレビューの効率化に努めました。デプロイ準備に万全を期します。

「リ뷰対象」「テ스트環境」のように日本語の中に韓国語が混入していました。マルチリンガルモデル特有の現象のようです。

2回目の出力
**業務日報**
**日付:** 2023年10月XX日
**氏名:** [Your Name]

---

### **1. 本日の業務内容**
#### **・認証機能のバグ修正(JWTトークンの有効期限処理)**
- **概要**:JWTトークンの有効期限(exp)の処理に不具合が発生していたため、修正を行いました。
- **対応内容**:
  - トークンの有効期限計算に誤った時間を使用していた問題を特定し、正しいタイムスタンプ計算ロジックを導入。
  - テスト環境で修正内容を確認し、トークンの無効化処理が正しく動作することを検証。
- **次回課題**:トークンのリフレッシュロジックの再確認を検討。

#### **・コードレビュー対応2件**
1. **件名:** フロントエンドの「ユーザーフォームのバリデーションロジック」
   - **問題点**:入力値のチェックで空欄を許容する場合のエラーハンドリングが不十分。
   - **対応**:必須項目の入力必須フラグを明示し、エラー表示を改善。
2. **件名:** バックエンドの「APIエンドポイントのセキュリティ設定」
   - **問題点**:CSRFトークンの検証が実装されていない。
   - **対応**:適切なCSRF対策を導入し、セキュリティチェックを追加。

---

### **2. 明日の業務計画**
- **・デプロイ作業の準備**
  - 本日修正した認証機能の変更を、本番環境にデプロイ予定。
  - テスト環境での最終確認と、デプロイ時のロールバック対応策を準備。
- **・今後の課題**
  - デプロイ後はユーザーのログイン状態をモニタリングし、不具合の有無を確認。

---

### **3. その他**
- 本日の業務進捗は全体的にスムーズに進みました。
- 今後は技術的な課題の他、チーム内のコミュニケーションの改善にも力を注ぎます。

---
**【署名】**
[Your Name]
[Your Position]
[Company Name]

temperature 0.1 でもセクション構造が変わることがありました(1回目はフラット構造、2回目は1.1/1.2のサブセクション形式)。ただし文体・トーン・情報量は2回とも近い印象でした。

temperature 1.0 では構造の変化に加え、補完の方向も毎回変わるようでした。コードレビューの対象が「セキュリティ強化」になったり「CSRFトークン検証」になったりと、メモにない情報がそれぞれ異なる形で補われていました。

② オープンなプロンプト(安定性の比較)

正解がない問いかけの方が temperature による差が出やすいようでした。同じプロンプトを 2回ずつ実行して安定性を比較してみます。

# プロンプト(共通)
# 今日、コードレビューで「設計が根本的に間違っている」と指摘されました。
# どう受け止めて次に臨むべきか、200字程度で教えてください。

temperature: 0.1(2回実行)

1回目の出力
設計の根本的な問題を指摘されたことは、成長の機会です。まずは冷静にフィードバックを受けて、原因を分析し、改善策を検討しましょう。経験豊富な同僚にアドバイスを求め、再設計を進めることで、より良いソリューションへと進むことができます。
2回目の出力
設計の根本的な問題を指摘されたことは、成長の機会です。まずは冷静にフィードバックを受けて、原因を分析し、専門家のアドバイスを求めて改善計画を立てるべきです。失敗は学びとし、次に活かす姿勢が重要です。

2回とも書き出しが「設計の根本的な問題を指摘されたことは、成長の機会です。まずは冷静にフィードバックを受けて、原因を分析し、」と一字一句同じでした。後半の結び方には若干の差がありましたが、読んで受ける印象はほぼ同じでした。

temperature: 1.0(2回実行)

1回目の出力
設計の根本的な問題を指摘されたのは、改善の機会と成長の証です。まずは丁寧にフィードバックを理解し、原因を客観的に分析しましょう。協力体制を築きながら、適切な設計手法を学び、次のプロジェクトで実践する姿勢が重要です。
2回目の出力
設計の指摘は改善のチャンスと受け止め、誠意をもってフィードバックを受ける姿勢を示しましょう。具体的なアドバイスを求めて、再設計の検討や改善計画を立てるのが良いです。

書き出し・構造・文章の長さがすべて異なりました。1回目は「成長の証」「協力体制」という言葉を使った長めの文章、2回目は「改善のチャンス」「誠意をもって」という語彙でやや短くまとまっていました。

今回の検証では、正解のない問いかけ(感想・方針・意見)の方が temperature による差が出やすかったです。詳細なプロンプトでは内容が固定されているため差が小さく、オープンなプロンプトの方が違いは明確でした。


seed(再現性)

同じ seed 値を指定すると、毎回同じ出力が得られるようになります。プロンプト改善時の比較や、テスト・デバッグに便利です。

curl http://localhost:11434/api/generate \
  -d '{"model":"qwen3:8b","prompt":"一言で自己紹介してください","stream":false,"options":{"seed":42,"temperature":0.8}}'

2回実行した結果:

1回目: こんにちは、私はアリババクラウドが開発した大規模言語モデルQwenで、さまざまなタスクをサポートし、質の高い情報を提供することを目的としています。

2回目: こんにちは、私はアリババクラウドが開発した大規模言語モデルQwenで、さまざまなタスクをサポートし、質の高い情報を提供することを目的としています。

完全に同じ出力でした。temperature 0.8 でも seed を固定すればランダム性が排除されるようです。

→ プロンプトを改善するとき、seed を固定すると「変数が1つ」になって効果を確認しやすい


repeat_penalty(繰り返し表現の制御)

同じ表現を繰り返して出力することへのペナルティです。デフォルトは 1.1

  • 高い(1.3〜1.5): 同じ言い回しを避けて多様な表現になる傾向
  • 低い(1.0以下): 繰り返しが増える傾向

repeat_penalty: 1.0(ペナルティなし)

出力を見る
**業務日報**
**日付**:2023年10月XX日
**担当者**:[あなたの名前]

---

### **1. 本日の業務内容**
#### **・認証機能のバグ修正(JWTトークンの有効期限処理)**
- **概要**:ユーザー認証において、JWTトークンの有効期限(exp)の処理に不具合が発生していたため、修正を行いました。
- **対応内容**:
  - トークンの有効期限を正しく計算するロジックを確認し、タイムゾーンのズレや時間の計算ミスを修正。
  - 修正後、ローカル環境でのテストを実施し、正常に動作することを確認。
  - 本番環境への反映は未実施(今後のデプロイに含む)。
- **注意点**:セキュリティリスクを回避するため、トークンの有効期限を厳密に管理する必要があります。

#### **・コードレビュー対応2件**
1. **Feature Branchのレビュー**:
   - ユーザー登録機能の改善に関するPRをレビューし、コードの可読性や例外処理の網羅性についてフィードバックを提供。
   - レビュー後、開発者と議論し、修正案の確認を進める。
2. **Bug Fixのレビュー**:
   - 既存のエラーハンドリングコードの改善に関するPRをレビューし、冗長な条件分岐の削減を提案。
   - レビュー結果に基づき、開発者に修正依頼を出す。

---

### **2. 明日の業務計画**
- **デプロイ作業の準備**:
  - 本番環境へのデプロイを予定しており、以下を確認する。
    - データベースのバージョンアップや依存関係の整合性。
    - テスト環境での最終確認(特に認証機能の動作確認)。
    - デプロイスクリプトの再確認と、緊急時の回 rollback プランの準備。
- **注意点**:
  - デプロイ前にはチーム全体でスプリントレビューを実施し、リスクを共有。
  - デプロイ後は、監視ツールで異常を検知する体制を整える。

---

### **3. その他**
- 今後の課題:
  - JWTトークンの有効期限管理をより厳密に設計するため、セキュリティガイドラインの再確認を検討。
- 連携依頼:
  - デプロイ作業に際して、インフラチームと連携して環境確認を進める。

---
**備考**:本日の業務進捗は順調。デプロイに向けた準備を進めるため、チーム間の連携を重視して作業を進めます。

repeat_penalty: 1.3(ペナルティ強め)

出力を見る
**業務日報(YYYY年MM月DD日)**

---

### **1. 今日の主な作業内容**
- **認証機能バグ修正:JWTトークン有効期限処理改善**
  - 問題点: ローカル環境では正常に動作していたが、本番環境でユーザーのセッション切れ(トークン過期)を検知するロジックにおいて誤ったタイミングでの無効判定があった。
  - 対応内容:JWT生成時の有効期限(`exp`フィールド)と、クライアント側でのトークンチェックで使用される時間比較処理を統一的に修正し、セキュリティリスクの軽減に努めた。

- **コードレビュー対応(2件)**
  - レビュー1: APIエンドポイントにおける異常系レスポンスハンドリングの改善提案。具体的には「403 Forbidden」や「500 Internal Server Error」といったステータスコードを明確にし、クライアント側での再試行制御を可能にする設計変更を行った。
  - レビュー2: 認証フローにおける重複処理の削除(冗長なトークン検証ロジック)。コード簡潔化と実行効率向上に貢献。

---

### **2. 明日の予定**
- **デプロイ作業**
  - バグ修正内容を本番環境へ反映するため、以下の手順準備中:
    1. ターミナルでのCI/CDパイプライン構築確認(GitLab CIやGitHub Actionsの設定再検証)
    2. ステージング環境内で最終的なテスト実施(特にトークン有効期限処理を重点的にチェック)
    3. デプロイ後のモニタリング体制整備(ログ監視・エラーロギングの確認)

---

### **3. 注意点 / 情報共有**
- 認証関連修正後、ユーザーが「セッション切れ」を再発する可能性があるため、デプロイ後のフィードバック対応体制は必須。
- 今後もコードレビューを通じた品質維持に注力し、チーム全体の技術基準向上を目指す。

---
**担当者:[あなたの名前]**

今回の日報生成では「繰り返し表現の増減」というよりも、全体的な構造・文体の違いが目立ちました。repeat_penalty 1.0 は詳細で冗長気味、1.3 はコンパクトにまとまった印象です。

→ 短い文章では効果が見えにくく、長い文章を生成するほど効果が出やすいようです。


まとめ

Ollamaを使うとローカルLLMの導入は思ったより簡単でした。

手順 コマンド
① インストール brew install --cask ollama
② モデル取得 ollama pull qwen3:8b
③ 対話モード ollama run qwen3:8b

パラメータについては以下のように使い分けができるかもしれません:

パラメータ 設定例 用途
temperature 0.1〜0.3 日報・ビジネス文書(安定した出力)
temperature 0.8〜1.0 アイデア出し・創作
seed 任意の固定値 プロンプト改善時の比較検証
repeat_penalty 1.2〜1.3 長文生成時の表現の単調さ防止

OpenAI互換APIがあるので、既存のOpenAI SDK製コードの baseURL を変えるだけでローカルLLMに切り替えられます。

今後は他のモデル(Llama3、Gemma2など)での比較や、top_ptop_k など他のパラメータ、思考モード(think: true)のオン/オフ比較なども試してみたいと思っています。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?