---
title: "Nibiru-coderのトレーニング"
description: "ニビル風のチャットモデルを独自のオラマに登録する方法。一つのModelfile、一つのシェルスクリプト、60秒。"
---

フレームワークのデフォルトチャットモデルは **`nibiru-coder:1.0`** — これは、あなたのOllamaサーバーに登録するNibiru風Qwen 2.5 Coder 14Bです。トレーニングパイプラインは `application/module/ai/training/` にあります。

## `nibiru-coder`とは何なのか（そして何ではないのか）

`nibiru-coder:1.0` は **LoRA ファインチューンではありません**。これは同じ `qwen2.5-coder:14b` の重みが、システムプロンプトで包まれたものです。

- MMVC、モジュール、ディスパッチャー、シングルトンについて説明します。
- Nibiruの規約（`pageAction`、`navigationAction`、`View::assign`、`Form::create`、`Pageination` のスペリング）を強制します。
- モデルを一般的な Laravel / Symfony のアドバイスではなく、Nibiru 風の答えに向けます。

システムプロンプトのカスタマイズは**즉座に**完了します — GPUトレーニングやデータセット準備が不要です。これは実際のLoRAの約80%の価値をゼロコストで提供します。実際のファインチューンの予算がある場合は、以下の*実際のLoRAパス*をご覧ください。

## ビルドする
```bash
./application/module/ai/training/build.sh           # builds nibiru-coder:1.0
./application/module/ai/training/build.sh 1.1       # bump tag for iterations
```
スクリプト：

1. 同じディレクトリにある Modelfile を読みます。
2. `${OLLAMA_BASE_URL}/api/create`（デフォルトは `https://api.neuronetz.ai`）に POST します。
3. 新しいタグが応答することを確認するために、スモークテストのチャットコールを実行します。

成功した後、`application/module/ai/settings/ai.ini` にモデルを設定します。
```ini
[AI]
chat.model          = "nibiru-coder:1.0"
chat.fallback_model = "qwen2.5-coder:14b"
```
…そしてアプリケーション内のすべての`\Nibiru\Module\Ai\Ai`インスタンスがそれに接続しています。フォールバックは、タグをまだ構築していない場合に何も壊れないようにします。

## システムプロンプトを改善する

The Modelfile's `SYSTEM """ ... """` block is the lever. Tighten the conventions, add new examples, add citations to specific framework files. Re-run `build.sh` with a new tag (`1.1`, `1.2`, …) and A/B against the previous tag in your app.
```bash
./application/module/ai/training/build.sh 1.1
# Edit ai.ini → chat.model = "nibiru-coder:1.1"
# Compare answers in the Oracle widget or via smoke-test.php
```
## 実際の LoRA パス

Nibiruを知るモデルが必要な場合、システムプロンプトだけでなくその重みも考慮するには、コーパスエクスポーターが対応しています。
```bash
cd docs
npm run build:corpus
```
`dist/corpus/` ディレクトリ下に JSONL ファイルを出力します。

| ファイル | 形式 | 使用 |
|---|---|---|
| `chat.jsonl` | sharegpt スタイルのメッセージ | Axolotl, LLaMA-Factory, Unsloth |
| `instructions.jsonl` | 指令/入力/出力 | Alpaca スタイルのトレーナー |
| `completion.jsonl` | プロンプト/完了 | 伝統的なテキストコンプリーション微調整 |
| `chunks.jsonl` | チャンクメタデータ | RAG / 評価セット構築 |

シングルのA100または4090を使用した8Bベースの実用的なレシピ:
```yaml
# axolotl.yml
base_model: meta-llama/Llama-3.1-8B-Instruct
adapter: lora
lora_r: 16
lora_alpha: 32
lora_dropout: 0.05
lora_target_modules: [q_proj, k_proj, v_proj, o_proj]

datasets:
  - path: docs/dist/corpus/chat.jsonl
    type: sharegpt

sequence_len: 4096
sample_packing: true
gradient_accumulation_steps: 4
micro_batch_size: 2
num_epochs: 3
optimizer: adamw_bnb_8bit
learning_rate: 0.0002
warmup_ratio: 0.05
bf16: true
```
トレーニング後：

1. LoRA を GGUF（`llama.cpp` の `convert_hf_to_gguf.py`）に変換します。
2. `FROM ./your-lora.gguf` で Ollama Modelfile を構築します。
3. `./build.sh 2.0` はそれを `nibiru-coder:2.0` として登録します。

フレームワークのコードは変更されません — `ai.ini` の `chat.model` を切り替えるだけで新しい重みを使用できます。

## スモークテスト
```bash
php application/module/ai/training/smoke-test.php
```
検証します：

- Ollamaサーバーにアクセスできます。
- モデルが1ターンの質問に応答します。
- 複数ターンの会話コンテキストが機能しています。
- エンベディングが機能しています（`nomic-embed-text` がプルされていない場合は明確なメッセージでスキップされます）。

変更後、デプロイする前に実行します。

## 一般的な落とし穴

- **`Modelfile` システムプロンプトが長すぎます。** 一部の Ollama バージョンではシステムプロンプトに上限があります。約3000トークン未満で保つようにしてください。
- **FROM モデルを取得していない場合。** `qwen2.5-coder:14b` はすでにサーバー上にある必要があります。`curl ${OLLAMA_BASE_URL}/api/tags` を実行して確認してください。
- **タグの衝突。** `build.sh 1.0` を再度実行すると既存の `nibiru-coder:1.0` が上書きされます。反復のために新しいタグを使用し、`ai.ini` で特定のタグを固定してください。
- **`--no-stream` の混乱。** ビルドスクリプトは `stream: false` を使用しているため、レスポンスは1つの JSON として返ります。ストリーミングに変更する場合は、行ごとに解析してください。
