Nguyen Trong Lap
Recreate history without binary blobs
eeb0f9c

A newer version of the Gradio SDK is available: 6.1.0

Upgrade

Fine-tuning Module 🎯

Train custom models on your healthcare conversation data.

Overview

This module automatically collects conversation data and enables fine-tuning of specialized healthcare agents using OpenAI's fine-tuning API.

Features

  • Automatic Data Collection - Logs all agent conversations
  • Quality Filtering - Filter by user ratings
  • OpenAI Format Export - Ready for fine-tuning
  • Multi-Agent Support - Train each agent separately
  • Job Management - Track fine-tuning progress

How It Works

1. Data Collection (Automatic)

The system automatically logs conversations when enabled:

# In coordinator (already integrated)
coordinator = AgentCoordinator(enable_data_collection=True)

Data is stored in fine_tuning/data/ organized by agent:

fine_tuning/data/
├── nutrition/
│   ├── conversations_20241025.jsonl
│   └── multi_turn_20241025.jsonl
├── exercise/
├── symptom/
├── mental_health/
└── general_health/

2. Export Training Data

Export conversations in OpenAI fine-tuning format:

from fine_tuning import get_data_collector

collector = get_data_collector()

# Export all conversations
training_file = collector.export_for_openai_finetuning(
    agent_name='nutrition_agent',
    output_file='nutrition_training.jsonl'
)

# Export only high-quality conversations (rating >= 4.0)
training_file = collector.export_for_openai_finetuning(
    agent_name='nutrition_agent',
    min_quality_rating=4.0
)

3. Fine-tune Agent

Option A: Using Script (Recommended)

# Fine-tune nutrition agent
python scripts/fine_tune_agent.py --agent nutrition

# With quality filtering
python scripts/fine_tune_agent.py --agent nutrition --min-rating 4.0

# Start job without waiting
python scripts/fine_tune_agent.py --agent exercise --no-wait

Option B: Using Python API

from fine_tuning import fine_tune_agent

# Fine-tune and wait for completion
model_id = fine_tune_agent(
    agent_name='nutrition',
    training_file='nutrition_training.jsonl',
    model='gpt-4o-mini-2024-07-18',
    wait_for_completion=True
)

print(f"Fine-tuned model: {model_id}")

4. Use Fine-tuned Model

Update agent configuration to use the fine-tuned model:

# config/settings.py or agent file
MODEL = 'ft:gpt-4o-mini-2024-07-18:your-org:nutrition:abc123'

Data Format

Conversation Entry

{
  "timestamp": "2024-10-25T10:00:00",
  "agent": "nutrition_agent",
  "user_message": "Tôi muốn giảm cân",
  "agent_response": "Để giảm cân hiệu quả...",
  "user_data": {
    "age": 25,
    "gender": "male",
    "weight": 70,
    "height": 175
  },
  "metadata": {
    "rating": 5.0,
    "feedback": "Very helpful"
  }
}

OpenAI Fine-tuning Format

{
  "messages": [
    {"role": "system", "content": "You are a nutrition specialist."},
    {"role": "user", "content": "Tôi muốn giảm cân"},
    {"role": "assistant", "content": "Để giảm cân hiệu quả..."}
  ]
}

API Reference

ConversationDataCollector

from fine_tuning import get_data_collector

collector = get_data_collector()

# Log single conversation
collector.log_conversation(
    agent_name='nutrition_agent',
    user_message='User question',
    agent_response='Agent answer',
    user_data={'age': 25},
    metadata={'rating': 5.0}
)

# Log multi-turn conversation
collector.log_multi_turn_conversation(
    agent_name='nutrition_agent',
    conversation_history=[
        ('User msg 1', 'Agent response 1'),
        ('User msg 2', 'Agent response 2')
    ],
    user_data={'age': 25}
)

# Get conversation counts
counts = collector.get_conversation_count()
# {'nutrition': 150, 'exercise': 89, ...}

# Export for fine-tuning
training_file = collector.export_for_openai_finetuning(
    agent_name='nutrition_agent',
    min_quality_rating=4.0
)

FineTuningTrainer

from fine_tuning import FineTuningTrainer

trainer = FineTuningTrainer()

# Upload training file
file_id = trainer.upload_training_file('training.jsonl')

# Create fine-tuning job
job_id = trainer.create_fine_tuning_job(
    training_file_id=file_id,
    model='gpt-4o-mini-2024-07-18',
    suffix='nutrition-v1'
)

# Check job status
status = trainer.check_job_status(job_id)

# Wait for completion
result = trainer.wait_for_completion(job_id)

# List all fine-tuned models
models = trainer.list_fine_tuned_models()

Best Practices

1. Data Quality

  • ✅ Collect at least 100-200 conversations per agent
  • ✅ Include diverse user queries and scenarios
  • ✅ Filter by quality rating (>= 4.0 recommended)
  • ✅ Review and clean data before fine-tuning

2. Training

  • ✅ Start with gpt-4o-mini (faster, cheaper)
  • ✅ Use descriptive suffixes (e.g., nutrition-v1)
  • ✅ Monitor training progress
  • ✅ Test fine-tuned model before deployment

3. Evaluation

  • ✅ Compare fine-tuned vs base model responses
  • ✅ Test on held-out conversations
  • ✅ Collect user feedback on fine-tuned model
  • ✅ Iterate based on results

Cost Estimation

Fine-tuning costs (OpenAI pricing):

  • Training: ~$0.008 per 1K tokens
  • Usage: Same as base model

Example:

  • 200 conversations × 500 tokens avg = 100K tokens
  • Training cost: ~$0.80
  • Usage: Same as gpt-4o-mini

Troubleshooting

No conversations collected

# Check if data collection is enabled
# In coordinator initialization:
coordinator = AgentCoordinator(enable_data_collection=True)

Training file format error

# Validate JSONL format
python -c "import json; [json.loads(line) for line in open('file.jsonl')]"

Fine-tuning job failed

# Check job status
trainer = FineTuningTrainer()
status = trainer.check_job_status('job-id')
print(status)

Examples

Complete Workflow

from fine_tuning import get_data_collector, fine_tune_agent

# 1. Check collected data
collector = get_data_collector()
counts = collector.get_conversation_count()
print(f"Nutrition conversations: {counts.get('nutrition', 0)}")

# 2. Export training data
training_file = collector.export_for_openai_finetuning(
    agent_name='nutrition_agent',
    min_quality_rating=4.0
)

# 3. Fine-tune
model_id = fine_tune_agent(
    agent_name='nutrition',
    training_file=training_file,
    suffix='v1',
    wait_for_completion=True
)

# 4. Update configuration
print(f"Update MODEL to: {model_id}")

Future Enhancements

  • Automatic quality scoring
  • Data augmentation
  • Multi-model comparison
  • A/B testing framework
  • Continuous learning pipeline