Modelos de Lenguaje, Embeddings y Bases de Datos Vectoriales con Ollama y ChromaDB

 🎯 ¿Qué vamos a construir?

Un sistema de inteligencia artificial local que pueda:

  1. Entender y generar texto usando modelos de lenguaje (sin internet)

  2. Convertir texto a números (embeddings) que capturen su significado

  3. Almacenar y buscar información usando similitud semántica


🧠 Parte 1: Ollama - Tu IA Local

🔧 ¿Qué es Ollama?

Imagina que Ollama es como descargar Netflix para ver películas SIN internet. En lugar de películas, descargas modelos de IA que funcionan directamente en tu computadora.

📥 Instalación Paso a Paso

bash
# 1. Ve a la página oficial:
# https://ollama.com/

# 2. Descarga el instalador para tu sistema:
# Windows → ollama-setup.exe
# Mac → Ollama-darwin.zip
# Linux → curl -fsSL https://ollama.com/install.sh | sh

# 3. Instala (siguiente, siguiente, siguiente ✅)

# 4. Verifica la instalación:
# Abre tu terminal (CMD, PowerShell, o Terminal)
# Escribe:
ollama --version

🎨 Visualización: Cómo funciona Ollama

text
[TU COMPUTADORA] 
     ↓
[Ollama] ← Descarga modelos (como apps)
     ↓
[Modelo IA] ← Ej: Gemma3, Llama3, DeepSeek-R1
     ↓
[Respuestas] ← Funciona OFFLINE ✅

🤖 Descargando tu Primer Modelo

Los modelos son como diferentes niveles de conocimiento:

ModeloTamañoNivelAnalogía
Gemma3:4b3.3 GB🟢 BásicoEstudiante de secundaria
Llama3:8b4.7 GB🟡 IntermedioEstudiante universitario
DeepSeek-R1:32b20 GB🟠 AvanzadoMaestro especialista
Llama3:70b40 GB🔴 ExpertoInvestigador PhD
bash
# Ver modelos disponibles en tu PC:
ollama list

# Descargar un modelo nuevo:
ollama run gemma3:4b  # Modelo pequeño y rápido

# O descargar uno específico:
ollama run deepseek-r1:1.5b

💬 Conversando con tu Modelo

bash
# 1. Iniciar el modelo:
ollama run gemma3:4b

# 2. Conversar (aparecerá >>>):
>>> Hola, ¿cómo estás?
>>> ¿Qué fecha es hoy?
>>> Explícame qué es la fotosíntesis

# 3. Salir:
/bye  o  Ctrl+D

⚠️ Importante: Los modelos tienen fecha de corte (como enciclopedias antiguas). No saben eventos recientes a menos que los actualices.


🧬 Parte 2: Embeddings - El "ADN" del Texto

🔍 ¿Qué son los embeddings?

Imagina que cada palabra o frase tiene un código de barras numérico único. Los embeddings son esos códigos, pero que también capturan significado y relaciones.

📊 Visualización: De Texto a Números

text
"El gato corre rápido" 
     ↓ (sentence-transformers)
[0.23, -0.45, 0.89, ..., 0.12]  # 384 números (vector)

"El felino se mueve velozmente"
     ↓
[0.25, -0.43, 0.88, ..., 0.11]  # Casi igual → Significado similar

"La pizza está caliente"
     ↓
[0.89, 0.12, -0.56, ..., -0.34]  # Muy diferente → Tema distinto

🛠️ Instalando Sentence-Transformers

python
# En tu terminal (con Python instalado):
pip install sentence-transformers torch

💻 Ejemplo Práctico: Creando Embeddings

python
from sentence_transformers import SentenceTransformer

# 1. Cargar el modelo (se descarga automáticamente)
modelo = SentenceTransformer('all-MiniLM-L6-v2')
# Este modelo pesa ~80MB y es muy eficiente

# 2. Textos de ejemplo
textos = [
    "El perro juega en el parque",
    "Los caninos se divierten en áreas verdes",
    "Hoy voy a cocinar pasta",
    "Prepararé espaguetis para la cena"
]

# 3. Convertir a embeddings
embeddings = modelo.encode(textos)

print(f"Tenemos {len(textos)} textos")
print(f"Cada texto se convierte en {len(embeddings[0])} números")
print(f"El embedding del primer texto: {embeddings[0][:5]}...")  # Primeros 5 números

🗄️ Parte 3: ChromaDB - Tu Biblioteca Inteligente

📚 ¿Qué es ChromaDB?

Imagina ChromaDB como una biblioteca mágica donde no buscas por título, sino por significado. Le preguntas "libros sobre animales que vuelan" y te encuentra textos sobre pájaros, murciélagos, e incluso insectos.

🔄 Flujo Completo del Sistema

text
[Documentos de tu negocio]
         ↓
[Embeddings → Códigos numéricos]
         ↓
[Almacenar en ChromaDB]
         ↓
[Usuario hace pregunta]
         ↓
[Buscar textos similares]
         ↓
[Ollama respunde con contexto]

📦 Instalando ChromaDB

python
pip install chromadb

🏗️ Creando tu Primera Base de Datos Vectorial

python
import chromadb
from sentence_transformers import SentenceTransformer

# 1. Inicializar ChromaDB (crea una carpeta local)
chroma_client = chromadb.PersistentClient(path="./mi_base_datos")

# 2. Crear una "colección" (como una tabla)
coleccion = chroma_client.create_collection(name="documentos_empresa")

# 3. Modelo para embeddings
modelo_embed = SentenceTransformer('all-MiniLM-L6-v2')

# 4. Documentos de ejemplo (podrían ser manuales, FAQs, etc.)
documentos = [
    "Los empleados tienen 30 días de vacaciones al año",
    "Para reportar una falla, enviar email a soporte@empresa.com",
    "El horario de oficina es de 9 AM a 6 PM",
    "Los proyectos deben entregarse cada viernes",
    "El código de vestimenta es business casual"
]

# 5. Generar IDs únicos
ids = [f"doc_{i}" for i in range(len(documentos))]

# 6. Generar embeddings y guardar
embeddings = modelo_embed.encode(documentos).tolist()

# 7. Añadir a ChromaDB
coleccion.add(
    documents=documentos,
    embeddings=embeddings,
    ids=ids
)

print(f"✅ Base de datos creada con {len(documentos)} documentos")

🔎 Buscando Información por Significado

python
# Pregunta del usuario
pregunta = "¿Cuántos días libres tengo?"

# Convertir pregunta a embedding
embedding_pregunta = modelo_embed.encode([pregunta]).tolist()

# Buscar documentos similares
resultados = coleccion.query(
    query_embeddings=embedding_pregunta,
    n_results=2  # Traer los 2 más relevantes
)

print("📄 Documentos más relevantes:")
for i, doc in enumerate(resultados['documents'][0]):
    print(f"{i+1}. {doc}")

Salida esperada:

text
📄 Documentos más relevantes:
1. Los empleados tienen 30 días de vacaciones al año
2. El horario de oficina es de 9 AM a 6 PM

🚀 Parte 4: Sistema Completo - IA con Memoria

🤝 Integrando Todo: Ollama + Embeddings + ChromaDB

python
import subprocess
import json
import chromadb
from sentence_transformers import SentenceTransformer

class SistemaIAEmpresarial:
    def __init__(self):
        self.modelo_embed = SentenceTransformer('all-MiniLM-L6-v2')
        self.chroma_client = chromadb.PersistentClient(path="./empresa_db")
        
        # Crear o cargar colección
        try:
            self.coleccion = self.chroma_client.get_collection("conocimiento_empresa")
        except:
            self.coleccion = self.chroma_client.create_collection("conocimiento_empresa")
    
    def agregar_conocimiento(self, textos):
        """Añade documentos a la base de conocimientos"""
        embeddings = self.modelo_embed.encode(textos).tolist()
        ids = [f"doc_{self.coleccion.count() + i}" for i in range(len(textos))]
        
        self.coleccion.add(
            documents=textos,
            embeddings=embeddings,
            ids=ids
        )
        print(f"✅ Añadidos {len(textos)} documentos")
    
    def buscar_contexto(self, pregunta, n_resultados=3):
        """Encuentra información relevante para la pregunta"""
        embedding = self.modelo_embed.encode([pregunta]).tolist()
        
        resultados = self.coleccion.query(
            query_embeddings=embedding,
            n_results=n_resultados
        )
        
        # Combinar documentos encontrados
        contexto = "\n".join(resultados['documents'][0])
        return contexto
    
    def preguntar_a_ollama(self, pregunta, contexto):
        """Usa Ollama para responder con contexto"""
        # Crear prompt con contexto
        prompt = f"""Basándote en la siguiente información:
        
{contexto}

Pregunta: {pregunta}

Responde de manera clara y concisa:"""
        
        # Llamar a Ollama (debe estar instalado)
        comando = ["ollama", "run", "gemma3:4b", prompt]
        
        try:
            resultado = subprocess.run(
                comando, 
                capture_output=True, 
                text=True, 
                input=prompt,
                timeout=30
            )
            return resultado.stdout
        except Exception as e:
            return f"Error: {str(e)}"
    
    def preguntar(self, pregunta):
        """Flujo completo: buscar + responder"""
        print(f"🔍 Buscando información relevante...")
        contexto = self.buscar_contexto(pregunta)
        
        print(f"🤖 Consultando al modelo de IA...")
        respuesta = self.preguntar_a_ollama(pregunta, contexto)
        
        return respuesta

# 📝 EJEMPLO DE USO COMPLETO
if __name__ == "__main__":
    # 1. Crear sistema
    sistema = SistemaIAEmpresarial()
    
    # 2. Alimentar con conocimiento (solo una vez)
    conocimiento_inicial = [
        "Las vacaciones son de 30 días por año calendario",
        "El proceso de reporte de bugs requiere llenar el formato IT-102",
        "Las reuniones de equipo son cada lunes a las 10 AM",
        "El presupuesto para proyectos debe aprobarse por el gerente de área",
        "El día de pago es el último viernes de cada mes"
    ]
    
    sistema.agregar_conocimiento(conocimiento_inicial)
    
    # 3. Hacer preguntas
    preguntas = [
        "¿Cuántos días de vacaciones tengo?",
        "¿Cómo reporto un error en el software?",
        "¿Cuándo es la próxima reunión?"
    ]
    
    for pregunta in preguntas:
        print(f"\n🧑‍💼 Pregunta: {pregunta}")
        respuesta = sistema.preguntar(pregunta)
        print(f"🤖 Respuesta: {respuesta[:200]}...")  # Primeros 200 caracteres

📈 Diagrama del Sistema Completo


🎮 Ejercicio Práctico: Crea tu Propio Asistente

🎯 Reto: Asistente de Recetas de Cocina

python
# Paso 1: Configura el conocimiento
recetas = [
    "Para hacer arroz blanco: 1 taza de arroz, 2 tazas de agua, sal al gusto. Cocinar 20 minutos.",
    "Huevos revueltos: Batir 2 huevos, añadir sal, cocinar en sartén con mantequilla.",
    "Ensalada César: Lechuga, pollo, crutones, queso parmesano y aderezo César.",
    "Pasta con tomate: Cocinar pasta, preparar salsa con tomate, ajo y albahaca."
]

# Paso 2: Crea el sistema
# (Usa el código de la clase SistemaIAEmpresarial pero cámbiale el nombre)

# Paso 3: Pregunta cosas como:
# - "¿Cómo hago huevos revueltos?"
# - "¿Qué necesito para una ensalada?"
# - "¿Cuánto tiempo se cocina el arroz?"

📋 Resumen en Tabla

HerramientaFunciónAnalogíaEjemplo de Uso
OllamaEjecuta modelos de IA localmenteNetflix offlineollama run gemma3:4b
Sentence-TransformersConvierte texto a números (embeddings)Código de barras semánticomodelo.encode("texto")
ChromaDBAlmacena y busca por similitudBiblioteca mágicacoleccion.query(embedding)
Sistema CompletoIA con conocimiento específicoExperto de empresaPreguntas sobre procesos internos

💡 Consejos para Principiantes

  1. Empieza pequeño: Usa gemma3:4b (3.3GB) antes de modelos grandes

  2. Prueba primero: Haz embeddings con 5-10 documentos antes de miles

  3. Mantén organizado: Nombra bien tus colecciones en ChromaDB

  4. Experimenta: Prueba diferentes modelos de embeddings

  5. Backup: Guarda tu carpeta de ChromaDB (contiene toda tu base de datos)


🚨 Solución de Problemas Comunes

ProblemaSolución
"Ollama no se reconoce"Reinicia terminal o reinicia PC después de instalar
"Error de memoria"Usa modelos más pequeños o añade más RAM
"Embeddings muy lentos"Usa all-MiniLM-L6-v2 (el más rápido)
"ChromaDB no encuentra similitudes"Asegúrate que los embeddings se generaron con el mismo modelo

📚 Recursos Adicionales

  1. Documentación oficial:

  2. Modelos populares para Ollama:

    • llama3:8b - Buen balance

    • mistral:7b - Excelente para código

    • deepseek-coder:6.7b - Especializado en programación

  3. Modelos de embeddings:

    • all-MiniLM-L6-v2 - Pequeño y rápido (recomendado)

    • paraphrase-multilingual-MiniLM-L12-v2 - Multilingüe

    • all-mpnet-base-v2 - Mayor precisión


🎉 ¡Felicidades!

Ahora tienes un sistema completo de IA que:

  • ✅ Funciona sin internet

  • ✅ Entiende el significado (no solo palabras clave)

  • ✅ Aprende de tus documentos específicos

  • ✅ Responde preguntas contextuales

Próximo paso: Añade documentos reales de tu empresa o proyectos y conviértete en el experto en IA local de tu organización.

¿Listo para crear algo increíble?

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)