This project provides a complete pipeline for fine-tuning small language models for agentic use cases with Model Context Protocol (MCP) server integration and external tool usage.
Fine-tune small language models to create an intelligent agent capable of:
- Tool Selection: Automatically choose appropriate tools for tasks
- Parameter Extraction: Extract correct parameters for tool calls
- Multi-step Reasoning: Chain multiple tool calls to complete complex tasks
- MCP Integration: Seamlessly work with external MCP servers
- Error Handling: Gracefully handle tool failures and edge cases
User Request β SLM Agent β Tool Selection β MCP Client β External Tools
β β
Final Response β Response Generation β Tool Results β
# Clone and navigate to project
git clone <repository>
cd model-agent-finetuning
# Create virtual environment
python -m venv model-env
source model-env/bin/activate # Windows: model-env\Scripts\activate
# Run setup script
python scripts/setup.pyReview and customize config/training_config.yaml:
- Adjust batch sizes based on your GPU memory
- Modify LoRA parameters for your use case
- Set training epochs and learning rate
# Train with default settings
python scripts/train_model.py --config config/training_config.yaml
# Custom training
python scripts/train_model.py \
--config config/training_config.yaml \
--data-samples 10000 \
--wandb-project my-model-agent# Comprehensive evaluation
python scripts/evaluate_model.py \
--model-path ./models/model-agent-final \
--run-benchmarks
# Generate evaluation dataset
python scripts/evaluate_model.py \
--model-path ./models/model-agent-final \
--generate-eval-data \
--eval-samples 500# Interactive demo
python scripts/inference_demo.py \
--model-path ./models/model-agent-final \
--mode interactive
# Run benchmarks
python scripts/inference_demo.py \
--model-path ./models/model-agent-final \
--mode benchmarkThe model is evaluated on multiple dimensions:
- Tool Selection Accuracy: >85% (correct tool choice)
- Parameter Extraction: >90% (accurate parameter parsing)
- Task Completion Rate: >80% (successful end-to-end execution)
- Hallucination Rate: <10% (factual accuracy)
- Response Time: <5s average (performance)
- Single Tool Usage: Simple, direct tool calls
- Multi-step Tasks: Complex workflows requiring multiple tools
- Error Handling: Graceful failure recovery
- Context Maintenance: Coherence across conversation turns
- Update MCP Client (
src/inference/mcp_client.py):
self.available_tools["new_tool"] = {
"server": "tool_server",
"endpoint": "/new_endpoint",
"description": "Tool description",
"parameters": {
"param1": {"type": "string", "required": True}
}
}- Update Dataset Builder (
src/data/dataset_builder.py):
# Add tool scenarios
tool_scenarios["new_tool"] = ["scenario1", "scenario2"]- Regenerate Training Data:
python scripts/train_model.py --config config/training_config.yamlKey parameters in config/training_config.yaml:
lora:
r: 16 # LoRA rank (8-64)
lora_alpha: 32 # LoRA scaling (16-64)
lora_dropout: 0.1 # Dropout rate (0.05-0.2)
training:
learning_rate: 2.0e-4 # Learning rate (1e-4 to 5e-4)
num_train_epochs: 3 # Training epochs (2-5)
per_device_train_batch_size: 4 # Batch size (2-8)slm-agent/
βββ requirements.txt # Dependencies
βββ README.md # This file
βββ config/
β βββ training_config.yaml # Training configuration
βββ src/
β βββ data/ # Data processing modules
β β βββ dataset_builder.py # Training data generation
β β βββ data_formatter.py # Data formatting utilities
β βββ training/ # Training modules
β β βββ trainer.py # Main training logic
β β βββ evaluation.py # Model evaluation
β βββ inference/ # Inference modules
β βββ model_handler.py # Model inference handler
β βββ mcp_client.py # MCP client implementation
βββ scripts/
β βββ setup.py # Environment setup
β βββ train_model.py # Training script
β βββ evaluate_model.py # Evaluation script
β βββ inference_demo.py # Demo script
βββ data/ # Data directories
βββ raw/ # Raw data files
βββ processed/ # Processed datasets
βββ evaluation/ # Evaluation datasets
# Generate custom training data
python -c "
from src.data.dataset_builder import AgenticDatasetBuilder
builder = AgenticDatasetBuilder()
dataset = builder.generate_dataset(5000)
builder.save_dataset(dataset, 'custom_dataset.json')
"# Quick training run for testing
python scripts/train_model.py \
--config config/training_config.yaml \
--data-samples 1000 \
--wandb-project model-experiment# Detailed evaluation with custom metrics
python scripts/evaluate_model.py \
--model-path ./results/checkpoint-1000 \
--eval-dataset ./data/custom/eval.json \
--run-benchmarks# Export optimized model
python -c "
from src.training.trainer import AgentTrainer
trainer = AgentTrainer('config/training_config.yaml')
trainer.save_model_for_inference('./models/production')
"GPU Memory Errors:
# Reduce batch sizes in config/training_config.yaml
per_device_train_batch_size: 2
gradient_accumulation_steps: 8Slow Training:
# Enable mixed precision
bf16: true
fp16: false # Use bf16 instead of fp16 for better stabilityTool Call Parsing Issues:
- Check tool usage format in training data
- Validate JSON parameter formatting
- Ensure consistent tool naming
Model Not Learning:
- Increase learning rate to 3e-4
- Add more diverse training examples
- Check data quality and formatting
Memory Usage:
- Use gradient checkpointing:
gradient_checkpointing: true - Enable 4-bit quantization:
load_in_4bit: true - Reduce sequence length:
max_seq_length: 1024
Training Speed:
- Increase batch size if memory allows
- Use multiple GPUs with
--multi_gpu - Enable compilation:
torch_compile: true(PyTorch 2.0+)
The project includes comprehensive W&B logging:
- Training/validation loss curves
- Tool usage accuracy metrics
- Parameter extraction success rates
- Response quality scores
- Hardware utilization
Access your runs at: https://wandb.ai/<username>/<project>
Check training progress:
# View training logs
tail -f training.log
# Monitor GPU usage
nvidia-smi -l 1
# Check disk space
df -h- Fork the repository
- Create feature branch:
git checkout -b feature/new-capability - Add tests: Ensure new features have appropriate test coverage
- Submit PR: Include detailed description and test results
# In src/training/evaluation.py
def _evaluate_custom_metric(self, sample, result):
"""Add your custom evaluation logic."""
return score
# Update evaluate_full_model to include new metric