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:
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...│ ✅
└─────────────────────────────────┘
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:
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:
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:
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()
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:
┌─────────────────────────────────────────┐
│ 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:
# 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}
"""
# 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:
┌─────────────────────────────────────────────────┐
│ 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] │
└─────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────┐ │ 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:
# 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:
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ 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 │
└─────────────────┘ └──────────────────┘ └─────────────┘
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ 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:
Pregunta Respuesta 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
| Pregunta | Respuesta 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:
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.
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:
# 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
"""
# 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:
Crea tu archivo info.txt con información específica
Usa el mismo código sin cambios
¡Listo! Tu IA ahora es experta en TU tema
Crea tu archivo info.txt con información específica
Usa el mismo código sin cambios
¡Listo! Tu IA ahora es experta en TU tema
⚠️ Parte 8: Limitaciones y Consideraciones
Lo que DEBES Saber:
Tamaño del documento:
Ideal: 100-1000 palabras
Máximo: 4000 palabras (depende del modelo)
Calidad de la información:
# ❌ MAL (vago)
"Laravel es bueno"
# ✅ BIEN (específico)
"Laravel tiene sistema de rutas, ORM Eloquent,
motor Blade y sigue arquitectura MVC"La IA PUEDE "inventar":
A veces añade información no en el texto
Por eso decimos: "Si no sabe, que diga no"
Tamaño del documento:
Ideal: 100-1000 palabras
Máximo: 4000 palabras (depende del modelo)
Calidad de la información:
# ❌ MAL (vago)
"Laravel es bueno"
# ✅ BIEN (específico)
"Laravel tiene sistema de rutas, ORM Eloquent,
motor Blade y sigue arquitectura MVC"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:
Organiza tu info.txt:
# Use títulos claros
[PRODUCTOS]
- Producto 1: $10
- Producto 2: $20
[SERVICIOS]
- Servicio A: $50/hora
- Servicio B: $100/horaPrueba con diferentes formatos:
Preguntas y respuestas
Listas con viñetas
Párrafos descriptivos
Mantenlo actualizado:
Actualiza info.txt cuando cambien precios
Agrega nuevos productos/servicios
Organiza tu info.txt:
# Use títulos claros
[PRODUCTOS]
- Producto 1: $10
- Producto 2: $20
[SERVICIOS]
- Servicio A: $50/hora
- Servicio B: $100/horaPrueba con diferentes formatos:
Preguntas y respuestas
Listas con viñetas
Párrafos descriptivos
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):
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)
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):
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
Publicar un comentario