Instalación y configuración de ChromaDB
ChromaDB representa un salto cualitativo respecto a FAISS en términos de persistencia y gestión de datos vectoriales.
Mientras que FAISS requiere implementar manualmente la persistencia, ChromaDB ofrece almacenamiento automático y una arquitectura cliente-servidor que facilita el desarrollo de aplicaciones RAG robustas.
Instalación mediante Docker
La forma más eficiente de ejecutar ChromaDB es mediante Docker, ya que proporciona un entorno aislado y configuración consistente. Primero, crea un archivo docker-compose.yml
en tu directorio de proyecto:
version: '3.8'
services:
chroma:
container_name: chroma
image: chromadb/chroma:1.0.10
ports:
- "8000:8000"
environment:
- CHROMA_SERVER_HOST=0.0.0.0
- CHROMA_SERVER_HTTP_PORT=8000
- IS_PERSISTENT=TRUE
- PERSIST_DIRECTORY=/chroma/chroma
volumes:
- chroma_data:/chroma/chroma
volumes:
chroma_data:
Esta configuración establece un servidor ChromaDB que escucha en el puerto 8000 con persistencia habilitada. El volumen chroma_data
garantiza que los datos se mantengan entre reinicios del contenedor.
Para iniciar el servicio, ejecuta:
docker-compose up -d
Instalación de dependencias Python
ChromaDB requiere paquetes específicos para integrarse correctamente con LangChain 0.3. Instala las dependencias necesarias:
pip install chromadb langchain-chroma langchain-openai
Es importante usar langchain-chroma
en lugar de langchain-community
para aprovechar la API actualizada de LangChain 0.3 que ofrece mejor rendimiento y compatibilidad.
Configuración básica del cliente
Una vez que el servidor ChromaDB esté ejecutándose, configura el cliente Python para conectarse al servicio:
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
import chromadb
# Configurar el cliente ChromaDB
client = chromadb.HttpClient(host="localhost", port=8000)
# Configurar embeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# Crear instancia de Chroma conectada al servidor
vector_store = Chroma(
client=client,
collection_name="documentos_rag",
embedding_function=embeddings,
)
Configuración de colecciones
ChromaDB organiza los datos en colecciones, que funcionan como espacios de nombres independientes. Cada colección puede tener diferentes configuraciones de embeddings y metadatos:
# Crear múltiples colecciones para diferentes tipos de documentos
vector_store_legal = Chroma(
client=client,
collection_name="documentos_legales",
embedding_function=embeddings,
)
vector_store_tecnico = Chroma(
client=client,
collection_name="documentos_tecnicos",
embedding_function=embeddings,
)
Verificación de la conexión
Para asegurar que la configuración funciona correctamente, implementa una verificación básica:
def verificar_conexion_chroma(vector_store):
"""Verifica que ChromaDB esté funcionando correctamente"""
try:
# Intentar obtener información de la colección
collection_info = vector_store._collection.count()
print(f"Conexión exitosa. Documentos en colección: {collection_info}")
return True
except Exception as e:
print(f"Error de conexión: {e}")
return False
# Verificar la conexión
if verificar_conexion_chroma(vector_store):
print("ChromaDB configurado correctamente")
Configuración de metadatos
ChromaDB permite configurar metadatos personalizados que enriquecen la información almacenada junto con los vectores:
# Configurar metadatos por defecto para la colección
metadata_config = {
"hnsw:space": "cosine", # Métrica de distancia
"hnsw:construction_ef": 200, # Parámetros de construcción del índice
"hnsw:M": 16 # Número de conexiones bidireccionales
}
vector_store_optimizado = Chroma(
client=client,
collection_name="documentos_optimizados",
embedding_function=embeddings,
collection_metadata=metadata_config
)
Esta configuración establece los parámetros del índice HNSW (Hierarchical Navigable Small World) que ChromaDB utiliza internamente para búsquedas eficientes de vectores similares.
Gestión de variables de entorno
Para mayor seguridad y flexibilidad, configura las credenciales mediante variables de entorno:
import os
from langchain_openai import OpenAIEmbeddings
# Configurar API key de OpenAI
os.environ["OPENAI_API_KEY"] = "tu-api-key-aqui"
# Configurar embeddings con modelo específico
embeddings = OpenAIEmbeddings(
model="text-embedding-3-small",
openai_api_key=os.getenv("OPENAI_API_KEY")
)
# Configurar ChromaDB con parámetros de entorno
CHROMA_HOST = os.getenv("CHROMA_HOST", "localhost")
CHROMA_PORT = int(os.getenv("CHROMA_PORT", "8000"))
client = chromadb.HttpClient(host=CHROMA_HOST, port=CHROMA_PORT)
Con esta configuración, ChromaDB está listo para almacenar y recuperar documentos de forma persistente, proporcionando una base sólida para aplicaciones RAG que requieren durabilidad de datos y escalabilidad.
Persistencia y colección de documentos
Guarda tu progreso
Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.
Más de 25.000 desarrolladores ya confían en CertiDevs
La persistencia automática de ChromaDB elimina la complejidad de gestionar manualmente el almacenamiento de vectores, permitiendo que los documentos se mantengan disponibles entre sesiones sin configuración adicional. A diferencia de FAISS, donde la persistencia requiere implementación manual, ChromaDB gestiona automáticamente el ciclo de vida de los datos.
Almacenamiento de documentos
Para añadir documentos a una colección de ChromaDB, utiliza el método add_documents
que procesa automáticamente el texto y genera los embeddings correspondientes:
from langchain_core.documents import Document
# Crear documentos con metadatos
documentos = [
Document(
page_content="Python es un lenguaje de programación interpretado y de alto nivel.",
metadata={"categoria": "programacion", "nivel": "basico", "fecha": "2024-01-15"}
),
Document(
page_content="FastAPI es un framework web moderno para construir APIs con Python.",
metadata={"categoria": "web", "nivel": "intermedio", "fecha": "2024-01-16"}
),
Document(
page_content="Docker permite empaquetar aplicaciones en contenedores ligeros.",
metadata={"categoria": "devops", "nivel": "intermedio", "fecha": "2024-01-17"}
)
]
# Añadir documentos a la colección
vector_store.add_documents(documentos)
ChromaDB asigna automáticamente identificadores únicos a cada documento y calcula sus embeddings utilizando la función configurada. Los metadatos se almacenan junto con los vectores, permitiendo filtrado avanzado durante las búsquedas.
Gestión de identificadores personalizados
Cuando necesites control sobre los identificadores de documentos, puedes especificar IDs personalizados para facilitar actualizaciones y referencias posteriores:
# Documentos con IDs específicos
documentos_con_ids = [
Document(
page_content="Machine Learning es una rama de la inteligencia artificial.",
metadata={"categoria": "ia", "autor": "equipo_datos"}
),
Document(
page_content="Deep Learning utiliza redes neuronales profundas.",
metadata={"categoria": "ia", "autor": "equipo_datos"}
)
]
# Especificar IDs personalizados
ids_personalizados = ["ml_intro_001", "dl_intro_002"]
vector_store.add_documents(
documents=documentos_con_ids,
ids=ids_personalizados
)
Actualización de documentos existentes
ChromaDB permite actualizar documentos existentes utilizando sus identificadores. Cuando se actualiza un documento, ChromaDB recalcula automáticamente sus embeddings:
# Actualizar documento existente
documento_actualizado = Document(
page_content="Machine Learning es una rama de la IA que permite a las máquinas aprender patrones.",
metadata={"categoria": "ia", "autor": "equipo_datos", "version": "2.0"}
)
# Actualizar usando el ID existente
vector_store.add_documents(
documents=[documento_actualizado],
ids=["ml_intro_001"]
)
Búsqueda y recuperación de documentos
La búsqueda por similitud constituye la funcionalidad principal para recuperar documentos relevantes basándose en consultas de texto:
# Búsqueda básica por similitud
consulta = "¿Qué es el aprendizaje automático?"
documentos_similares = vector_store.similarity_search(
query=consulta,
k=3 # Número de documentos a recuperar
)
for doc in documentos_similares:
print(f"Contenido: {doc.page_content}")
print(f"Metadatos: {doc.metadata}")
print("---")
Ejemplo completo:
Búsqueda con puntuación de similitud
Para obtener información sobre la relevancia de los resultados, utiliza similarity_search_with_score
que devuelve tanto los documentos como sus puntuaciones de similitud:
# Búsqueda con puntuaciones
resultados_con_score = vector_store.similarity_search_with_score(
query="frameworks web para Python",
k=2
)
for documento, score in resultados_con_score:
print(f"Puntuación: {score:.4f}")
print(f"Contenido: {documento.page_content}")
print(f"Categoría: {documento.metadata.get('categoria', 'N/A')}")
print("---")
Filtrado por metadatos
ChromaDB permite filtrar resultados basándose en los metadatos almacenados, proporcionando búsquedas más precisas y contextuales:
# Filtrar por categoría específica
documentos_programacion = vector_store.similarity_search(
query="lenguajes de programación",
k=5,
filter={"categoria": "programacion"}
)
# Filtro más complejo con múltiples condiciones
filtro_avanzado = {
"$and": [
{"categoria": {"$in": ["programacion", "web"]}},
{"nivel": "intermedio"}
]
}
documentos_filtrados = vector_store.similarity_search(
query="desarrollo de aplicaciones",
k=3,
filter=filtro_avanzado
)
Eliminación de documentos
Para mantener las colecciones actualizadas, ChromaDB permite eliminar documentos específicos utilizando sus identificadores:
# Eliminar documentos por ID
ids_a_eliminar = ["ml_intro_001", "dl_intro_002"]
vector_store.delete(ids=ids_a_eliminar)
# Verificar eliminación
try:
resultado = vector_store.similarity_search("machine learning", k=1)
print(f"Documentos encontrados después de eliminación: {len(resultado)}")
except Exception as e:
print(f"Error en búsqueda: {e}")
Gestión de colecciones múltiples
Las colecciones separadas permiten organizar documentos por dominio, proyecto o cualquier criterio lógico, facilitando la gestión y búsqueda especializada:
# Crear colecciones especializadas
coleccion_legal = Chroma(
client=client,
collection_name="documentos_legales",
embedding_function=embeddings,
)
coleccion_tecnica = Chroma(
client=client,
collection_name="documentos_tecnicos",
embedding_function=embeddings,
)
# Añadir documentos específicos a cada colección
doc_legal = Document(
page_content="El contrato establece las obligaciones de ambas partes.",
metadata={"tipo": "contrato", "departamento": "legal"}
)
doc_tecnico = Document(
page_content="La API REST utiliza métodos HTTP para operaciones CRUD.",
metadata={"tipo": "documentacion", "departamento": "desarrollo"}
)
coleccion_legal.add_documents([doc_legal])
coleccion_tecnica.add_documents([doc_tecnico])
Aprendizajes de esta lección
- Comprender la instalación y configuración de ChromaDB mediante Docker y Python.
- Aprender a gestionar colecciones y documentos en ChromaDB con persistencia automática.
- Configurar embeddings y metadatos personalizados para optimizar búsquedas vectoriales.
- Realizar operaciones básicas como añadir, actualizar, buscar y eliminar documentos.
- Implementar filtros avanzados y monitorear el estado de las colecciones para mantenimiento y debugging.
Completa LangChain y certifícate
Únete a nuestra plataforma y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.
Asistente IA
Resuelve dudas al instante
Ejercicios
Practica con proyectos reales
Certificados
Valida tus conocimientos
Más de 25.000 desarrolladores ya se han certificado con CertiDevs