Cambiar tema

Selección de bases de datos vectoriales para RAG: comparación en profundidad entre Pinecone, Weaviate y Milvus

Easton editorial illustration: vector-store selection console, managed vault, hybrid modular vault, self-hosted cluster vault

Un sistema RAG con solo 2 millones de documentos y la latencia P99 se disparó a 800 ms: un error típico de selección. El equipo montó un prototipo con Chroma en dos semanas, pero al superar el millón de vectores la latencia pasó de 20 ms a cifras mucho peores. Migrar a otra solución llevó tres semanas más: exportación, reconstrucción de vectores y ajuste de índices, con trampas en cada paso.

Elegir bien la base de datos vectorial es la mitad del éxito. La recuperación decide si la IA encuentra la información correcta; la generación solo puede dar buenas respuestas sobre esa base. Si la recuperación falla, ajustar prompts o cambiar de modelo no sirve de mucho.

Este artículo compara Pinecone, Weaviate y Milvus en benchmarks de rendimiento, modelos de precios y escenarios de uso. Al terminar tendrás un marco claro de decisión, sabrás qué encaja en tu caso y podrás calcular el presupuesto real.

Capítulo 1: ¿Por qué importa tanto la selección de la base de datos vectorial?

1.1 El papel de la base de datos vectorial en un sistema RAG

Mucha gente cree que la base de datos vectorial es solo un almacén de embeddings. En realidad, su valor no está en guardar datos, sino en recuperar con eficiencia la similitud semántica.

Las bases de datos tradicionales brillan en coincidencias exactas, como WHERE id = 100. Pero RAG resuelve otro tipo de problema: si el usuario pregunta cómo optimizar el rendimiento de código Python, necesitas documentos semánticamente relevantes, no una coincidencia literal de palabras clave. La base de datos vectorial convierte texto, imágenes y audio en vectores de alta dimensión (por ejemplo, text-embedding-3-small de OpenAI genera vectores de 1536 dimensiones) y usa algoritmos ANN (vecinos más cercanos aproximados) para encontrar rápido los candidatos más cercanos entre millones o miles de millones de vectores.

El núcleo del compromiso en ANN: recall frente a latencia de consulta. Calcular la distancia exacta de todos los vectores es prohibitivo: 1 millón de vectores de 1536 dimensiones puede tardar decenas de segundos en un escaneo completo. Los algoritmos ANN (HNSW, IVF, PQ) comprimen la latencia a milisegundos mediante aproximación, a costa de perder algunos resultados relevantes. Cada base de datos vectorial equilibra distinto la curva recall-latencia, y eso impacta directamente la precisión de recuperación del sistema RAG.

1.2 El costo real de elegir mal

La experiencia de nuestro equipo es un ejemplo bastante típico. Chroma en local es cómodo para desarrollo: pip install chromadb y en cinco minutos está funcionando. Pero al superar 1 millón de documentos, el cuello de botella del despliegue en una sola máquina queda al descubierto: escalar entre servidores implica gestionar migración, reconstrucción de índices y balanceo de carga a mano.

Hay otra trampa más sutil: los costos de Pinecone que se descontrolan. La capa gratuita admite 1 millón de vectores y suena bien. Pero al pasar al plan de pago, el doble cobro por almacenamiento y consultas sorprende. Un amigo con IA legal tenía 50 millones de documentos y 100.000 consultas diarias: la factura mensual superó los $3000, muy por encima del presupuesto inicial de $500.

Elegir mal no es solo un problema técnico: también es un problema de dinero.

1.3 El panorama de bases de datos vectoriales en 2026

Hoy el mercado se resume en tres grandes actores y nuevas fuerzas emergentes:

Los tres principales:

  • Pinecone: Serverless totalmente gestionado, listo para usar, ideal para arranques rápidos. En 2026, su oferta Serverless redujo aún más la barrera de entrada.
  • Weaviate: diseño modular, capacidades de grafo integradas, búsqueda híbrida (palabras clave + vectores) muy sólida.
  • Milvus: arquitectura cloud-native distribuida, aceleración GPU, respuesta en milisegundos con vectores a escala de cientos de millones.

Nuevas fuerzas:

  • pgvector: extensión de PostgreSQL; si ya usas PG, puedes añadir recuperación vectorial sin costo extra. Adecuado para cargas ligeras.
  • Qdrant: open source, buen rendimiento, posicionamiento de relación calidad-precio; más ligero que Milvus en autohospedaje.

Este artículo se centra en los tres primeros porque cubren desde cero operaciones gestionadas hasta autohospedaje a gran escala. pgvector y Qdrant los menciono en la sección de escenarios especiales.

Capítulo 2: Comparación de las diferencias clave entre las tres bases de datos

2.1 Diseño de arquitectura: tres enfoques distintos

Milvus: arquitectura cloud-native distribuida

La filosofía de Milvus es nacer para la escala. Es distribuida por diseño: despliegue en Kubernetes, réplicas múltiples, escalado horizontal. Los componentes están bien separados: nodos coordinadores para orquestación, nodos de datos para almacenamiento, nodos de consulta para recuperación.

Desplegar Milvus exige capacidades de operaciones serias. Hay que conocer Kubernetes, configuración de clúster y ajuste de aceleración GPU. La ventaja: una vez en marcha, de 10 millones a 10.000 millones de vectores se escala añadiendo nodos sin cambiar de arquitectura. La documentación oficial recomienda para producción al menos un clúster de 3 nodos, 16 GB de RAM por nodo como mínimo, y GPU (NVIDIA A100 o equivalente) para datos a escala de cientos de millones.

Pinecone: Serverless totalmente gestionado

Pinecone lleva la comodidad al extremo. No gestionas servidores, no configuras índices, no te preocupas por escalado: registras cuenta, creas índice, llamas a la API. En 2026, Serverless reduce aún más el costo de arranque: pagas por uso real y en reposo casi no gastas.

Esa comodidad limita la flexibilidad. Pinecone solo ofrece escalado vertical: la capacidad del índice la fija el proveedor cloud, sin nodos horizontales como en Milvus. Los parámetros personalizados del índice (M, ef de HNSW) son limitados; solo hay configuraciones predefinidas. Si necesitas afinar a fondo el rendimiento de recuperación, Pinecone puede sentirse restrictivo.

Weaviate: diseño modular + ADN de base de datos de grafos

Weaviate es especial: fusiona base de datos vectorial y de grafos. Cada vector puede llevar atributos de objeto (texto, imagen, metadatos) y relaciones semánticas entre objetos. Eso encaja muy bien con grafos de conocimiento: no solo buscas vectores similares, también sigues cadenas relacionales.

La modularidad es otro punto fuerte. Los módulos de embedding pueden conectar OpenAI, Cohere o modelos locales; el módulo de vectorización es personalizable; la recuperación multimodal (texto buscando imagen) viene soportada. El despliegue es flexible: autohospedaje, Weaviate Cloud o híbrido. Pero más opciones implican más configuración y una curva de aprendizaje mayor que Pinecone.

2.2 Benchmarks de rendimiento: datos reales comparados

Los datos de la tabla provienen de la evaluación comparativa de Tencent Cloud en 2025 y del informe de benchmark de IoT Digital Twin PLM en 2026. Condiciones: vectores de 1536 dimensiones (OpenAI text-embedding-3-small), índice HNSW, recall del 95 %.

<50ms
Milvus P99
Aceleración GPU
<100ms
Pinecone P99
Serverless
<150ms
Weaviate P99
Búsqueda híbrida
Cientos de miles de millones
Capacidad Milvus
Escalado distribuido
Source: Evaluación Tencent Cloud 2025
ProductoCapacidad por índiceLatencia (P99)Recuperación híbridaSoporte distribuidoAceleración GPU
MilvusCientos de miles de millones<50ms
WeaviateMiles de miles de millones<150msNo
PineconeMiles de millones<100msAutoescaladoNo

Observaciones clave:

  1. La brecha de latencia es notable: Milvus con GPU mantiene P99 por debajo de 50 ms, unas 3 veces más rápido que Weaviate. Si la velocidad importa (Q&A en tiempo real, chat de soporte), el usuario lo nota.

  2. Los límites de capacidad difieren: Weaviate declara soporte para miles de miles de millones de vectores, pero por encima de 1.000 millones el rendimiento decae. Milvus se mantiene estable a escala de cientos de millones gracias a la arquitectura distribuida y el sharding. El techo de miles de millones de Pinecone basta para escenarios medianos, pero puede quedarse corto en empresas muy grandes.

  3. La recuperación híbrida es estándar: las tres admiten vector + palabras clave. Weaviate destaca: su ADN de grafo facilita el modelado semántico y en escenarios de semántica compleja la precisión supera la búsqueda vectorial pura en un 5-10 % (datos de Tencent Cloud).

2.3 Modelos de precios: calcula el costo real

Cada proveedor juega distinto. Resumen de la estructura de costos:

Precios de Pinecone:

  • Capa gratuita: 1 millón de vectores, $0 de almacenamiento, consultas limitadas
  • Plan de pago: desde $70/mes (incluye almacenamiento para 10.000 millones de vectores), excedente por consulta
  • Fórmula: Cost = $70 + (consultas × $0.0001/consulta) (tras superar la cuota gratuita)

Precios de Weaviate:

  • Cloud gestionado: $0.01/GB/mes (almacenamiento), consultas ilimitadas
  • Fórmula: Cost = (vectores × 1536 dim × 4 bytes ÷ 1GB) × $0.01 × meses
  • Autohospedaje: open source gratuito, costo de servidores a tu cargo

Precios de Milvus:

  • Edición open source: autohospedaje gratuito
  • Cloud gestionado (Tencent Cloud/AWS): por nodo, nodos de alta capacidad ~$2000/mes
  • Fórmula: Cost = nodos × $2000/mes + costo GPU (si aplica)

Caso práctico: 50 millones de vectores, 100.000 consultas diarias, 1536 dimensiones.

OpciónCosto mensual estimadoNotas
Pinecone de pago$70 + 100k×30×$0.0001 = $370Cobro por consulta; caro con muchas consultas
Weaviate cloud50M×1536×4÷1024³ × $0.01 ≈ $3Cobro por almacenamiento; consultas ilimitadas, muy barato
Milvus autohospedadoServidor $500 + GPU $1000 = $1500Costo amortizado a largo plazo; operaciones aparte

Punto clave: el modelo de Weaviate por almacenamiento es muy rentable con consultas frecuentes. Pero muchos no cuentan el costo de operaciones en autohospedaje: contratar a alguien que domine Kubernetes cuesta al menos $50k al año.

Capítulo 3: Árbol de decisión según el escenario

No hay una opción mejor en abstracto, solo la más adecuada. Aquí va un marco según volumen de datos y tamaño del equipo.

3.1 Validación rápida de prototipo (<1 millón de vectores)

Recomendación: capa gratuita de Pinecone o Chroma en local

Si validas producto, haces demos internos o no conoces la velocidad de crecimiento, prioriza la capa gratuita de Pinecone: cero operaciones, integración en 5 minutos, cuota suficiente. Chroma también sirve, pero al superar el millón la migración duele.

Comparación de velocidad de arranque:

Pinecone:

from pinecone import Pinecone
pc = Pinecone(api_key="your-api-key")
index = pc.Index("my-index")  # El índice ya está creado en la nube

Chroma:

import chromadb
client = chromadb.Client()  # Modo local en memoria
collection = client.create_collection("my-collection")

Ambos arrancan rápido, pero el índice de Pinecone persiste en la nube; Chroma en local pierde los datos al reiniciar el proceso. Si el prototipo necesita persistencia entre sesiones, la capa gratuita de Pinecone encaja mejor.

3.2 Producción a escala media (1-100 millones de vectores)

Recomendación: Pinecone de pago o Weaviate cloud

Aquí importan el costo de operaciones y la precisión de recuperación.

Sin equipo de operaciones dedicado, prioriza servicios gestionados. Pinecone y Weaviate cloud ofrecen cero operaciones. Pero los modelos de precio difieren: consultas frecuentes → Weaviate (cobro por almacenamiento); consultas poco frecuentes → Pinecone (almacenamiento + consultas).

Si la precisión es crítica (IA legal, Q&A médico), la búsqueda híbrida de Weaviate rinde mejor. Los datos de Tencent Cloud muestran un 5-10 % más de precisión en semántica compleja frente a búsqueda vectorial pura. Su capacidad de grafo permite recuperación sobre relaciones semánticas, no solo documentos similares.

Sugerencia de cálculo de costos:

Costo mensual = (vectores × dimensiones × 4 bytes ÷ 1GB) × precio almacenamiento × meses
              + (consultas diarias × 30 × precio por consulta)

En Weaviate el precio por consulta es 0; en Pinecone ronda $0.0001/consulta. Sustituye tus cifras: la diferencia puede ser enorme.

3.3 Empresa a gran escala (>100 millones de vectores)

Recomendación: Milvus autohospedado + Kubernetes

A escala de cientos de millones, los servicios gestionados pierden rentabilidad. El techo de miles de millones de Pinecone puede quedarse corto; Weaviate cloud por almacenamiento también se encarece mucho. Milvus autohospedado suele ser la mejor opción: open source, GPU y escalado horizontal.

Pero necesitas equipo de operaciones. El despliegue requiere:

  • Clúster Kubernetes (mínimo 3 nodos)
  • Servidores GPU (NVIDIA A100 o equivalente)
  • Ajuste profesional de índices y latencia

No ignores el costo humano. Sin experiencia previa en Kubernetes, cuenta contratación o formación. A largo plazo el costo total de autohospedaje puede ser menor que el gestionado, pero la inversión inicial es alta: encaja en proyectos con crecimiento predecible y operación a largo plazo.

3.4 Escenarios especiales

Recuperación multimodal (texto buscando imagen, imagen buscando imagen): Weaviate

Weaviate integra módulos de vectorización multimodal (CLIP, modelos multimodales). Puedes subir una imagen, vectorizarla automáticamente y buscarla junto a vectores de texto en el mismo índice. Milvus también lo admite, pero debes configurar el módulo. Pinecone hoy no es multimodal: solo almacena vectores que tú generas.

Grafo de conocimiento + RAG: Weaviate

El ADN de grafo de Weaviate permite relaciones objeto-objeto, como cadenas empresa-empleado-proyecto. No solo encuentras documentos similares, también entidades relacionadas por relaciones semánticas. Milvus y Pinecone no ofrecen esto: solo recuperación vectorial pura.

Carga ligera / ya usas PostgreSQL: pgvector

Si ya tienes PostgreSQL y el volumen es moderado (hasta ~1 millón), pgvector no añade costo de infraestructura. Instala la extensión CREATE EXTENSION vector; y obtienes ANN en la misma base. El rendimiento queda por debajo de bases vectoriales dedicadas; por encima del millón la latencia sube notablemente.

Capítulo 4: Código práctico de integración con LangChain

Ejemplos completos de integración con LangChain para las tres bases de datos. Cada uno cubre inicialización, inserción de vectores y consulta, listos para ejecutar.

4.1 Pinecone + LangChain

# Instalar dependencias
# pip install pinecone-client langchain-openai

from pinecone import Pinecone
from langchain_openai import OpenAIEmbeddings
from langchain_pinecone import PineconeVectorStore

# Inicializar Pinecone
pc = Pinecone(api_key="your-pinecone-api-key")
index_name = "rag-demo"

# Crear índice (solo la primera vez)
if index_name not in pc.list_indexes().names():
    pc.create_index(
        name=index_name,
        dimension=1536,  # OpenAI text-embedding-3-small
        metric="cosine",
        spec={"serverless": {"cloud": "aws", "region": "us-east-1"}}
    )

index = pc.Index(index_name)

# Inicializar almacén vectorial de LangChain
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = PineconeVectorStore(
    index=index,
    embedding=embeddings,
    text_key="text"
)

# Añadir documentos
from langchain.schema import Document
docs = [
    Document(page_content="Trucos de rendimiento en Python: usa list comprehensions en lugar de bucles", metadata={"source": "blog"}),
    Document(page_content="Las operaciones vectorizadas de NumPy son 100 veces más rápidas que Python puro", metadata={"source": "blog"}),
]
vectorstore.add_documents(docs)

# Consulta de recuperación
results = vectorstore.similarity_search("cómo mejorar rendimiento Python", k=3)
for doc in results:
    print(doc.page_content)

4.2 Weaviate + LangChain

# Instalar dependencias
# pip install weaviate-client langchain-openai

import weaviate
from langchain_openai import OpenAIEmbeddings
from langchain_weaviate import WeaviateVectorStore

# Inicializar Weaviate (ejemplo cloud)
client = weaviate.connect_to_wcs(
    cluster_url="your-cluster-url.weaviate.network",
    auth_credentials=weaviate.auth.AuthApiKey("your-weaviate-api-key"),
)

# Inicializar almacén vectorial de LangChain
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = WeaviateVectorStore(
    client=client,
    index_name="RagDemo",
    text_key="content",
    embedding=embeddings,
)

# Añadir documentos
from langchain.schema import Document
docs = [
    Document(page_content="La precisión de recuperación en RAG depende de la elección de base de datos vectorial", metadata={"category": "tech"}),
    Document(page_content="La búsqueda híbrida de Weaviate mejora la precisión semántica", metadata={"category": "tech"}),
]
vectorstore.add_documents(docs)

# Búsqueda híbrida (vector + palabras clave)
results = vectorstore.similarity_search(
    query="recuperación RAG",
    k=3,
)
for doc in results:
    print(doc.page_content)

client.close()  # Cerrar conexión

4.3 Milvus + LangChain

# Instalar dependencias
# pip install pymilvus langchain-openai

from pymilvus import MilvusClient
from langchain_openai import OpenAIEmbeddings
from langchain_milvus import Milvus

# Inicializar Milvus (ejemplo local)
client = MilvusClient(uri="http://localhost:19530")

# Crear collection
collection_name = "rag_demo"
if client.has_collection(collection_name):
    client.drop_collection(collection_name)
client.create_collection(
    collection_name=collection_name,
    dimension=1536,
)

# Inicializar almacén vectorial de LangChain
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Milvus(
    embedding_function=embeddings,
    collection_name=collection_name,
    connection_args={"uri": "http://localhost:19530"},
)

# Añadir documentos
from langchain.schema import Document
docs = [
    Document(page_content="Milvus con GPU acelera la recuperación a escala de cientos de millones en milisegundos", metadata={"gpu": True}),
    Document(page_content="La arquitectura distribuida permite escalar horizontalmente a cientos de miles de millones", metadata={"scale": "large"}),
]
vectorstore.add_documents(docs)

# Consulta de recuperación
results = vectorstore.similarity_search("recuperación vectorial a gran escala", k=3)
for doc in results:
    print(doc.page_content)

4.4 Ruta de migración: de Chroma a solución gestionada

Si prototipaste con Chroma y vas a producción, este flujo en tres pasos ayuda:

Paso 1: exportar datos de Chroma

import chromadb
client = chromadb.PersistentClient(path="./chroma_db")
collection = client.get_collection("my_collection")

# Obtener todos los vectores
results = collection.get(include=["embeddings", "metadatas", "documents"])
vectors = results["embeddings"]
metadatas = results["metadatas"]
documents = results["documents"]

Paso 2: importación por lotes al destino

# Importar a Pinecone
from langchain.schema import Document
docs = [
    Document(page_content=documents[i], metadata=metadatas[i])
    for i in range(len(documents))
]
pinecone_store.add_documents(docs)  # Carga por lotes

Paso 3: reconstruir índice y validar

# Validar consistencia de resultados
chroma_results = collection.query(query_texts=["test query"], n_results=5)
pinecone_results = pinecone_store.similarity_search("test query", k=5)

# Comparar recall y confirmar migración exitosa

Estimación: 1 millón de vectores de Chroma a Pinecone tarda unas 2-3 horas según el ancho de banda. Ejecuta en horas de baja demanda para no afectar el servicio.

Capítulo 5: Resumen y tabla de decisión

5.1 Tabla de decisión de un vistazo

EscenarioVolumen de datosTamaño del equipoRecomendaciónMotivo
Validación de prototipo<1M1-2 personasCapa gratuita PineconeCero operaciones, arranque rápido, cuota suficiente
Producción mediana1M-100M3-5 personas, sin opsWeaviate cloudAlta precisión híbrida, bajo costo por almacenamiento
Producción, consultas frecuentes1M-100M3-5 personasWeaviate cloudConsultas ilimitadas, mejor relación calidad-precio
Producción, consultas poco frecuentes1M-100M3-5 personasPinecone de pagoCobro por consulta, costo controlable en baja frecuencia
Empresa a gran escala>100M5+ personas + opsMilvus autohospedadoGPU, escalado horizontal, menor costo a largo plazo
Recuperación multimodalCualquieraCualquieraWeaviateSoporte multimodal integrado
RAG con grafo de conocimientoCualquieraCualquieraWeaviateADN de grafo, modelado de relaciones semánticas
Carga ligera / ya tienes PG<1MCualquierapgvectorSin costo extra, extensión directa

5.2 Proceso de selección en tres pasos

  1. Evalúa volumen y crecimiento esperado

    • ¿Cuántos documentos tienes hoy?
    • ¿A cuánto llegarás en un año?
    • ¿El crecimiento es lineal o exponencial?
  2. Calcula el costo real

   Costo mensual = costo almacenamiento + costo consultas + costo operaciones
   

Usa las fórmulas anteriores con tus cifras y compara gestionado vs autohospedado. No olvides operaciones: el gestionado ahorra personal, pero autohospedado puede amortizarse mejor.

  1. Valida con prueba a pequeña escala
    • Prueba con el 10 % de los datos
    • Mide latencia P99, recall y QPS
    • Migra en volumen completo solo si cumple expectativas

5.3 Tres errores comunes de selección

Error 1: mirar solo el precio, no el costo de operaciones

Muchos eligen open source porque es gratis, pero el costo humano del autohospedaje se ignora. Contratar a alguien con Kubernetes cuesta $50k+/año; formar al equipo actual lleva 1-2 meses. El gestionado parece caro, pero el ahorro en operaciones cuenta.

Error 2: ignorar el impacto de la dimensión vectorial

text-embedding-3-large de OpenAI genera 3072 dimensiones, el doble que text-embedding-3-small (1536). A mayor dimensión, más latencia y más almacenamiento. Define el modelo de embedding antes de elegir base de datos.

Error 3: descubrir tarde que no soporta el modelo de embedding que necesitas

Pinecone solo almacena vectores: generas embeddings tú y los subes. Weaviate integra módulos de vectorización con OpenAI, Cohere y modelos locales. Si necesitas subir documentos y vectorizar automáticamente, confirma esa capacidad al elegir.

No hay respuesta estándar. Entiende tu escenario, calcula el costo real y valida a pequeña escala antes del despliegue completo. Espero que este artículo te ayude a evitar trampas y elegir la opción adecuada.

Si encuentras otros problemas en la práctica, deja un comentario: yo también sigo aprendiendo sobre la marcha.

FAQ

¿Cuál tiene la latencia más baja: Pinecone, Weaviate o Milvus?
Milvus con aceleración GPU alcanza latencia P99 &lt;50 ms, 3 veces más rápido que Weaviate (&lt;150 ms) y 2 veces más rápido que Pinecone (&lt;100 ms). Para Q&A en tiempo real, elige Milvus.
¿Cuál es más económico en escenarios de consultas frecuentes?
Weaviate cobra por almacenamiento ($0.01/GB/mes), consultas sin límite. Con 50 millones de vectores y 100.000 consultas diarias, Weaviate cuesta unos $3/mes y Pinecone unos $370.
¿Cuál elegir si no hay equipo de operaciones?
Pinecone o Weaviate en la nube. Ambos son servicios totalmente gestionados, cero operaciones. Pinecone es más simple; Weaviate ofrece más flexibilidad (búsqueda híbrida, multimodal).
¿Cuánto tarda migrar desde Chroma?
1 millón de vectores de Chroma a Pinecone tarda unas 2-3 horas. Pasos: exportar datos → importación por lotes → reconstruir índice → validar recall. Ejecuta en horas de baja demanda.
¿Cómo elegir la dimensión vectorial?
OpenAI text-embedding-3-small genera 1536 dimensiones con latencia moderada; text-embedding-3-large genera 3072 dimensiones y duplica la latencia. En producción se recomienda small, salvo que la precisión sea crítica.
¿Cuál elegir para grafo de conocimiento + RAG?
Weaviate. Su ADN de base de datos de grafos permite modelar relaciones objeto-objeto, como cadenas semánticas empresa-empleado-proyecto. Milvus y Pinecone solo admiten recuperación vectorial pura.

15 min de lectura · Publicado el: 27 abr 2026 · Actualizado el: 21 ago 2026

Comentarios

Inicia sesión con GitHub para dejar un comentario

Easton BlogEaston Blog