# ログアナライザーチャットボット

> FPT AI Studioを使用したログアナライザーチャットボットの構築チュートリアルです。詳細は[GitHub](https://github.com/fpt-corp/ai-studio/tree/main/tutorials/log-analyzer-chatbot)リポジトリをご確認ください。

## 概要

ヘルスケア＆フードチャットボットは、大規模言語モデル（LLM）が健康的な食事指導や地域料理の探索における知的なアシスタントとして機能する方法を実証します。ユーザーが料理について学び、栄養上の利点を理解し、自然な対話を通じて食品に関する医療関連の会話をインタラクティブに探求するのを支援します。

Llama-3.1-8B-Instructモデルの微調整により駆動される本チャットボットは、料理の説明を解釈し、パーソナライズされた栄養アドバイスを生成し、双方向的な会話を構築し、直感的なチャットインターフェースを通じて明確で人間が読みやすい応答を提供します。

FPT AI Studioを活用し、モデル開発ワークフロー全体を効率化・自動化します：

* [**モデル微調整**](https://fptcloud.com/en/documents/model-fine-tuning/?doc=quick-start)：Llama-3.1-8B-Instructモデルを医療分野に特化して訓練・適応させます。
* [**対話セッション**](https://fptcloud.com/en/documents/model-testing-interactive-sessions/?doc=quick-start)：対話形式でモデルの挙動を実験し、微調整前後の性能を比較。微調整版をAPIとしてデプロイし、チャットボット統合を実現します。
* [**テストジョブ**](https://fptcloud.com/en/documents/model-testing-test-jobs/?doc=step-by-step)：複数のNLP指標を用いて指定テストセット上でモデル性能をベンチマークし、堅牢性と信頼性を確保します。

さらに、大規模なモデルやデータセットの効率的な保存と管理のために、[モデルハブ](https://fptcloud.com/en/documents/model-hub-2/?doc=quick-start)と[データハブ](https://fptcloud.com/en/documents/data-hub/?doc=initial-setup)が採用されています。

## パイプライン

<figure><img src="/files/KXVgK1uqLfoayI07c1eX" alt=""><figcaption></figcaption></figure>

このプロジェクトのエンドツーエンドのパイプラインには、以下の段階が含まれます：

{% stepper %}
{% step %}

#### データ準備

* 公開リポジトリ（[loghub2.0](https://github.com/logpai/loghub-2.0)）からログデータをダウンロードし、前処理する。
* 生のログファイルを扱いやすいサンプルに分割する。
  {% endstep %}

{% step %}

#### 合成データ生成

* 教師モデル（gpt-4o-mini）を使用して、生のログからラベル付きデータを生成する。
* 複数のタスク特化型出力（根本原因、要約、パターン検出、会話）を生成する。
  {% endstep %}

{% step %}

#### モデルトレーニング

* 合成データセットで[meta-llama/Llama-3.1-8B-Instruct](https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct)を微調整する。
* データセットとモデルの管理にはData HubとModel Hubを使用する。
  {% endstep %}

{% step %}

#### モデル評価

* NLPメトリクスを用いたテストジョブで微調整済みモデルを評価する。
  {% endstep %}

{% step %}

#### モデルの展開

* FPT AI Studioのインタラクティブセッションを通じて、学習済みモデルをAPIエンドポイントとしてデプロイします。
  {% endstep %}

{% step %}

#### デモアプリケーション

* ユーザーがログを貼り付け/アップロードし、モデルとやり取りできるStreamlitチャットベースのインターフェースを提供します。
  {% endstep %}
  {% endstepper %}

## 1. データ準備

本プロジェクトでは、公開されているログデータセットを利用しました。

* **データソース**：ログデータはLoghubリポジトリから取得しました。Loghubは様々な実稼働システムからのシステムログデータセットを収集したもので、ログ分析ツールの開発やテストに最適なリソースです
* **データチャンキング**：生のログファイルは、50行から150行を含む小さなサンプルに分割されました。これは、データ合成モデルが扱いやすいコンテキストを作成し、最終アプリケーションのバッチ処理特性をシミュレートするためです。
* #### **参照**：[チャンキングコード](https://raw.githubusercontent.com/fpt-corp/ai-studio/refs/heads/main/tutorials/log-analyzer-chatbot/src/split_log.py)

## 2. gpt-4o-miniを用いた合成データ生成

小型モデルを効果的に訓練するには、潜在的なリスクを特定しログエントリを要約したラベル付きデータセットが必要でした。時間と専門知識を要する手動ラベリングに代わり、より大規模で強力なモデルを活用して合成訓練データを生成しました。

* **教師モデル**：数学とコーディングにおける強力な推論能力と指示順守能力から、gpt-4o-miniを本タスクに採用しました。
* **プロセス**：各ログデータチャンクは、異なるログ分析目的に合わせて調整されたタスク固有のプロンプトを用いてgpt-4o-miniによって処理されました：
  * [根本原因の特定](https://raw.githubusercontent.com/fpt-corp/ai-studio/refs/heads/main/tutorials/log-analyzer-chatbot/prompts/teacher_prompts/deep_ask_why.txt)
  * [ログの要約](https://raw.githubusercontent.com/fpt-corp/ai-studio/refs/heads/main/tutorials/log-analyzer-chatbot/prompts/teacher_prompts/deep_summarize.txt)
  * [パターン検出](https://raw.githubusercontent.com/fpt-corp/ai-studio/refs/heads/main/tutorials/log-analyzer-chatbot/prompts/teacher_prompts/deep_find_pattern.txt)
  * [会話生成](https://raw.githubusercontent.com/fpt-corp/ai-studio/refs/heads/main/tutorials/log-analyzer-chatbot/prompts/teacher_prompts/create_conversation.txt)
* 出力形式: プロンプトは厳密にJSON出力形式を強制し、これを使用して構造化されたトレーニングデータセットを作成しました。
* #### 参照: [データ合成コード](https://raw.githubusercontent.com/fpt-corp/ai-studio/refs/heads/main/tutorials/log-analyzer-chatbot/src/synthesize_data_accelerate.py), [合成データ処理コード](https://raw.githubusercontent.com/fpt-corp/ai-studio/refs/heads/main/tutorials/log-analyzer-chatbot/src/preprocess_synthesized_data.py), [データ分割コード](https://raw.githubusercontent.com/fpt-corp/ai-studio/refs/heads/main/tutorials/log-analyzer-chatbot/src/split_and_merge_no_json.py)

## 3. FPT AI Studioでのモデルトレーニング

合成データセットの準備が整ったため、次のステップとして、知的アシスタントとして機能する小型で効率的なモデルの微調整を行いました。LoRA技術を用いてモデルを微調整しました。

* モデル: [meta-llama/Llama-3.1-8B-Instruct](https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct).
* データ: 合成生成データセット: [data/final\_data/chat](https://github.com/fpt-corp/ai-studio/tree/main/tutorials/log-analyzer-chatbot/data/final_data/chat)
  * [訓練セット](https://raw.githubusercontent.com/fpt-corp/ai-studio/refs/heads/main/tutorials/log-analyzer-chatbot/data/final_data/chat/train_no_json.json): 8,971サンプル
  * [検証セット](https://raw.githubusercontent.com/fpt-corp/ai-studio/refs/heads/main/tutorials/log-analyzer-chatbot/data/final_data/chat/val_no_json.json): 500サンプル
  * [テストセット](https://raw.githubusercontent.com/fpt-corp/ai-studio/refs/heads/main/tutorials/log-analyzer-chatbot/data/final_data/chat/test_no_json.json): 500サンプル
  * [訓練サブセット](https://raw.githubusercontent.com/fpt-corp/ai-studio/refs/heads/main/tutorials/log-analyzer-chatbot/data/final_data/chat/train_no_json_mini.json): 1,000サンプル (デモ用)

ハイパーパラメータを固定し、訓練サンプル数とGPU数のみを変化させることで、以下の結果を得ました:

<table><thead><tr><th>基本モデル</th><th width="78.39996337890625">列車のサンプル</th><th width="76.79998779296875">ヴァル・サンプルズ</th><th width="72">試験サンプル</th><th width="49.5999755859375">GPUs</th><th width="139.800048828125">トレーニング時間</th><th>当社のコスト （2.31ドル/GPU時間）</th></tr></thead><tbody><tr><td><p>Llama-3.1-8B-Instruct</p><p><br></p></td><td>8,971</td><td>500</td><td>500</td><td>4</td><td>2h19m55s</td><td>$5.39</td></tr><tr><td><p>Llama-3.1-8B-Instruct</p><p><br></p></td><td>8,971</td><td>500</td><td>500</td><td>8</td><td>1h15m29s</td><td>$2.89</td></tr><tr><td><p>Llama-3.1-8B-Instruct</p><p><br></p></td><td>1,000</td><td>500</td><td>500</td><td>4</td><td>21m22s</td><td>$0.85</td></tr></tbody></table>

費用の説明:

* FPT AI Studioでは、GPU時間あたり2.31ドルを課金します。上記の表は、このチュートリアルを実行する際の推定費用を示しています。重要な点として、実際のGPU使用時間のみを課金対象とし、モデルダウンロード、データダウンロード、データトークン化、モデルハブへのデータプッシュなどのタスクに要した時間は計算に含まれません。
* 簡略化のため、表示されている費用にはモデルダウンロード、データダウンロード、データトークン化、モデルハブへのデータプッシュに要する時間も含まれています。実際の運用ではGPU使用時間のみ課金対象となるため、実際の費用は表の値より低くなります。

データは管理のためData Hubにアップロードされます。100MBを超えるデータセットの場合、まずデータをS3にアップロードし、次にData HubでConnectionを作成し、最後にDataset Managementで対応するS3データセットパスを指すDatasetを作成します。S3へのデータアップロードについては、以下のコードを参照してください：[upload\_s3.py](https://raw.githubusercontent.com/fpt-corp/ai-studio/refs/heads/main/tutorials/log-analyzer-chatbot/src/upload_s3.py)

<figure><img src="/files/j2v5IHWeRH8WyNCuMECe" alt=""><figcaption></figcaption></figure>

ログ関連のタスクでは、コンテキスト長は通常非常に長い。モデルの学習に理想的なコンテキスト長は16kトークンであるが、デモ目的でmax\_sequence\_length = 8192に設定し、学習を高速化している。

<figure><img src="/files/XYTq9pFGwHTsjspAvPaf" alt=""><figcaption></figcaption></figure>

* ハイパーパラメータ:

```
{
    "batch_size": 8,
    "checkpoint_steps": 1000,
    "checkpoint_strategy": "epoch",
    "disable_gradient_checkpointing": false,
    "distributed_backend": "ddp",
    "dpo_label_smoothing": 0,
    "epochs": 3,
    "eval_steps": 1000,
    "eval_strategy": "epoch",
    "flash_attention_v2": true,
    "full_determinism": false,
    "gradient_accumulation_steps": 2,
    "learning_rate": 0.00005,
    "liger_kernel": true,
    "logging_steps": 10,
    "lora_alpha": 32,
    "lora_dropout": 0.05,
    "lora_rank": 16,
    "lr_scheduler_type": "linear",
    "lr_warmup_steps": 0,
    "lr_warmup_ratio": 0.1,
    "max_grad_norm": 1,
    "max_sequence_length": 8192,
    "merge_adapter": true,
    "mixed_precision": "bf16",
    "number_of_checkpoints": 1,
    "optimizer": "adamw",
    "pref_beta": 0.1,
    "pref_ftx": 0,
    "pref_loss": "sigmoid",
    "quantization_bit": "none",
    "resume_from_checkpoint": false,
    "save_best_checkpoint": false,
    "seed": 1309,
    "simpo_gamma": 0.5,
    "target_modules": "all-linear",
    "training_type": "lora",
    "unsloth_gradient_checkpointing": false,
    "weight_decay": 0.01,
    "zero_stage": 1
}
```

* インフラストラクチャ: 4台のH100 GPUでモデルをトレーニングし、分散データ並列処理(ddp)とFlashAttention 2およびLigerカーネルを活用してトレーニングプロセスを加速しました。グローバルバッチサイズは64に設定しました。
* トレーニング: パイプラインを作成し、トレーニングを開始します。

<figure><img src="/files/gfTO6OboufhEmw6LzyGy" alt=""><figcaption></figcaption></figure>

モデルトレーニングの過程では、モデルメトリクスセクションで損失値やその他の関連指標を監視できます。

<figure><img src="/files/jIBECGXZFVDFCLzPUFyG" alt=""><figcaption><p>train loss</p></figcaption></figure>

<figure><img src="/files/h9DU5xplThLrwqlwF1JY" alt=""><figcaption><p>eval loss</p></figcaption></figure>

さらに、システム関連メトリクスは「システムメトリクス」セクションで確認できます。

<figure><img src="/files/RScAjG61pP7Fd1E6UFba" alt=""><figcaption></figcaption></figure>

モデルは、トレーニング後にモデルハブの「プライベートモデル」セクションに保存されます。ユーザーはダウンロードするか、インタラクティブセッションやテストジョブなどの他のサービスで直接使用できます。

<figure><img src="/files/6p9cElQseAyJIkzOcPy9" alt=""><figcaption></figcaption></figure>

## 4. モデル評価

トレーニング後、モデルの性能が要求される精度と効率を満たしていることを確認するため評価を実施しました。ファインチューニング前後のモデルを比較するため、FPT AI StudioのテストジョブとNLPメトリクスを用いてテストセット上でモデルを評価しています。

<figure><img src="/files/uiGXI7H7B7X5zuJGJ28D" alt=""><figcaption></figcaption></figure>

**結果：**

<figure><img src="/files/WOvkHgXt4C3rN4bMO0jI" alt=""><figcaption></figcaption></figure>

#### 注記:

#### 📈 全指標で大幅な向上が確認され、モデルがタスク固有のログ分析パターンを強力に習得したことを示しています。

#### 🎯 ファジーマッチング精度が0.27→0.49に急上昇し、目標表現との整合性が大幅に強化されたことを示しています。

#### ✨ BLEUスコアが0.02→0.28に飛躍的に向上し、語彙精度とフレーズレベルの正確性で顕著な改善が確認されました。

#### 📘 ROUGE指標が著しく改善し、コンテンツ構造の理解深化と生成サマリーの整合性向上を示しています。

## 5. モデルの展開

微調整されたモデルはFPT AI Studioのインタラクティブセッションにデプロイされました。これによりモデルがAPIエンドポイント経由で利用可能となり、当社のStreamlitアプリケーションがログデータを送信し、分析結果をリアルタイムで受信できるようになりました。さらに、インタラクティブセッションのインターフェース上で直接チャットすることも可能です。

<figure><img src="/files/Z1uBSHGdM4Z2PPA8N7NH" alt=""><figcaption></figcaption></figure>

## 6. デモアプリケーション

プロジェクトの最終的な成果物はStreamlitダッシュボードであり、リアルタイムのログ分析を可視化するユーザーフレンドリーなインターフェースを提供します。

<figure><img src="/files/N27wL0FgceEE2HpAbesu" alt=""><figcaption></figcaption></figure>

### 動作原理

{% stepper %}
{% step %}

#### 対話型チャットインターフェース

ユーザーはチャット形式のインターフェースを通じてAIモデルと直接対話できます。本アプリは自由形式のクエリと、以下のような事前定義された分析タスクの両方をサポートします：

* ログ要約：長大なログファイルの簡潔な要約を生成します。
* 根本原因の特定：検出された問題の潜在的な根本原因を特定します。
* パターンの検出：ログ内の反復的な動作や異常を検知します。
  {% endstep %}

{% step %}

#### **ログ入力**

ログデータはサイドバーの入力エリアに直接貼り付けることができます。
{% endstep %}

{% step %}

#### **AIによる分析**

ユーザーがタスクを実行または質問を送信すると、アプリはユーザーのプロンプトと提供されたログ内容を組み合わせた構造化リクエストを作成します。これはFPT AI Studio API経由でデプロイされた微調整済みLlama-3.1-8B-Instructモデルに送信され、入力処理後リアルタイムで結果を返します。
{% endstep %}
{% endstepper %}

### デモの実行方法

{% stepper %}
{% step %}

#### リポジトリをクローンする

```
git clone https://github.com/fpt-corp/ai-studio.git
cd tutorials/log-analyzer-chatbot
```

{% endstep %}

{% step %}

#### 必要なライブラリをインストールしてください

```
pip install -r requirements.txt
```

{% endstep %}

{% step %}

#### 環境変数を設定する

上記の図に示すように、FPT AI Studio上のAPIエンドポイントと認証情報を取得し、以下の環境変数を設定する必要があります。`scripts/run_app.sh`:

```
export TOKEN="BEARER_TOKEN"
export ENDPOINT_URL="API_ENDPOINT"
export MODEL="MODEL_ID"
```

{% endstep %}

{% step %}

#### Streamlitアプリケーションを実行する

```
bash scripts/run_app.sh
```

{% endstep %}
{% endstepper %}

**微調整済みモデルを統合したStreamlitデモの結果：**

<figure><img src="/files/CJA7T3M9MTK1yncSowWY" alt=""><figcaption></figcaption></figure>

アプリ内でのステップバイステップの使用方法：

{% stepper %}
{% step %}
ログデータをサイドバーの「ログ内容をここに貼り付け」ボックスに貼り付けてください。（50～150行のログを貼り付ける必要があります。）
{% endstep %}

{% step %}
必要な分析タスクを選択してください：

* ✂️ ログの要約：ログの簡潔な要約を生成します。
* 🔍 根本原因の特定：エラーやインシデントの根本原因を特定します。
* 🧩 パターンの検出：ログ内のパターンや繰り返し発生する動作を検出します。
  {% endstep %}

{% step %}
チャットボットはリクエストを自動的にモデルに送信し、応答をリアルタイムでストリーミングします。
{% endstep %}

{% step %}
入力ボックスに新しい質問を入力することで、ボットとの会話を続けることができます。
{% endstep %}

{% step %}
サイドバーの「新規チャット」をクリックすると、すべてのメッセージが消去され、新しいセッションが開始されます。
{% endstep %}
{% endstepper %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ai-docs.fptcloud.com/ai-factory-guideline-jp/fpt-ai-studio/furufurysuksu-chtoriaru/roguanaraizchattobotto.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
