Salta el contingut

1. Guia Pràctica: Azure OpenAI (Capa Gratuïta)

1.1. Introducció

Azure OpenAI Service proporciona accés als models d'OpenAI (GPT-4, GPT-3.5, embeddings, DALL-E) a través de la infraestructura segura d'Azure. Inclou capacitats de xat, generació de text, resum, classificació i generació d'imatges.

1.1.1. Límits de la capa gratuïta

Important: Azure OpenAI no té una capa F0 clàssica. L'accés es fa mitjançant: - Azure for Students / Azure Free Tier: crèdits inicials de 100$ que es poden usar amb Azure OpenAI - Alguns models (com gpt-35-turbo) tenen preus molt baixos (~0,002$/1K tokens) - Per a pràctiques a l'aula, es recomana usar els crèdits gratuïts inicials


1.2. Prerequisits

  • Compte d'Azure amb crèdits actius (gratuïts o de pagament)
  • Sol·licitud d'accés aprovada (Azure OpenAI requereix aprovació: formulari)
  • Python 3.8 o superior

1.3. Pas 1: Crear el recurs Azure OpenAI

  1. Ves a portal.azure.com
  2. Cerca "Azure OpenAI"
  3. Fes clic a "Crear"
  4. Omple els camps:
  5. Grup de recursos: rg-ia-practica
  6. Regió: Sweden Central o East US (millor disponibilitat de models)
  7. Nom: un nom únic (p.ex. openai-practica-2024)
  8. Nivell de preus: Standard S0
  9. Fes clic a "Revisar i crear""Crear"

1.3.1. Desplegar un model

  1. Ves al recurs creat → "Azure OpenAI Studio" (o oai.azure.com)
  2. Ves a "Desplegaments""Crear desplegament"
  3. Selecciona el model: gpt-35-turbo (el més econòmic)
  4. Dona-li un nom de desplegament: gpt35-practica
  5. Fes clic a "Crear"

Copia: - Endpoint: https://<nom>.openai.azure.com/ - Clau API: des de "Claus i punt de connexió" - Nom del desplegament: el que has posat (p.ex. gpt35-practica)


1.4. Pas 2: Instal·lar les dependències

Bash
pip install openai python-dotenv

1.5. Pas 3: Xat bàsic amb GPT

Crea un fitxer openai_chat.py:

Python
from openai import AzureOpenAI

# Credencials
client = AzureOpenAI(
    azure_endpoint="https://<el-teu-endpoint>.openai.azure.com/",
    api_key="<la-teva-clau>",
    api_version="2024-02-01"
)

DEPLOYMENT_NAME = "gpt35-practica"  # El nom del teu desplegament

# Missatge al model
response = client.chat.completions.create(
    model=DEPLOYMENT_NAME,
    messages=[
        {
            "role": "system",
            "content": "Ets un assistent útil que respon sempre en català."
        },
        {
            "role": "user",
            "content": "Explica'm en 3 frases què és la intel·ligència artificial."
        }
    ],
    temperature=0.7,
    max_tokens=300
)

print(response.choices[0].message.content)
print(f"\nTokens usats: {response.usage.total_tokens}")

1.6. Pas 4: Conversa amb historial

Crea un fitxer openai_conversa.py:

Python
from openai import AzureOpenAI

client = AzureOpenAI(
    azure_endpoint="https://<el-teu-endpoint>.openai.azure.com/",
    api_key="<la-teva-clau>",
    api_version="2024-02-01"
)

DEPLOYMENT_NAME = "gpt35-practica"

# Historial de la conversa
messages = [
    {"role": "system", "content": "Ets un professor de matemàtiques amable que explica conceptes de forma senzilla en català."}
]

print("Conversa amb Azure OpenAI (escriu 'sortir' per acabar)\n")

while True:
    user_input = input("Tu: ")
    if user_input.lower() in ["sortir", "exit", "quit"]:
        print("Fins aviat!")
        break

    messages.append({"role": "user", "content": user_input})

    response = client.chat.completions.create(
        model=DEPLOYMENT_NAME,
        messages=messages,
        temperature=0.7,
        max_tokens=500
    )

    assistant_message = response.choices[0].message.content
    messages.append({"role": "assistant", "content": assistant_message})

    print(f"\nAssistent: {assistant_message}\n")

1.7. Pas 5: Tasques pràctiques amb prompts

1.7.1. Resum de text

Python
def resumir_text(client, deployment, text, max_paraules=100):
    response = client.chat.completions.create(
        model=deployment,
        messages=[
            {"role": "system", "content": "Ets un assistent especialitzat en resumir textos en català."},
            {"role": "user", "content": f"Resumeix el següent text en màxim {max_paraules} paraules:\n\n{text}"}
        ],
        temperature=0.3,
        max_tokens=200
    )
    return response.choices[0].message.content

1.7.2. Classificació de text

Python
def classificar_intencio(client, deployment, text):
    response = client.chat.completions.create(
        model=deployment,
        messages=[
            {
                "role": "system",
                "content": """Classifica la intencions del text en una de les categories:
                QUEIXA, PREGUNTA, AGRAÏMENT, SOL·LICITUD, ALTRE.
                Respon NOMÉS amb la categoria, res més."""
            },
            {"role": "user", "content": text}
        ],
        temperature=0,
        max_tokens=20
    )
    return response.choices[0].message.content.strip()

# Exemple d'ús
textos = [
    "No funciona el producte que vaig comprar ahir!",
    "A quina hora obriu demà?",
    "Moltes gràcies per l'ajuda, sou molt amables.",
    "Voldria demanar una factura duplicada."
]

for text in textos:
    print(f"'{text}' → {classificar_intencio(client, DEPLOYMENT_NAME, text)}")

1.8. Bones pràctiques per controlar costos

  • Usa max_tokens sempre per limitar la longitud de la resposta
  • Usa temperature=0 per a tasques de classificació (respostes més curtes i deterministes)
  • Monitoritza el consum a portal.azure.com → el teu recurs → "Mètriques"
  • Configura alertes de cost al portal per no superar el pressupost

1.9. Exercicis proposats

  1. Nivell bàsic: Crea un script que generi 5 idees de noms per a una empresa tecnològica.
  2. Nivell mitjà: Implementa un corrector d'ortografia i gramàtica en català que, donat un text amb errors, el retorni corregit i expliqui els canvis fets.
  3. Nivell avançat: Construeix un chatbot de suport tècnic que mantingui l'historial de conversa i pugui respondre preguntes sobre un producte fictici descrit en el prompt de sistema.

1.10. Errors habituals

Error Causa Solució
AuthenticationError Clau incorrecta Verifica la clau al portal
DeploymentNotFound Nom de desplegament incorrecte Verifica el nom exacte
RateLimitError Massa peticions per minut Afegeix time.sleep(1) entre crides
ContextLengthExceeded Missatges massa llargs Redueix l'historial o max_tokens

1.11. Recursos addicionals