Amazon Bedrock's fine-tuning capability lets you adapt foundation models like Claude or Titan to your specific domain without managing infrastructure. This tutorial walks through customizing a text generation model using your proprietary data - perfect for startups and enterprises alike.
Objective: Configure IAM roles and training data storage
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:CreateModelCustomizationJob",
"s3:GetObject",
"s3:PutObject"
],
"Resource": "*"
}
]
}
aws bedrock list-foundation-models \
--query "modelSummaries[?byOutputModality=='TEXT']" \
--region us-east-1
Dataset: Custom FAQ pairs in JSONL format
import json
training_data = [
{"input": "What's return policy?", "output": "30-day returns for unused items"},
{"input": "Do you price match?", "output": "We match authorized retailers"}
]
with open("train.jsonl", "w") as f:
for item in training_data:
f.write(json.dumps(item) + "\n")
aws s3 cp train.jsonl s3://your-bucket/fine-tuning/data/
Key Parameters:
training_config = {
"baseModelIdentifier": "anthropic.claude-v2",
"customModelName": "support-bot-v1",
"trainingDataConfig": {"s3Uri": "s3://your-bucket/fine-tuning/data/train.jsonl"},
"hyperParameters": {
"epochCount": "5",
"batchSize": "32",
"learningRate": "0.0001"
},
"outputDataConfig": {"s3Uri": "s3://your-bucket/fine-tuning/output/"}
}
aws bedrock create-model-customization-job \
--job-name "support-bot-training" \
--role-arn "arn:aws:iam::123456789012:role/BedrockFineTuningRole" \
--cli-input-json file://training_config.json \
--region us-east-1
aws bedrock get-model-customization-job \
--job-identifier "support-bot-training" \
--region us-east-1
aws cloudwatch get-metric-data \
--metric-data-queries '[
{
"Id": "loss",
"MetricStat": {
"Metric": {
"Namespace": "AWS/Bedrock",
"MetricName": "TrainingLoss",
"Dimensions": [{"Name": "JobName", "Value": "support-bot-training"}]
},
"Period": 300,
"Stat": "Average"
}
}
]' \
--start-time $(date -u +"%Y-%m-%dT%H:%M:%SZ" -d "-1 hour") \
--end-time $(date -u +"%Y-%m-%dT%H:%M:%SZ")
aws bedrock create-provisioned-model-throughput \
--model-id "arn:aws:bedrock:us-east-1::custom-model/support-bot-v1" \
--provisioned-model-name "support-bot-prod" \
--model-units 1 \
--region us-east-1
import boto3
bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')
response = bedrock.invoke_model(
modelId="support-bot-v1",
body=json.dumps({
"prompt": "\n\nHuman: What's your warranty period?\n\nAssistant:",
"max_tokens_to_sample": 300
})
)
print(json.loads(response['body'].read())['completion'])
aws bedrock create-model-evaluation-job \
--job-name "support-bot-eval" \
--model-identifier "support-bot-v1" \
--evaluation-data-config '{"s3Uri": "s3://your-bucket/eval/data.jsonl"}' \
--evaluation-metrics "Accuracy,Precision" \
--region us-east-1
test_cases = [
"How do I reset password?",
"Where's my order confirmation?"
]
for query in test_cases:
response = bedrock.invoke_model(
modelId="support-bot-v1",
body=json.dumps({"prompt": f"\n\nHuman: {query}\n\nAssistant:"})
)
print(f"Q: {query}\nA: {json.loads(response['body'].read())['completion']}\n")
Best Practices:
Next Steps: Explore Bedrock's Advanced Fine-Tuning Options
Category: AWS
Similar Articles