ChromaDB base de datos vectorial

Intermedio
LangChain
LangChain
Actualizado: 18/04/2026

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.

ChromaDB como Vector Store en LangChain: colección persistente con indexación y búsqueda por similitud con filtros

Instalación mediante Docker

La forma más eficiente de ejecutar ChromaDB es mediante Docker. Crea un archivo docker-compose.yml:

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:

Para iniciar el servicio:

docker-compose up -d

Instalación de dependencias Python

ChromaDB requiere paquetes específicos para integrarse correctamente con LangChain:

pip install chromadb langchain-chroma langchain-openai

Configuración básica del cliente

Una vez que el servidor ChromaDB esté ejecutándose, configura el cliente Python:

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
import chromadb

client = chromadb.HttpClient(host="localhost", port=8000)

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

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:

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,
)

Persistencia y colección de documentos

La persistencia automática de ChromaDB elimina la complejidad de gestionar manualmente el almacenamiento de vectores.

Almacenamiento de documentos

Para añadir documentos a una colección de ChromaDB:

from langchain_core.documents import Document

documentos = [
    Document(
        page_content="Python es un lenguaje de programación interpretado y de alto nivel.",
        metadata={"categoria": "programacion", "nivel": "basico", "fecha": "2025-01-15"}
    ),
    Document(
        page_content="FastAPI es un framework web moderno para construir APIs con Python.",
        metadata={"categoria": "web", "nivel": "intermedio", "fecha": "2025-01-16"}
    ),
    Document(
        page_content="Docker permite empaquetar aplicaciones en contenedores ligeros.",
        metadata={"categoria": "devops", "nivel": "intermedio", "fecha": "2025-01-17"}
    )
]

vector_store.add_documents(documentos)

Gestión de identificadores personalizados

Cuando necesites control sobre los identificadores de documentos:

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"}
    )
]

ids_personalizados = ["ml_intro_001", "dl_intro_002"]

vector_store.add_documents(
    documents=documentos_con_ids,
    ids=ids_personalizados
)

Búsqueda y recuperación de documentos

La búsqueda por similitud constituye la funcionalidad principal:

consulta = "¿Qué es el aprendizaje automático?"
documentos_similares = vector_store.similarity_search(
    query=consulta,
    k=3
)

for doc in documentos_similares:
    print(f"Contenido: {doc.page_content}")
    print(f"Metadatos: {doc.metadata}")

Búsqueda con puntuación de similitud

Para obtener información sobre la relevancia de los resultados:

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}")

Filtrado por metadatos

ChromaDB permite filtrar resultados basándose en los metadatos almacenados:

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:

ids_a_eliminar = ["ml_intro_001", "dl_intro_002"]
vector_store.delete(ids=ids_a_eliminar)

Uso como Retriever en cadenas LCEL

Una de las funcionalidades más potentes de ChromaDB en LangChain es su capacidad para actuar como retriever dentro de cadenas LCEL. Esto permite integrar la búsqueda vectorial directamente en flujos de procesamiento complejos:

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI

chat_model = ChatOpenAI(model="gpt-5.4")

prompt = ChatPromptTemplate.from_template(
    "Basándote en el siguiente contexto:\n{context}\n\nResponde a: {question}"
)

retriever = vector_store.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 3}
)

chain = (
    {"context": retriever, "question": lambda x: x["question"]}
    | prompt
    | chat_model
    | StrOutputParser()
)

respuesta = chain.invoke({"question": "¿Qué tecnologías están relacionadas con IA?"})
print(respuesta)

El método as_retriever() transforma el vector store en un componente compatible con LCEL, aceptando parámetros como search_type para elegir entre búsqueda por similitud estándar o búsqueda con umbral de relevancia mediante similarity_score_threshold.

Gestión de colecciones y mantenimiento

En aplicaciones de producción, es habitual gestionar múltiples colecciones dentro del mismo servidor ChromaDB. Cada colección funciona como un espacio de nombres independiente con su propio índice vectorial:

# Listar colecciones existentes
colecciones = client.list_collections()
for col in colecciones:
    print(f"Colección: {col.name}, Documentos: {col.count()}")

# Eliminar una colección completa
client.delete_collection("documentos_obsoletos")

Actualización de documentos existentes

Cuando los documentos fuente cambian, puedes actualizar los embeddings almacenados sin necesidad de recrear toda la colección:

# Actualizar documentos existentes por ID
documentos_actualizados = [
    Document(
        page_content="Python 3.14 introduce nuevas características de tipado estático.",
        metadata={"categoria": "programacion", "version": "3.14"}
    )
]

vector_store.update_documents(
    ids=["ml_intro_001"],
    documents=documentos_actualizados
)

Monitorización del rendimiento

Para aplicaciones en producción, resulta conveniente monitorizar el estado del vector store:

# Verificar el número total de documentos
coleccion = client.get_collection("documentos_rag")
total_docs = coleccion.count()
print(f"Total de documentos indexados: {total_docs}")

# Comprobar la conexión con el servidor
heartbeat = client.heartbeat()
print(f"Servidor ChromaDB activo: latencia {heartbeat}ms")

ChromaDB proporciona una solución robusta para aplicaciones RAG que requieren persistencia y escalabilidad. Su arquitectura cliente-servidor, combinada con la persistencia automática y el soporte para filtros avanzados por metadatos, lo convierte en una opción excelente tanto para entornos de desarrollo como de producción. Además, su compatibilidad total con la interfaz estándar de LangChain facilita la migración a otras soluciones vectoriales en el futuro si las necesidades del proyecto lo requieren. En la siguiente lección exploraremos PGVector, que ofrece integración con PostgreSQL para entornos empresariales.

Fuentes y referencias

Documentación oficial y recursos externos para profundizar en LangChain

Documentación oficial de LangChain
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, LangChain es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de LangChain

Explora más contenido relacionado con LangChain y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

Instalar y configurar ChromaDB con Docker, crear colecciones vectoriales, almacenar y buscar documentos usando ChromaDB, trabajar con metadatos y filtros, y entender las ventajas de ChromaDB sobre soluciones en memoria.

Cursos que incluyen esta lección

Esta lección forma parte de los siguientes cursos estructurados con rutas de aprendizaje