# 医療・食品チャットボット

> FPT AI Studioを使用した医療・食品チャットボットのチュートリアルです。詳細は[GitHub](https://github.com/fpt-corp/ai-studio/tree/main/tutorials/healthcare-and-food-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指標を用いてモデル性能をベンチマークし、堅牢性と信頼性を確保します。

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

## パイプライン

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

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

1. データ準備：基本情報を含む約50種類の地域料理リストを準備する。
2. 合成データ生成：教師モデル（GPT-4o-mini）を用いて、各食品に関する詳細な説明と医療関連の対話を生成する。
3. モデルトレーニング：FPT AI Studioプラットフォームのモデル微調整機能を用い、合成データセット上で[meta-llama/Llama-3.1-8B-Instruct](https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct)モデルの微調整を実施。このステップでは、トレーニングデータの管理にData Hubを、学習済みモデルのバージョン管理にModel Hubを活用。
4. モデル評価：テストジョブを用いて微調整済みモデルの性能を評価。
5. モデルデプロイ：訓練済みモデルをFPT AI Studio上にAPIエンドポイントとしてデプロイし、インタラクティブセッションによる推論を実現。
6. デモアプリケーション：Streamlitで構築した対話型チャットアプリケーション。ユーザーが食品を探索し、栄養についてインタラクティブに議論可能。

## 1. データ準備

まず、厳選した約50種類の地域料理リストを用意します。次に、GPT-4o-miniを用いて初期の食品説明を生成します。これらの説明には主要な栄養情報が含まれます。

```
VN_FOODS = [
    'Bánh bèo', 'Bánh bột lọc', 'Bánh căn', 'Bánh canh',
    'Bánh chưng', 'Bánh cuốn', 'Bánh đúc',
    'Bánh giò', 'Bánh khọt', 'Bánh mì', 'Bánh pía', 'Bánh tét',
    'Bánh tráng nướng', 'Bánh xèo miền Tây', 'Bánh xèo miền Trung',
    'Bún bò Huế', 'Bún đậu mắm tôm', 'Bún mắm', 'Bún riêu',
    'Cá kho tộ', 'Canh chua', 'Cao lầu', 'Cháo lòng',
    'Gỏi cuốn', 'Hủ tiếu', 'Nem chua', 'Phở', 'Xôi xéo',
    'Bún thang', 'Bún ốc', 'Chả cá Lã Vọng', 
    'Phở cuốn', 'Bánh tôm Hồ Tây', 'Cơm tấm',
    'Nem rán (chả giò)', 'Bún mắm nêm', 
    'Mì Quảng', 'Bánh lọc Huế', 'Cơm hến',
    'Cháo lươn', 'Bún thịt nướng', 'Cá lóc nướng trui', 
    'Bánh hỏi', 'Xôi gấc', 'Chè ba màu', 'Bánh da lợn',
    'Lẩu mắm', 'Bánh tét lá cẩm', 'Bánh mì chả cá'
]
```

* **参照**：[説明コードの作成](https://github.com/fpt-corp/ai-studio/blob/main/tutorials/healthcare-and-food-chatbot/src/get_infor_vn_food.py)、[説明プロンプトの作成](https://github.com/fpt-corp/ai-studio/blob/main/tutorials/healthcare-and-food-chatbot/prompts/teacher_prompts/introduce_vn_food.txt)

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

豊富な会話データセットを作成するため、GPT-4o-miniを教師モデルとして使用し、前段階の食品説明に基づき以下の点に焦点を当てた食品に関する対話を生成します：

* **医療・栄養**：カロリー情報、バランスの取れた食事、食材の代替
* **対話型Q\&A**：食事、アレルギー、健康効果に関する質問

使用したプロンプト：

```
Dựa trên mô tả chi tiết về món ăn Việt Nam sau đây (bao gồm nguồn gốc, cách chế biến, hương vị, thành phần dinh dưỡng và ý nghĩa văn hóa,...), hãy tạo một **đoạn hội thoại tự nhiên giữa một người dùng và một assistant chuyên về dinh dưỡng và sức khỏe**.
Mô tả món ăn:
"""
[INFO_VN_FOOD]
"""

Yêu cầu:

1. Hội thoại dài khoảng 8–12 lượt nói (turns).
2. Người dùng có thể hỏi về:
   * Thông tin bất kỳ về món ăn.
   * Giá trị dinh dưỡng của món ăn (calo, protein, chất béo, carbohydrate, vitamin, khoáng chất,...).
   * Ảnh hưởng của món ăn tới các bệnh lý phổ biến (tiểu đường, tim mạch, béo phì, dị ứng, huyết áp, tim mạch, ung thư, mỡ máu, gan nhiễm mỡ, viêm da, mụn trứng cá,...).
   * Gợi ý cách ăn hợp lý cho người có tình trạng sức khỏe cụ thể.
3. Assistant phải trả lời **có cơ sở, chính xác, rõ ràng**, vừa cung cấp thông tin dinh dưỡng, vừa đưa lời khuyên hợp lý dựa trên tình trạng sức khỏe.
4. Giữ hội thoại **tự nhiên, gần gũi**, giống như một người dùng thật sự đang hỏi và một chuyên gia trả lời, không quá cứng nhắc hay khoa học quá mức.
5. Bao gồm ít nhất một ví dụ về cách **thay đổi khẩu phần hoặc điều chỉnh món ăn** để phù hợp với từng loại bệnh lý.

Xuất kết quả dưới dạng JSON list, mỗi lượt nói là một object với key `"user"` và `"assistant"`. Ví dụ format:

[
  {
    "user": "User hỏi câu này...",
    "assistant": "Assistant trả lời câu này..."
  },
  {
    "user": "User hỏi câu khác...",
    "assistant": "Assistant trả lời câu khác..."
  }
]

Bắt đầu hội thoại từ câu mở đầu của người dùng thể hiện sự tò mò hoặc quan tâm về món ăn này.
```

処理後、サンプルは以下の通りです：

```
{
    "conversations": [
      {
        "from": "human",
        "value": "Chào bạn! Mình nghe nói về bún mắm, một món ăn rất nổi tiếng của miền Tây. Bạn có thể cho mình biết thêm về nguồn gốc của nó không?"
      },
      {
        "from": "gpt",
        "value": "Chào bạn! Bún mắm có nguồn gốc từ miền Tây Nam Bộ, rất được yêu thích ở các tỉnh như Sóc Trăng, Cần Thơ và Bạc Liêu. Món ăn bắt đầu xuất hiện từ thế kỷ 19, khi người dân sử dụng cá cơm và hải sản tươi để chế biến nước dùng, tạo nên hương vị đậm đà. Đây cũng là biểu tượng văn hóa ẩm thực đặc sắc của vùng sông nước."
      },
      {
        "from": "human",
        "value": "Vậy bún mắm có những thành phần gì và cách chế biến như thế nào?"
      },
      {
        "from": "gpt",
        "value": "Nguyên liệu chính của bún mắm bao gồm bún tươi, mắm cá (thường là mắm cá linh hoặc mắm cá basa), tôm, cá lóc và các loại rau sống như rau muống, giá đỗ, cùng với rau thơm như húng quế, ngò gai. Để chế biến, người ta nấu mắm cá với nước, có thể thêm gia vị như tỏi và ớt, rồi cho bún vào tô, thêm tôm, cá và rau sống, trước khi rưới nước dùng lên."
      },
      {
        "from": "human",
        "value": "Mình rất thích ăn ngon, nhưng cũng quan tâm đến chế độ dinh dưỡng. Bạn có thể cho mình biết bún mắm có bao nhiêu calo và các chất dinh dưỡng khác không?"
      },
      {
        "from": "gpt",
        "value": "Tất nhiên! Một khẩu phần bún mắm khoảng 400-500 calo, tùy vào lượng nguyên liệu. Trong đó có khoảng 30g protein, chủ yếu từ tôm và cá, 10g chất béo từ hải sản và mắm, cùng với 60g carbohydrate từ bún. Nó cũng chứa nhiều chất xơ từ rau sống và bổ sung vitamin A, C cùng khoáng chất từ hải sản."
      },
      {
        "from": "human",
        "value": "Nghe có vẻ hợp lý, nhưng nếu mình bị tiểu đường thì có thể ăn bún mắm không? Có cách nào ăn món này mà không làm tăng đường huyết không?"
      },
      {
        "from": "gpt",
        "value": "Nếu bạn bị tiểu đường, bạn có thể vẫn thưởng thức bún mắm nhưng cần điều chỉnh khẩu phần. Bạn nên giảm lượng bún để giảm carbohydrate và tăng cường rau sống. Ngoài ra, bạn có thể chọn loại mắm ít muối và hạn chế nước dùng để không bị tăng huyết áp. Hãy nhớ theo dõi đường huyết sau khi ăn để xem phản ứng của cơ thể."
      },
      {
        "from": "human",
        "value": "Có cách nào khác để bún mắm phù hợp hơn cho người như mình không?"
      },
      {
        "from": "gpt",
        "value": "Có, bạn có thể sử dụng bún giả (như bún từ đậu xanh hoặc bún từ rau củ) để giảm lượng carbohydrate. Ngoài ra, có thể thêm nhiều rau sống hơn, có thể ngoài rau muống và giá đỗ, bạn thử thêm các loại rau xanh như cải thìa hoặc mồng tơi để tăng chất xơ và vitamin. Ăn cùng với một chút chanh và ớt tươi cũng giúp tăng hương vị mà không làm tăng calo."
      },
      {
        "from": "human",
        "value": "Thú vị quá! Bún mắm có ảnh hưởng gì đến sức khỏe tim mạch không?"
      },
      {
        "from": "gpt",
        "value": "Bún mắm có chứa chất béo từ hải sản và mắm, nên nếu bạn có vấn đề về tim mạch, hãy chú ý đến lượng mắm sử dụng. Hạn chế lượng muối và chất béo saturates có trong mắm và hải sản. Bạn nên chọn cá như cá lóc hoặc tôm tươi để đưa vào món ăn, vì chúng có chứa omega-3, tốt cho tim mạch. Theo dõi phần ăn và hạn chế mắm có thể tốt cho bạn."
      },
      {
        "from": "human",
        "value": "Vậy nếu mình muốn giảm béo thì sao? Bún mắm có phải là món ăn tốt cho kế hoạch giảm cân không?"
      },
      {
        "from": "gpt",
        "value": "Bún mắm có thể không phải là lựa chọn tối ưu nếu bạn đang giảm cân vì nó có chứa khá nhiều calo, đặc biệt nếu ăn với nhiều hải sản và mắm. Tuy nhiên, nếu bạn giảm khẩu phần bún, tăng cường rau sống và chọn những nguyên liệu thấp calo, thì bún mắm vẫn có thể là một phần của chế độ ăn giảm cân. Hãy chú ý đến khẩu phần và vận động thể chất để duy trì năng lượng cân bằng."
      },
      {
        "from": "human",
        "value": "Cảm ơn bạn rất nhiều vì những thông tin hữu ích! Mình rất háo hức thử bún mắm lần đầu tiên."
      },
      {
        "from": "gpt",
        "value": "Rất vui vì được giúp đỡ bạn! Khi thử bún mắm, hãy nhớ thêm chút chanh và ớt để tăng hương vị nhé. Chúc bạn có những trải nghiệm ẩm thực tuyệt vời và luôn chăm sóc sức khỏe tốt!"
      }
    ]
}
```

**参照:** [synthesize\_data コード](https://github.com/fpt-corp/ai-studio/blob/main/tutorials/healthcare-and-food-chatbot/src/create_conversation.py)、[process\_synthesized\_data コード](https://github.com/fpt-corp/ai-studio/blob/main/tutorials/healthcare-and-food-chatbot/src/preprocess_synthesized_data.py)、[**split\_data コード**](https://github.com/fpt-corp/ai-studio/blob/main/tutorials/healthcare-and-food-chatbot/src/split_and_merge.py)、[promp](https://github.com/fpt-corp/ai-studio/blob/main/tutorials/healthcare-and-food-chatbot/prompts/teacher_prompts/create_healthcare_conversation.txt)

## 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/healthcare\_and\_vn\_food](https://github.com/fpt-corp/ai-studio/tree/main/tutorials/healthcare-and-food-chatbot/data/final_data/healthcare_and_vn_food)

[訓練データセット:](https://github.com/fpt-corp/ai-studio/blob/main/tutorials/healthcare-and-food-chatbot/data/final_data/healthcare_and_vn_food/train.json) 1,916 サンプル

[検証データセット](https://github.com/fpt-corp/ai-studio/blob/main/tutorials/healthcare-and-food-chatbot/data/final_data/healthcare_and_vn_food/val.json): 110 サンプル

[テストデータセット](https://github.com/fpt-corp/ai-studio/blob/main/tutorials/healthcare-and-food-chatbot/data/final_data/healthcare_and_vn_food/test.json) : 110 サンプル

収集したデータ分布に基づき、**max\_sequence\_length = 1024** を設定しました。

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

* **ハイパーパラメータ**:

```
{
    "batch_size": 32,
    "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.00001,
    "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": 1024,
    "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.1,
    "zero_stage": 1
}
```

* **インフラストラクチャ:** トレーニングには1台のH100 GPUを使用し、FlashAttention 2とLigerカーネルを活用してトレーニングプロセスを高速化しました。グローバルバッチサイズは64に設定しました。
* **トレーニング:** パイプラインを作成し、トレーニングを開始します。

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

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

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

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

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

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

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

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

* トレーニングには21分かかり、GPU使用時間は18分でした。微調整済みモデルの使用コストは約**0.693**ドルです。

費用の内訳：**FPT AI Studio**では、GPU使用時間1時間あたり**2.31**ドルを課金します。重要な点として、実際のGPU使用時間のみを課金対象とし、モデルのダウンロード、データのダウンロード、データのトークン化、Model Hubへのデータプッシュなどの作業時間は計算に含まれません。

## 4. モデル評価

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

* プライベートモデルからファインチューニング済みモデルを選択してください。

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

* テストスイートを選択し、テスト基準を指定し、パラメータを変更する

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

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

* **結果：**

| Model                               | Fuzzy Match  | BLEU        | ROUGE-1      | ROUGE-2      | ROUGE-L      | ROUGE-Lsum  |
| ----------------------------------- | ------------ | ----------- | ------------ | ------------ | ------------ | ----------- |
| **Finetuned Llama-3.1-8B-Instruct** | **0.458633** | 0.032079    | **0.634257** | **0.333767** | **0.412934** | **0.41459** |
| **Base Llama-3.1-8B-Instruct**      | 0.387204     | **0.05343** | 0.535179     | 0.270515     | 0.349951     | 0.365346    |

## 5. モデルの展開

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

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

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

プロジェクトの最後の要素はStreamlitダッシュボードであり、アシスタントと直接対話するためのユーザーフレンドリーなインターフェースを提供します。

### デモの実行方法

ローカルマシンでこのデモを実行するには、以下の手順に従ってください：

1. **リポジトリをクローンします：**

```
git clone https://github.com/fpt-corp/ai-studio.git
cd tutorials/healthcare-and-food-chatbot
```

2. **必要なライブラリをインストールしてください：**

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

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

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

4. **Streamlitアプリケーションを実行する:**

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

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

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


---

# 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/chattobotto.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.
