El entrenamiento de la IA requiere muchos recursos. Se necesitan conjuntos de datos masivos, algoritmos avanzados y hardware especializado (es decir, costosas GPU) para enseñar a un modelo a entender el lenguaje, las imágenes o el audio. Pero incluso una vez completado el entrenamiento, realizar inferencias (el proceso de generar resultados) puede ser igualmente agotador.
Consultar un LLM en tiempo real para cada solicitud de un usuario no sólo es caro, sino también ineficaz. Sobre todo cuando la respuesta puede existir ya. Para resolver este problema, los equipos de desarrollo recurrieron a las bases de datos vectoriales.
A diferencia de las bases de datos tradicionales, que se basan en coincidencias exactas de palabras clave, las bases de datos vectoriales almacenan la información en forma de incrustaciones de alta dimensión, como representaciones numéricas de datos como texto, imágenes o sonido. Esto permite realizar búsquedas semánticas. En lugar de buscar palabras exactas, se busca el significado.
Esa distinción es esencial en casos de uso como:
- Generación aumentada por recuperación (RAG)
- Motores de recomendación
- Sistemas de respuesta a preguntas
- Búsqueda semántica
Con las bases de datos vectoriales, los sistemas de IA pueden recuperar información relevante de forma más rápida y eficiente al omitir llamadas de inferencia innecesarias cuando la respuesta ya existe en el índice vectorial. Hay muchas soluciones diferentes de bases de datos vectoriales, pero hoy voy a hablar de pgvector, una extensión de PostgreSQL de código abierto que yo personalmente uso y recomendaría. Vamos a ir a través de por qué creo que es una gran herramienta y cómo se puede empezar con él.
Por qué pgvector es una gran herramienta para desarrolladores
Para empezar, pgvector integra capacidades de búsqueda vectorial directamente en PostgreSQL, una de las bases de datos relacionales más ampliamente adoptadas en el mundo. Para los desarrolladores y equipos que ya trabajan dentro de un entorno basado en PostgreSQL, esto presenta una opción fluida y de menor fricción para construir aplicaciones inteligentes.
En lugar de introducir una nueva pila independiente que gestionar, pgvector permite a los equipos almacenar y consultar datos relacionales y vectoriales en un único lugar. Esta unificación elimina la complejidad de sincronizar bases de datos dispares y permite un ciclo de vida de desarrollo más sencillo. Las aplicaciones de IA a menudo requieren combinar diferentes tipos de consultas como filtros estructurados, búsqueda de texto completo y similitud semántica, todo en una sola operación. pgvector admite este patrón de búsqueda híbrido de forma nativa al permitir a los desarrolladores combinar la puntuación de similitud vectorial con filtros y uniones basados en SQL. Esto le permite buscar en un corpus de documentos no sólo por palabra clave, sino también por significado semántico, todo ello aplicando filtros como la categoría del documento o los permisos de usuario, dentro de una única consulta SQL.
pgvector está diseñado para ofrecer escalabilidad y rendimiento en el mundo real. Para aplicaciones que necesitan servir resultados rápidos a través de millones de incrustaciones, pgvector soporta la búsqueda aproximada del vecino más cercano (RNA) a través del método de indexación IVFFlat. Esto permite respuestas rápidas para aplicaciones sensibles a la latencia, como las barras de búsqueda impulsadas por IA o los sistemas de recomendación, al tiempo que se mantiene un buen equilibrio entre precisión y velocidad. Para los equipos que desarrollan en Python, pgvector se integra sin problemas en librerías cliente PostgreSQL populares como psycopg2, asyncpg y SQLAlchemy, lo que facilita su integración en los canales de datos y flujos de trabajo de ML existentes.
La versatilidad de pgvector está demostrando su valor en todos los sectores. Vemos cómo las organizaciones de comercio electrónico lo utilizan para impulsar las recomendaciones personalizadas con el fin de aumentar las conversiones. Una gran plataforma de medios de comunicación lo utiliza para mostrar contenidos relevantes y mantener el interés de los usuarios. Los equipos de sanidad y ciencias de la vida confían en él para acelerar la investigación, el descubrimiento de compuestos y el diagnóstico. En muchas empresas tecnológicas, permite ofrecer asistencia basada en LLM y herramientas internas más inteligentes.
Lo que hace que pgvector sea aún más potente es implementarlo en una plataforma como Akamai Cloud. La solución en la nube de Akamai ofrece a los equipos la infraestructura gestionada, la escalabilidad y el rendimiento global que necesitan para cargas de trabajo de nivel de producción. PostgreSQL gestionado en Akamai permite a los desarrolladores implementar aplicaciones respaldadas por pgvector sin preocuparse por la sobrecarga operativa. Con copias de seguridad automatizadas, seguridad integrada y opciones de autoescalado, su pila se mantiene resistente mientras su equipo se centra en la construcción. Y como la infraestructura informática y de red de Akamai está optimizada para la entrega global, las aplicaciones que dependen de motores de inferencia rápida o de recomendación en tiempo real se benefician de una latencia más baja y una mayor fiabilidad a escala.
Si ya estás usando PostgreSQL o estás buscando un motor de búsqueda vectorial preparado para IA que no requiera una revisión completa de la pila, te explicaré cómo empezar con pgvector en la siguiente sección.
Primeros pasos con pgvector en Akamai
- Aprovisione un clúster PostgreSQL utilizando el panel de bases de datos gestionadas de Akamai.
- Iniciar sesión en Cloud Manager.
- En el menú principal, seleccione Bases de datos.
- Haga clic en Crear clúster de base de datos.
- En el campo Etiqueta de clúster, introduzca una etiqueta para poder identificar fácilmente el clúster de su cuenta. La etiqueta debe ser alfanumérica y tener entre 3 y 32 caracteres.
- Seleccione el motor de base de datos para su nueva base de datos.
- Seleccione la región en la que residirá el clúster de base de datos.
- Cada nodo de un cluster de base de datos se construye sobre su propio Linode. En la sección Elegir un plan, seleccione el tipo de Linode y el plan que utilizarán los nodos.
- Haga clic en Crear clúster de base de datos. El aprovisionamiento completo del clúster tarda aproximadamente entre 10 y 15 minutos. Puede hacer un seguimiento del estado revisando el Estado en la lista de clusters de bases de datos.

Nota: También puede realizar el aprovisionamiento mediante API.
- Inicie sesión en su clúster
Para conectarse directamente a la base de datos desde la línea de comandos, puede utilizar la herramienta psql. Esta herramienta se incluye como parte de la mayoría de las instalaciones del servidor PostgreSQL, aunque también puedes instalarla por separado en la mayoría de los sistemas operativos.
Utilice el siguiente comando psql para conectarse a su base de datos, sustituyendo[host]y[username]con los valores correspondientes en la sección de detalles de la conexión.psql --host=[host] --username=[username] --password --dbname=postgres - Instalar una extensión
Para instalar una de las extensiones disponibles en su base de datos, utilice el comando CREAR EXTENSIÓN, sustituyendo [nombre_extensión] por el nombre de la extensión que desea instalar. En este caso, la extensión esvector.CREATE EXTENSION vector; - Definir columnas de vectores
Tras instalar la extensión vectorial, tendrá acceso a un nuevo tipo de datos denominado vector. El tamaño del vector (indicado entre paréntesis) representa el número de dimensiones almacenadas en ese vector. Para este ejemplo, usaremos 13, pero para un caso de uso real sería de miles.CREATE TABLE items ( id serial PRIMARY KEY, description text, embedding vector(13) ); - Inserte incrustaciones de su modelo ML (como OpenAI o Cara de abrazo). Para recopilar ejemplos de incrustaciones, puede utilizar el siguiente script Python , adaptado de la demo Hugging Face. Necesitará obtener un token de Hugging Face para que este ejemplo funcione.
import requests
import psycopg2
import os
# Hugging Face Configuration
model_id = "sentence-transformers/all-MiniLM-L6-v2"
hf_token = os.environ.get("HF_TOKEN") # Set an environmental variable called HF_TOKEN with your Hugging Face token
api_url = f"https://router.huggingface.co/hf-inference/models/{model_id}"
headers = {"Authorization": f"Bearer {hf_token}"}
# Database Configuration
db_conn_string = os.environ.get("DB_CONN_STRING") # Replace with your connection string or set an env var
# Source for Embeddings
source_sentence = "How do I get Medicare?"
sentences = [
"How do I get a replacement Medicare card?",
"What is the monthly premium for Medicare Part B?",
"How do I terminate my Medicare Part B (medical insurance)?",
"How do I sign up for Medicare?",
"Can I sign up for Medicare Part B if I am working and have health insurance through an employer?",
"How do I sign up for Medicare Part B if I already have Part A?",
"What are Medicare late enrollment penalties?",
"What is Medicare and who can get it?",
"How can I get help with my Medicare Part A and Part B premiums?",
"What are the different parts of Medicare?",
"Will my Medicare premiums be higher because of my higher income?",
"What is TRICARE ?",
"Should I sign up for Medicare Part B if I have Veterans' Benefits?"
]
# Hugging Face API Query Function
def get_embeddings(source_sentence, sentences):
"""Queries the Hugging Face API to get sentence embeddings."""
try:
response = requests.post(
Api_url,
headers=headers,
json={"inputs": { "source_sentence": source_sentence, "sentences": sentences }, "options": {"wait_for_model": True}}
)
response.raise_for_status() # Raise an exception for bad status codes (4xx or 5xx)
return response.json()
except requests.exceptions.RequestException as e:
print(f"Error querying Hugging Face API: {e}")
return None
# Main Execution
print("Fetching embeddings from Hugging Face...")
embeddings = get_embeddings(source_sentence, sentences)
if embeddings:
print(f"Successfully fetched {len(embeddings)} embeddings.")
conn = None
Try:
# Establish connection to the database
print("Connecting to the PostgreSQL database...")
conn = psycopg2.connect(db_conn_string)
cur = conn.cursor()
print("Connection successful.")
# Insert descriptions and embeddings into the database
print("Inserting data into the 'items' table...")
for description, embedding in zip(sentences, embeddings):
# The pgvector extension expects the vector as a string representation of a list
cur.execute(
"INSERT INTO items (description, embedding) VALUES (%s, %s)",
(description, embeddings)
)
# Commit the transaction to make the changes permanent
conn.commit()
print(f"Successfully inserted {cur.rowcount} records into the database.")
except psycopg2.Error as e:
print(f"Database error: {e}")
if conn:
conn.rollback() # Rollback the transaction on error
Finally:
# Ensure the connection is closed
if conn:
cur.close()
conn.close()
print("Database connection closed.") - Utilizar la indexación y búsqueda de pgvector
Create the index after the table has some data
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops);
SELECT *, embedding <-> query_embedding AS similarity FROM items ORDER BY similarity LIMIT 5;
Las bases de datos vectoriales están ayudando a los equipos a optimizar el rendimiento, reducir los costes de inferencia y ofrecer experiencias de usuario más inteligentes y rápidas, y extensiones como pgvector facilitan la introducción de la búsqueda semántica y las consultas híbridas en entornos familiares como PostgreSQL, sin necesidad de revisar la arquitectura.

Comentarios