7. Creación de Proyecto IA Básico - 4

7: Creación de Proyecto IA Básico - 4

🎯 Tema: Limitando la IA a Documentos Específicos (RAG Básico)

📚 Introducción: De Chatbot General a Asistente Especializado

¡Hola muchachos! Hoy vamos a hacer algo increíble: transformaremos nuestra IA de "sabe todo" a "experta en un tema específico".

Analogía: Imagina que tu IA era como un profesor que sabía de todo (matemáticas, historia, ciencia). Ahora lo convertiremos en un especialista en Laravel que solo habla de lo que está en su manual de trabajo.


🔍 Parte 1: El Problema que Resolvemos

Situación Actual vs. Deseada:

text
ANTES (IA general):
┌─────────────────────────────────┐
│ Usuario: ¿Qué es Python?        │
│ IA: Python es un lenguaje...    │ ✅
│ Usuario: ¿Capital de Francia?   │
│ IA: París                       │ ✅
│ Usuario: ¿Receta de pizza?      │
│ IA: Necesitas harina...         │ ✅
└─────────────────────────────────┘

AHORA (IA especializada):
┌─────────────────────────────────┐
│ Usuario: ¿Qué es Python?        │
│ IA: ❌ No está en el documento  │
│ Usuario: ¿Qué es Laravel?       │
│ IA: Laravel es un framework...  │ ✅
│ Usuario: ¿Qué son rutas?        │
│ IA: Son un sistema de Laravel...│ ✅
└─────────────────────────────────┘

¿Por qué queremos esto?

  • 🏥 Consultorio dental: Que solo hable de tratamientos y precios

  • 🛒 Tienda online: Que solo conozca tus productos

  • 📚 Biblioteca: Que solo cite libros específicos

  • 🏢 Empresa: Que solo use información interna


📄 Parte 2: Creando Nuestra Base de Conocimiento

Paso 1: El Archivo de Información

Crea un archivo info.txt en la misma carpeta:

txt
Laravel es un framework de PHP para construir 
aplicaciones web de manera rápida y elegante.

Características principales:
- Sistema de rutas poderoso
- ORM llamado Eloquent
- Motor de plantillas Blade
- Arquitectura MVC (Modelo-Vista-Controlador)
- Sistema de migraciones de base de datos

Laravel facilita tareas comunes como autenticación,
enrutamiento, sesiones y caché, permitiendo a los 
desarrolladores enfocarse en la lógica de negocio.

Estructura de carpetas:

text
mi_chatbot/
├── app.py
├── info.txt          ← ¡NUEVO! Nuestra base de conocimiento
└── templates/
    └── index.html

🔧 Parte 3: La Función que Lee Nuestro Documento

Código Explicado Paso a Paso:

python
def cargar_contenido():
    """
    Esta función lee nuestro archivo info.txt
    y devuelve todo el texto como una cadena
    """
    with open("info.txt", "r", encoding="UTF-8") as archivo:
        return archivo.read()

Desglose visual:

text
┌─────────────────────────────────────────┐
│ FUNCIÓN: cargar_contenido()            │
├─────────────────────────────────────────┤
│ 1. Abre el archivo "info.txt"          │
│    - Modo lectura ("r")                │
│    - Codificación UTF-8 (para tildes)  │
│                                         │
│ 2. Lee TODO el contenido               │
│    archivo.read() → "Laravel es un..." │
│                                         │
│ 3. Devuelve el texto                   │
│    return contenido                    │
└─────────────────────────────────────────┘

Analogía:
Esta función es como un asistente que memoriza un libro. Cada vez que lo llamas, te lee el libro completo.


🎭 Parte 4: El Truco Mágico: El Prompt Especializado

Cómo "engañamos" a la IA para que sea especialista:

python
# 1. Cargamos nuestro conocimiento especializado
contexto = cargar_contenido()

# 2. Creamos un prompt MUY específico
prompt_especializado = f"""
Responde solo basándote en el siguiente texto.
Si no sabes la respuesta, di que no está en el documento.

Texto:
{contexto}

Pregunta: {user_input}
"""

Esquema del Prompt:

text
┌─────────────────────────────────────────────────┐
│ INSTRUCCIÓN FUERTE:                            │
│ "Responde SOLO basándote en el siguiente texto"│
│ "Si no sabes, di 'No está en el documento'"    │
│                                                 │
│ ─────────────────────────────────────────────── │
│ TEXTO DE CONTEXTO:                             │
│ [Todo el contenido de info.txt]                │
│                                                 │
│ ─────────────────────────────────────────────── │
│ PREGUNTA DEL USUARIO:                          │
│ [Lo que escribió el usuario]                   │
└─────────────────────────────────────────────────┘

Ejemplo real:

python
# Si contexto = "Laravel es un framework de PHP..."
# Y user_input = "¿Qué es Laravel?"

prompt_especializado = """
Responde solo basándote en el siguiente texto.
Si no sabes la respuesta, di que no está en el documento.

Texto:
Laravel es un framework de PHP para construir 
aplicaciones web de manera rápida y elegante.

Pregunta: ¿Qué es Laravel?
"""

🔄 Parte 5: Flujo Completo del Sistema

Diagrama del Proceso:

text
┌─────────────┐    ┌──────────────┐    ┌─────────────┐
│   Usuario   │───▶│   Formulario │───▶│    Flask    │
│  Pregunta   │    │    HTML      │    │   app.py    │
└─────────────┘    └──────────────┘    └─────────────┘
                                             │
         ┌───────────────────────────────────┘
         ▼
┌─────────────────┐    ┌──────────────────┐    ┌─────────────┐
│ Cargar contexto │───▶│ Crear prompt     │───▶│   Ollama    │
│  (info.txt)     │    │ especializado    │    │    IA       │
└─────────────────┘    └──────────────────┘    └─────────────┘
                                             │
         ┌───────────────────────────────────┘
         ▼
┌─────────────────┐    ┌──────────────────┐    ┌─────────────┐
│ Validar si      │───▶│ Mostrar respuesta│◀───│ Devolver    │
│ sabe responder  │    │ en la página     │    │ respuesta   │
└─────────────────┘    └──────────────────┘    └─────────────┘

🧪 Parte 6: Pruebas y Resultados

Tabla de Pruebas Realizadas:

PreguntaRespuesta de la IA¿Correcto?Explicación
"¿Qué es Laravel?""Laravel es un framework de PHP..."SÍ está en info.txt
"¿Qué son rutas?""Son un sistema que tiene Laravel..."SÍ está (implícitamente)
"¿Qué es MVC?""MVC es un patrón utilizado por Laravel"SÍ está en el texto
"¿Qué es Python?""No está en el documento"NO está en info.txt
"¿Qué es el aceite?""Eso no está en el documento"NO está en info.txt

Ejemplos de Conversación:

text
Tú: ¿Qué es Laravel?
IA: Laravel es un framework de PHP para construir 
    aplicaciones web de manera rápida y elegante.

Tú: ¿Qué son las migraciones?
IA: Laravel tiene un sistema de migraciones de 
    base de datos que facilita...

Tú: ¿Cuál es la capital de Francia?
IA: No está en el documento.

Tú: ¿Cómo se hace una pizza?
IA: Eso no está en el documento.

💼 Parte 7: Aplicaciones Prácticas del Mundo Real

Casos de Uso Comunes:

python
# 1. CONSULTORIO DENTAL (dentista.txt)
"""
- Limpieza dental: $50
- Empaste: $80
- Ortodoncia: $1500
- Blanqueamiento: $200
"""

# 2. TIENDA ONLINE (productos.txt)
"""
- iPhone 15: $999
- Laptop Dell: $1200
- Audífonos Sony: $200
- Tablet Samsung: $300
"""

# 3. RESTAURANTE (menu.txt)
"""
- Pizza Margarita: $12
- Hamburguesa: $8
- Ensalada César: $10
- Pasta Carbonara: $14
"""

# 4. ESCUELA (cursos.txt)
"""
- Matemáticas: Lunes 9-11am
- Historia: Martes 10-12pm
- Programación: Miércoles 2-4pm
- Inglés: Jueves 3-5pm
"""

Cómo Adaptarlo a Tu Negocio:

  1. Crea tu archivo info.txt con información específica

  2. Usa el mismo código sin cambios

  3. ¡Listo! Tu IA ahora es experta en TU tema


⚠️ Parte 8: Limitaciones y Consideraciones

Lo que DEBES Saber:

  1. Tamaño del documento:

    • Ideal: 100-1000 palabras

    • Máximo: 4000 palabras (depende del modelo)

  2. Calidad de la información:

    txt
    # ❌ MAL (vago)
    "Laravel es bueno"
    
    # ✅ BIEN (específico)
    "Laravel tiene sistema de rutas, ORM Eloquent, 
     motor Blade y sigue arquitectura MVC"
  3. La IA PUEDE "inventar":

    • A veces añade información no en el texto

    • Por eso decimos: "Si no sabe, que diga no"


📝 Cuestionario de Repaso

Pregunta 1: ¿Qué hace la función cargar_contenido()?

a) Envía datos a Ollama
b) Lee el archivo info.txt y devuelve su contenido
c) Crea la interfaz web
Respuesta correcta: b

Pregunta 2: ¿Por qué usamos encoding="UTF-8" al abrir el archivo?

a) Para que sea más rápido
b) Para leer correctamente tildes y caracteres especiales
c) Para conectarse a internet
Respuesta correcta: b

Pregunta 3: En el prompt especializado, ¿qué pasa si la IA no encuentra la respuesta en el texto?

a) Inventa una respuesta
b) Busca en internet
c) Dice "No está en el documento"
Respuesta correcta: c

Pregunta 4: Si preguntamos "¿Qué es Python?" y en info.txt solo hay información de Laravel, ¿qué responderá?

a) Una explicación de Python
b) "No está en el documento"
c) Información de Laravel
Respuesta correcta: b

Pregunta 5: ¿Para qué negocio sería útil esta técnica?

a) Una librería que quiera recomendar solo sus libros
b) Un chatbot general que deba saber de todo
c) Un motor de búsqueda como Google
Respuesta correcta: a


💡 Consejos para Tu Proyecto:

  1. Organiza tu info.txt:

    txt
    # Use títulos claros
    [PRODUCTOS]
    - Producto 1: $10
    - Producto 2: $20
    
    [SERVICIOS]
    - Servicio A: $50/hora
    - Servicio B: $100/hora
  2. Prueba con diferentes formatos:

    • Preguntas y respuestas

    • Listas con viñetas

    • Párrafos descriptivos

  3. Mantenlo actualizado:

    • Actualiza info.txt cuando cambien precios

    • Agrega nuevos productos/servicios


🚀 ¡Tu IA Ahora es un Experto!

Logros de hoy:
✅ Convertimos IA general en especialista
✅ Aprendimos a cargar documentos externos
✅ Creamos prompts que limitan respuestas
✅ Probamos con casos reales

Próximo paso: ¡Vamos a hacerlo aún más poderoso!


📂 Código Final Completado (app.py):

python
from flask import Flask, render_template, request
import requests

app = Flask(__name__)
conversation = []

OLLAMA_URL = "http://localhost:11434/api/generate"
MODEL_NAME = "gemma3:4b"

# --- NUEVA FUNCIÓN: Cargar documento ---
def cargar_contenido():
    """
    Lee el archivo info.txt y devuelve todo su contenido
    """
    with open("info.txt", "r", encoding="UTF-8") as archivo:
        return archivo.read()

@app.route("/", methods=["GET", "POST"])
def index():
    if request.method == "POST":
        # 1. Capturar pregunta
        user_input = request.form["user_input"]
        conversation.append(("Tú", user_input))
        
        try:
            # 2. Cargar nuestro conocimiento específico
            contexto = cargar_contenido()  # ← ¡NUEVO!
            
            # 3. Crear prompt especializado
            prompt_especializado = f"""
            Responde solo basándote en el siguiente texto.
            Si no sabes la respuesta, di que no está en el documento.

            Texto:
            {contexto}

            Pregunta: {user_input}
            """
            
            # 4. Enviar a Ollama
            payload = {
                "model": MODEL_NAME,
                "prompt": prompt_especializado,  # ← Usamos el nuevo prompt
                "stream": False
            }
            
            response = requests.post(OLLAMA_URL, json=payload, timeout=30)
            
            # 5. Procesar respuesta
            if response.status_code == 200:
                ai_response = response.json()["response"]
                conversation.append(("IA", ai_response))
            else:
                conversation.append(("IA", "❌ Error al contactar la IA"))
                
        except FileNotFoundError:
            conversation.append(("IA", "⚠️ No se encontró el archivo info.txt"))
        except Exception as e:
            conversation.append(("IA", f"❌ Error: {str(e)}"))
    
    return render_template("index.html", conversation=conversation)

if __name__ == "__main__":
    app.run(debug=True, port=5000)

info.txt (ejemplo para probar):

txt
Laravel es un framework de PHP para construir 
aplicaciones web de manera rápida y elegante.

Características principales:
- Sistema de rutas poderoso
- ORM llamado Eloquent
- Motor de plantillas Blade
- Arquitectura MVC (Modelo-Vista-Controlador)

Es utilizado por empresas como:
- BBC
- Pfizer
- Toyota
- Warner Bros

Comentarios

Entradas más populares de este blog

1-Instalación y Primeros Pasos con Ollama

3- Creando tu Primer Entorno Virtual Python con Flask

2- Cómo Usar Ollama con Postman (APIs y Comunicación)