Módulo 3: LM Studio - Introducción

Migración de Código OpenAI a LM Studio

Descripción

Tomarás el chatbot del Módulo 2 y lo migrarás a LM Studio local. Cambio mínimo de código, máximo impacto.

Tiempo: 20 minutos
Dificultad: Baja


🎯 Objetivos

  • ✅ Migrar chatbot Módulo 2 a LM Studio
  • ✅ Verificar funcionamiento local
  • ✅ Medir diferencias de performance
  • ✅ Comparar costos

🔄 Paso 1: Código Original (Módulo 2)

# chatbot_openai.py (Módulo 2)
from openai import OpenAI
import os
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

messages = [
    {"role": "system", "content": "Eres un asistente útil."}
]

def chat(user_message):
    messages.append({"role": "user", "content": user_message})
    
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=messages
    )
    
    assistant_message = response.choices[0].message.content
    messages.append({"role": "assistant", "content": assistant_message})
    
    return assistant_message

# CLI
while True:
    user_input = input("Tú: ")
    if user_input.lower() == "salir":
        break
    response = chat(user_input)
    print(f"Bot: {response}\n")

✅ Paso 2: Código Migrado (LM Studio)

# chatbot_lmstudio.py (Módulo 3)
from openai import OpenAI

# ÚNICO CAMBIO: base_url y api_key
client = OpenAI(
    base_url="http://localhost:1234/v1",
    api_key="not-needed"
)

messages = [
    {"role": "system", "content": "Eres un asistente útil."}
]

def chat(user_message):
    messages.append({"role": "user", "content": user_message})
    
    response = client.chat.completions.create(
        model="mistral-7b-instruct",  # Cambia a modelo local
        messages=messages
    )
    
    assistant_message = response.choices[0].message.content
    messages.append({"role": "assistant", "content": assistant_message})
    
    return assistant_message

# CLI (IDÉNTICO)
while True:
    user_input = input("Tú: ")
    if user_input.lower() == "salir":
        break
    response = chat(user_input)
    print(f"Bot: {response}\n")

Cambios totales: 3 líneas

  1. base_url apunta a localhost
  2. api_key no necesaria
  3. model cambia a modelo local

📊 Paso 3: Comparación de Performance

Test script:

import time
from openai import OpenAI

# OpenAI Cloud
client_cloud = OpenAI(api_key="sk-...")

# LM Studio Local
client_local = OpenAI(
    base_url="http://localhost:1234/v1",
    api_key="not-needed"
)

def test_latency(client, model, name):
    start = time.time()
    response = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": "Hola"}]
    )
    latency = time.time() - start
    print(f"{name}: {latency:.2f}s")
    return latency

# Test
lat_cloud = test_latency(client_cloud, "gpt-3.5-turbo", "OpenAI Cloud")
lat_local = test_latency(client_local, "mistral-7b-instruct", "LM Studio")

print(f"\nDiferencia: {lat_local/lat_cloud:.1f}x más lento (local)")

Output esperado:

OpenAI Cloud: 1.5s
LM Studio: 8.2s

Diferencia: 5.5x más lento (local)

💰 Paso 4: Comparación de Costos

1000 queries (500 tokens promedio):

OpenAI API:

1000 queries × 500 tokens × $0.002/1k = $1.00

LM Studio:

$0 (costo operativo)

Ahorro: $1.00 por cada 1000 queries

Break-even: Inmediato (costo $0 desde query 1)


🎯 Cuándo Usar Cada Opción

Usa OpenAI API cuando:

  • Necesitas máxima calidad (GPT-4)
  • Latency crítica (<2s)
  • No tienes hardware potente
  • Prototipo rápido

Usa LM Studio cuando:

  • Privacidad crítica (on-premise)
  • Budget $0 (side projects)
  • Alto volumen (>100k queries/mes)
  • Desarrollo local (sin internet)

🔄 Paso 5: Estrategia Híbrida

import os

# Detectar entorno
IS_PRODUCTION = os.getenv("ENV") == "production"

if IS_PRODUCTION:
    # Producción: OpenAI (calidad máxima)
    client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
    model = "gpt-3.5-turbo"
else:
    # Desarrollo: LM Studio (gratis, local)
    client = OpenAI(
        base_url="http://localhost:1234/v1",
        api_key="not-needed"
    )
    model = "mistral-7b-instruct"

# Resto del código idéntico
response = client.chat.completions.create(
    model=model,
    messages=[...]
)

Ventaja: Desarrolla gratis localmente, deploy a cloud para producción.


✅ Resumen

  • Migración trivial (3 líneas cambiadas)
  • Código 95% reutilizable
  • Trade-off: Velocidad vs Costo
  • Estrategia híbrida posible

Siguiente: 07-comparacion-performance.md