Självstudie om Finjustering av Azure OpenAI GPT-3.5 Turbo

Den här självstudien beskriver hur du finjusterar en gpt-35-turbo-0613 modell.

I den här självstudiekursen får du lära du dig att:

  • Skapa exempel på finjusteringsdatauppsättningar.
  • Skapa miljövariabler för resursslutpunkten och API-nyckeln.
  • Förbered dina exempel på tränings- och valideringsdatauppsättningar för finjustering.
  • Ladda upp träningsfilen och valideringsfilen för finjustering.
  • Skapa ett finjusteringsjobb för gpt-35-turbo-0613.
  • Distribuera en anpassad finjusterad modell.

Förutsättningar

  • En Azure-prenumeration – Skapa en kostnadsfritt.
  • Åtkomst som beviljas till Azure OpenAI i den önskade Azure-prenumerationen För närvarande beviljas åtkomst till den här tjänsten endast av programmet. Du kan ansöka om åtkomst till Azure OpenAI genom att fylla i formuläret på https://aka.ms/oai/access.
  • Python 3.8 eller senare version
  • Följande Python-bibliotek: , , , , , time, openai, numpy. tiktokenosrequestsjson
  • OpenAI Python-biblioteket bör vara minst version: 0.28.1.
  • Jupyter Notebook
  • En Azure OpenAI-resurs i en region där gpt-35-turbo-0613 finjustering är tillgänglig. Om du inte har en resurs dokumenteras processen för att skapa en i vår resursdistributionsguide.
  • Finjusteringsåtkomst kräver Cognitive Services OpenAI-deltagare.
  • Om du inte redan har åtkomst till att visa kvoter och distribuerar modeller i Azure OpenAI Studio behöver du ytterligare behörigheter.

Viktigt!

Vi rekommenderar starkt att du granskar prisinformationen för finjustering innan du påbörjar den här självstudien för att se till att du är bekväm med de associerade kostnaderna. I testningen resulterade den här självstudien i att en träningstimme fakturerades, utöver de kostnader som är associerade med finjusteringsslutsatser och timvärdkostnaderna för att ha en finjusterad modell distribuerad. När du har slutfört självstudien bör du ta bort din finjusterade modelldistribution, annars kommer du att fortsätta att debiteras kostnaden per timme.

Konfigurera

Python-bibliotek

pip install openai requests tiktoken numpy

Hämta nyckel och slutpunkt

Om du vill göra ett anrop mot Azure OpenAI behöver du en slutpunkt och en nyckel.

Variabelnamn Värde
ENDPOINT Det här värdet finns i avsnittet Nycklar och slutpunkt när du undersöker resursen från Azure-portalen. Du kan också hitta värdet i Azure OpenAI Studio>Playground Code>View. En exempelslutpunkt är: https://docs-test-001.openai.azure.com/.
API-KEY Det här värdet finns i avsnittet Nycklar och slutpunkt när du undersöker resursen från Azure-portalen. Du kan använda antingen KEY1 eller KEY2.

Gå till din resurs i Azure-portalen. Avsnittet Nycklar och slutpunkter finns i avsnittet Resurshantering . Kopiera slutpunkten och åtkomstnyckeln eftersom du behöver båda för att autentisera dina API-anrop. Du kan använda antingen KEY1 eller KEY2. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten.

Skärmbild av översiktsgränssnittet för en Azure OpenAI-resurs i Azure-portalen med slutpunkten och åtkomstnycklarna inringade i rött.

Miljövariabler

setx AZURE_OPENAI_API_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE"
setx AZURE_OPENAI_ENDPOINT "REPLACE_WITH_YOUR_ENDPOINT_HERE"

Skapa en exempeldatauppsättning

Finjustering gpt-35-turbo-0613 kräver en speciellt formaterad JSONL-träningsfil. OpenAI innehåller följande exempel i dokumentationen:

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}

I det här exemplet ändrar vi detta något genom att ändra till:

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}

Även om dessa tre exempel är användbara för att ge dig det allmänna formatet, skulle du behöva fler exempel om du vill styra din anpassade finjusterade modell för att svara på ett liknande sätt. Vanligtvis vill du att minst 50 högkvalitativa exempel ska börja. Det är dock fullt möjligt att ha ett användningsfall som kan kräva 1 000-talets högkvalitativa träningsexempel för att lyckas.

I allmänhet kan en fördubbling av datamängdens storlek leda till en linjär ökning av modellkvaliteten. Men kom ihåg att exempel med låg kvalitet kan påverka prestanda negativt. Om du tränar modellen på en stor mängd interna data, utan att först rensa datamängden för endast exempel av högsta kvalitet, kan du få en modell som presterar mycket sämre än förväntat.

Du måste skapa två filer training_set.jsonl och validation_set.jsonl.

Skapa filerna i samma katalog som du kör Jupyter Notebook och kopiera innehållet i följande kodblock till motsvarande filer:

training_set.jsonl

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you may have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

validation_set.jsonl

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of Australia?"}, {"role": "assistant", "content": "It's Canberra, not Sydney. Shocking, I know!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Great Gatsby'?"}, {"role": "assistant", "content": "Some guy named F. Scott Fitzgerald. Ever heard of him?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the deepest part of the ocean?"}, {"role": "assistant", "content": "Mariana Trench, makes your swimming pool seem a bit shallow, doesn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who composed the 'Moonlight Sonata'?"}, {"role": "assistant", "content": "Just a little-known guy named Beethoven. No big deal."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What are the colors of the rainbow?"}, {"role": "assistant", "content": "ROYGBIV. Red, orange, yellow, green, blue, indigo, violet. Not that we learned this in preschool or anything!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the smallest planet?"}, {"role": "assistant", "content": "Meet Mercury, the runt of the solar system family."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Pride and Prejudice'?"}, {"role": "assistant", "content": "Do the words Jane Austen ring a bell? No? Well, she wrote it."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the largest desert?"}, {"role": "assistant", "content": "Antarctica. Surprise, surprise! Deserts aren't just full of sand, you know."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the longest river?"}, {"role": "assistant", "content": "The Nile River. It's not like it's famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of Germany?"}, {"role": "assistant", "content": "Berlin. Shocking news, right?"}]}

Nu måste du köra några preliminära kontroller på våra tränings- och valideringsfiler.

# Run preliminary checks

import json

# Load the training set
with open('training_set.jsonl', 'r', encoding='utf-8') as f:
    training_dataset = [json.loads(line) for line in f]

# Training dataset stats
print("Number of examples in training set:", len(training_dataset))
print("First example in training set:")
for message in training_dataset[0]["messages"]:
    print(message)

# Load the validation set
with open('validation_set.jsonl', 'r', encoding='utf-8') as f:
    validation_dataset = [json.loads(line) for line in f]

# Validation dataset stats
print("\nNumber of examples in validation set:", len(validation_dataset))
print("First example in validation set:")
for message in validation_dataset[0]["messages"]:
    print(message)

Produktionen:

Number of examples in training set: 10
First example in training set:
{'role': 'system', 'content': 'Clippy is a factual chatbot that is also sarcastic.'}
{'role': 'user', 'content': 'Who discovered America?'}
{'role': 'assistant', 'content': "Some chap named Christopher Columbus, as if they don't teach that in every school!"}

Number of examples in validation set: 10
First example in validation set:
{'role': 'system', 'content': 'Clippy is a factual chatbot that is also sarcastic.'}
{'role': 'user', 'content': "What's the capital of Australia?"}
{'role': 'assistant', 'content': "It's Canberra, not Sydney. Shocking, I know!"}

I det här fallet har vi bara 10 utbildnings- och 10 valideringsexempel, så även om detta visar den grundläggande mekaniken för finjustering av en modell är detta i osannolikt ett tillräckligt stort antal exempel för att ge en konsekvent märkbar effekt.

Nu kan du sedan köra ytterligare kod från OpenAI med hjälp av tiktoken-biblioteket för att verifiera antalet token. Enskilda exempel måste ligga kvar under gpt-35-turbo-0613 modellens indatatokengräns på 4 096 token.

# Validate token counts

import json
import tiktoken
import numpy as np
from collections import defaultdict

encoding = tiktoken.get_encoding("cl100k_base") # default encoding used by gpt-4, turbo, and text-embedding-ada-002 models

def num_tokens_from_messages(messages, tokens_per_message=3, tokens_per_name=1):
    num_tokens = 0
    for message in messages:
        num_tokens += tokens_per_message
        for key, value in message.items():
            num_tokens += len(encoding.encode(value))
            if key == "name":
                num_tokens += tokens_per_name
    num_tokens += 3
    return num_tokens

def num_assistant_tokens_from_messages(messages):
    num_tokens = 0
    for message in messages:
        if message["role"] == "assistant":
            num_tokens += len(encoding.encode(message["content"]))
    return num_tokens

def print_distribution(values, name):
    print(f"\n#### Distribution of {name}:")
    print(f"min / max: {min(values)}, {max(values)}")
    print(f"mean / median: {np.mean(values)}, {np.median(values)}")
    print(f"p5 / p95: {np.quantile(values, 0.1)}, {np.quantile(values, 0.9)}")

files = ['training_set.jsonl', 'validation_set.jsonl']

for file in files:
    print(f"Processing file: {file}")
    with open(file, 'r', encoding='utf-8') as f:
        dataset = [json.loads(line) for line in f]

    total_tokens = []
    assistant_tokens = []

    for ex in dataset:
        messages = ex.get("messages", {})
        total_tokens.append(num_tokens_from_messages(messages))
        assistant_tokens.append(num_assistant_tokens_from_messages(messages))

    print_distribution(total_tokens, "total tokens")
    print_distribution(assistant_tokens, "assistant tokens")
    print('*' * 50)

Produktionen:

Processing file: training_set.jsonl

#### Distribution of total tokens:
min / max: 47, 62
mean / median: 52.1, 50.5
p5 / p95: 47.9, 57.5

#### Distribution of assistant tokens:
min / max: 13, 30
mean / median: 17.6, 15.5
p5 / p95: 13.0, 21.9
**************************************************
Processing file: validation_set.jsonl

#### Distribution of total tokens:
min / max: 43, 65
mean / median: 51.4, 49.0
p5 / p95: 45.7, 56.9

#### Distribution of assistant tokens:
min / max: 8, 29
mean / median: 15.9, 13.5
p5 / p95: 11.6, 20.9
**************************************************

Ladda upp finjusteringsfiler

# Upload fine-tuning files

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),
  api_version = "2024-02-01"  # This API version or later is required to access fine-tuning for turbo/babbage-002/davinci-002
)

training_file_name = 'training_set.jsonl'
validation_file_name = 'validation_set.jsonl'

# Upload the training and validation dataset files to Azure OpenAI with the SDK.

training_response = client.files.create(
    file = open(training_file_name, "rb"), purpose="fine-tune"
)
training_file_id = training_response.id

validation_response = client.files.create(
    file = open(validation_file_name, "rb"), purpose="fine-tune"
)
validation_file_id = validation_response.id

print("Training file ID:", training_file_id)
print("Validation file ID:", validation_file_id)

Produktionen:

Training file ID: file-9ace76cb11f54fdd8358af27abf4a3ea
Validation file ID: file-70a3f525ed774e78a77994d7a1698c4b

Börja finjustera

Nu när finjusteringsfilerna har laddats upp kan du skicka in ditt finjusterande träningsjobb:

# Submit fine-tuning training job

response = client.fine_tuning.jobs.create(
    training_file = training_file_id,
    validation_file = validation_file_id,
    model = "gpt-35-turbo-0613", # Enter base model name. Note that in Azure OpenAI the model name contains dashes and cannot contain dot/period characters.
)

job_id = response.id

# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job will take some time to start and complete.

print("Job ID:", response.id)
print("Status:", response.status)
print(response.model_dump_json(indent=2))

Produktionen:

Job ID: ftjob-40e78bc022034229a6e3a222c927651c
Status: pending
{
  "hyperparameters": {
    "n_epochs": 2
  },
  "status": "pending",
  "model": "gpt-35-turbo-0613",
  "training_file": "file-90ac5d43102f4d42a3477fd30053c758",
  "validation_file": "file-e21aad7dddbc4ddc98ba35c790a016e5",
  "id": "ftjob-40e78bc022034229a6e3a222c927651c",
  "created_at": 1697156464,
  "updated_at": 1697156464,
  "object": "fine_tuning.job"
}

Spåra status för träningsjobb

Om du vill avsöka träningsjobbets status tills det är klart kan du köra:

# Track training status

from IPython.display import clear_output
import time

start_time = time.time()

# Get the status of our fine-tuning job.
response = client.fine_tuning.jobs.retrieve(job_id)

status = response.status

# If the job isn't done yet, poll it every 10 seconds.
while status not in ["succeeded", "failed"]:
    time.sleep(10)

    response = client.fine_tuning.jobs.retrieve(job_id)
    print(response.model_dump_json(indent=2))
    print("Elapsed time: {} minutes {} seconds".format(int((time.time() - start_time) // 60), int((time.time() - start_time) % 60)))
    status = response.status
    print(f'Status: {status}')
    clear_output(wait=True)

print(f'Fine-tuning job {job_id} finished with status: {status}')

# List all fine-tuning jobs for this resource.
print('Checking other fine-tune jobs for this resource.')
response = client.fine_tuning.jobs.list()
print(f'Found {len(response.data)} fine-tune jobs.')

Produktionen:

{
    "hyperparameters": {
        "n_epochs": 2
    },
    "status": "running",
    "model": "gpt-35-turbo-0613",
    "training_file": "file-9ace76cb11f54fdd8358af27abf4a3ea",
    "validation_file": "file-70a3f525ed774e78a77994d7a1698c4b",
    "id": "ftjob-0f4191f0c59a4256b7a797a3d9eed219",
    "created_at": 1695307968,
    "updated_at": 1695310376,
    "object": "fine_tuning.job"
}
Elapsed time: 40 minutes 45 seconds
Status: running

Det är inte ovanligt att träningen tar mer än en timme att slutföra. När träningen är klar ändras utdatameddelandet till:

Fine-tuning job ftjob-b044a9d3cf9c4228b5d393567f693b83 finished with status: succeeded
Checking other fine-tuning jobs for this resource.
Found 2 fine-tune jobs.

Kör följande för att få fullständiga resultat:

# Retrieve fine_tuned_model name

response = client.fine_tuning.jobs.retrieve(job_id)

print(response.model_dump_json(indent=2))
fine_tuned_model = response.fine_tuned_model

Distribuera finjusterad modell

Till skillnad från de tidigare Python SDK-kommandona i den här självstudien måste modelldistributionen göras med hjälp av REST-API:et, vilket kräver separat auktorisering, en annan API-sökväg och en annan API-version.

Du kan också distribuera din finjusterade modell med någon av de andra vanliga distributionsmetoderna som Azure OpenAI Studio eller Azure CLI.

variabel Definition
token Det finns flera sätt att generera en auktoriseringstoken. Den enklaste metoden för inledande testning är att starta Cloud Shell från Azure-portalen. Kör sedan az account get-access-token. Du kan använda den här token som din tillfälliga auktoriseringstoken för API-testning. Vi rekommenderar att du lagrar detta i en ny miljövariabel
prenumeration Prenumerations-ID för den associerade Azure OpenAI-resursen
resource_group Resursgruppens namn för din Azure OpenAI-resurs
resource_name Azure OpenAI-resursnamnet
model_deployment_name Det anpassade namnet på din nya finjusterade modelldistribution. Det här är det namn som ska refereras till i koden när du gör samtal om chattens slutförande.
fine_tuned_model Hämta det här värdet från ditt finjusterande jobbresultat i föregående steg. Det kommer att se ut som gpt-35-turbo-0613.ft-b044a9d3cf9c4228b5d393567f693b83. Du måste lägga till det värdet i deploy_data json.

Viktigt!

När du har distribuerat en anpassad modell tas distributionen bort om distributionen förblir inaktiv i mer än femton (15) dagar. Distributionen av en anpassad modell är inaktiv om modellen distribuerades för mer än femton (15) dagar sedan och inga slutföranden eller samtal om chattavslut gjordes till den under en kontinuerlig 15-dagarsperiod.

Borttagningen av en inaktiv distribution tar inte bort eller påverkar inte den underliggande anpassade modellen, och den anpassade modellen kan distribueras om när som helst. Enligt beskrivningen i prissättningen för Azure OpenAI Service medför varje anpassad (finjusterad) modell som distribueras en timbaserad värdkostnad oavsett om slutföranden eller chattavslut görs till modellen. Mer information om hur du planerar och hanterar kostnader med Azure OpenAI finns i vägledningen i Planera för att hantera kostnader för Azure OpenAI Service.

# Deploy fine-tuned model

import json
import requests

token = os.getenv("TEMP_AUTH_TOKEN")
subscription = "<YOUR_SUBSCRIPTION_ID>"
resource_group = "<YOUR_RESOURCE_GROUP_NAME>"
resource_name = "<YOUR_AZURE_OPENAI_RESOURCE_NAME>"
model_deployment_name = "YOUR_CUSTOM_MODEL_DEPLOYMENT_NAME"

deploy_params = {'api-version': "2023-05-01"}
deploy_headers = {'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json'}

deploy_data = {
    "sku": {"name": "standard", "capacity": 1},
    "properties": {
        "model": {
            "format": "OpenAI",
            "name": "<YOUR_FINE_TUNED_MODEL>", #retrieve this value from the previous call, it will look like gpt-35-turbo-0613.ft-b044a9d3cf9c4228b5d393567f693b83
            "version": "1"
        }
    }
}
deploy_data = json.dumps(deploy_data)

request_url = f'https://management.azure.com/subscriptions/{subscription}/resourceGroups/{resource_group}/providers/Microsoft.CognitiveServices/accounts/{resource_name}/deployments/{model_deployment_name}'

print('Creating a new deployment...')

r = requests.put(request_url, params=deploy_params, headers=deploy_headers, data=deploy_data)

print(r)
print(r.reason)
print(r.json())

Du kan kontrollera distributionens förlopp i Azure OpenAI Studio:

Skärmbild av de första DataFrame-tabellresultaten från CSV-filen.

Det är inte ovanligt att den här processen tar lite tid att slutföra när du hanterar distribution av finjusterade modeller.

Använda en distribuerad anpassad modell

När din finjusterade modell har distribuerats kan du använda den som vilken annan distribuerad modell som helst i antingen Chat Playground i Azure OpenAI Studio eller via API:et för chattens slutförande. Du kan till exempel skicka ett samtal för att slutföra chatten till din distribuerade modell, som du ser i följande Python-exempel. Du kan fortsätta att använda samma parametrar med din anpassade modell, till exempel temperatur och max_tokens, som du kan med andra distribuerade modeller.

# Use the deployed customized model

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),
  api_version = "2024-02-01"
)

response = client.chat.completions.create(
    model = "gpt-35-turbo-ft", # model = "Custom deployment name you chose for your fine-tuning model"
    messages = [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Does Azure OpenAI support customer managed keys?"},
        {"role": "assistant", "content": "Yes, customer managed keys are supported by Azure OpenAI."},
        {"role": "user", "content": "Do other Azure AI services support this too?"}
    ]
)

print(response.choices[0].message.content)

Ta bort distribution

Till skillnad från andra typer av Azure OpenAI-modeller har finjusterade/anpassade modeller en timvärdkostnad som är associerad med dem när de har distribuerats. Vi rekommenderar starkt att du tar bort modelldistributionen när du är klar med den här självstudien och har testat några samtal om att slutföra chatten mot din finjusterade modell.

Om du tar bort distributionen påverkas inte själva modellen, så du kan distribuera om den finjusterade modellen som du har tränat för den här självstudien när som helst.

Du kan ta bort distributionen i Azure OpenAI Studio via REST API, Azure CLI eller andra distributionsmetoder som stöds.

Felsökning

Hur gör jag för att aktivera finjustering? Är skapa en anpassad modell nedtonad i Azure OpenAI Studio?

För att få åtkomst till finjusteringen behöver du Tilldelat Cognitive Services OpenAI-deltagare. Även personer med behörigheter som tjänstadministratör på hög nivå skulle behöva det här kontot uttryckligen inställt för att få åtkomst till finjustering. Mer information finns i vägledningen för rollbaserad åtkomstkontroll.

Nästa steg