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:
Entender y generar texto usando modelos de lenguaje (sin internet)
Convertir texto a números (embeddings) que capturen su significado
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
# 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
[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:
| Modelo | Tamaño | Nivel | Analogía |
|---|---|---|---|
| Gemma3:4b | 3.3 GB | 🟢 Básico | Estudiante de secundaria |
| Llama3:8b | 4.7 GB | 🟡 Intermedio | Estudiante universitario |
| DeepSeek-R1:32b | 20 GB | 🟠 Avanzado | Maestro especialista |
| Llama3:70b | 40 GB | 🔴 Experto | Investigador PhD |
# 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
# 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
"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
# En tu terminal (con Python instalado):
pip install sentence-transformers torch💻 Ejemplo Práctico: Creando Embeddings
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
[Documentos de tu negocio]
↓
[Embeddings → Códigos numéricos]
↓
[Almacenar en ChromaDB]
↓
[Usuario hace pregunta]
↓
[Buscar textos similares]
↓
[Ollama respunde con contexto]📦 Instalando ChromaDB
pip install chromadb🏗️ Creando tu Primera Base de Datos Vectorial
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
# 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:
📄 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
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
# 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
| Herramienta | Función | Analogía | Ejemplo de Uso |
|---|---|---|---|
| Ollama | Ejecuta modelos de IA localmente | Netflix offline | ollama run gemma3:4b |
| Sentence-Transformers | Convierte texto a números (embeddings) | Código de barras semántico | modelo.encode("texto") |
| ChromaDB | Almacena y busca por similitud | Biblioteca mágica | coleccion.query(embedding) |
| Sistema Completo | IA con conocimiento específico | Experto de empresa | Preguntas sobre procesos internos |
💡 Consejos para Principiantes
Empieza pequeño: Usa
gemma3:4b(3.3GB) antes de modelos grandesPrueba primero: Haz embeddings con 5-10 documentos antes de miles
Mantén organizado: Nombra bien tus colecciones en ChromaDB
Experimenta: Prueba diferentes modelos de embeddings
Backup: Guarda tu carpeta de ChromaDB (contiene toda tu base de datos)
🚨 Solución de Problemas Comunes
| Problema | Solució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
Documentación oficial:
Modelos populares para Ollama:
llama3:8b- Buen balancemistral:7b- Excelente para códigodeepseek-coder:6.7b- Especializado en programación
Modelos de embeddings:
all-MiniLM-L6-v2- Pequeño y rápido (recomendado)paraphrase-multilingual-MiniLM-L12-v2- Multilingüeall-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
Publicar un comentario