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

Tutorial completo de Ollama: Instalaci贸n y uso de modelos locales

1-Instalaci贸n y Primeros Pasos con Ollama

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