RAG sin base vectorial aparte: búsqueda vectorial nativa en Turso
Turso guarda embeddings y busca por similitud con SQL, en la misma base que tus datos. Qué ofrece el motor Turso Database, qué ofrecen libSQL y Turso Cloud con el índice DiskANN, y cuándo alcanza.
8 min de lectura Investigado y publicado con Claude
En este artículo
Sí, con Turso podés armar un sistema de RAG (generación aumentada por recuperación) sin sumar una base de datos vectorial separada: los embeddings se guardan en una columna de la misma tabla que tus datos y la búsqueda por similitud se hace con SQL. Lo que tenés que saber es que hay dos implementaciones distintas: la del motor nuevo Turso Database, que hoy hace búsqueda exacta por recorrido completo, y la de libSQL y Turso Cloud, que suma un índice aproximado DiskANN para colecciones grandes. Elegir bien depende de cuántos vectores vas a tener.
Este artículo es parte de la serie "Turso en español" de Mark-Co Digital. Si venís del post sobre una base de datos por agente de IA, esta es la pieza que le da memoria semántica a cada agente.
Por qué no sumar otra base de datos#
La arquitectura típica de RAG junta tres cosas: la base relacional con tus datos, una base vectorial para los embeddings y un proceso que mantenga ambas sincronizadas. En el post "You Don't Need A Separate Vector Database", Jamie Barton defiende en el blog de Turso la idea de tener los vectores junto a los datos relacionales, y cita al blog de Timescale para describir el dolor de malabarear tres sistemas.
Las ventajas concretas de tenerlo todo en una base:
- Un solo backup, un solo permiso, una sola fuente de verdad.
- Podés filtrar por columnas normales (fecha, cliente, categoría) en la misma consulta que busca por similitud.
- Si usás una base por cliente o por agente, cada una tiene sus propios vectores aislados. La página de soluciones para agentes de IA de Turso destaca justamente la búsqueda vectorial en la misma base que el estado del agente.
La documentación general de Turso lo resume como búsqueda por similitud nativa para apps de IA y flujos de RAG, sin extensiones.
Turso Database: vectores nativos con búsqueda exacta#
En el motor reescrito en Rust, los vectores son nativos: no hay que cargar ninguna extensión.
Tipos y funciones#
La referencia de funciones vectoriales lista estos tipos:
| Tipo | Qué es |
|---|---|
vector32 |
32 bits por dimensión (4 bytes) |
vector64 |
64 bits por dimensión (8 bytes) |
vector |
por defecto, floats de 32 bits |
vector8 |
cuantizado |
vector1bit |
binario |
vector32_sparse |
disperso |
Y estas funciones de distancia: vector_distance_cos (coseno), vector_distance_l2 (euclídea), vector_distance_dot (producto punto negativo) y vector_distance_jaccard. También hay utilidades como vector_extract, vector_concat y vector_slice.
Un ejemplo completo#
La guía de búsqueda vectorial de Turso usa una tabla de documentos con una columna BLOB para el embedding:
CREATE TABLE documents (
id INTEGER PRIMARY KEY,
title TEXT,
content TEXT,
embedding BLOB
);
Se insertan los documentos con su vector (en la vida real, el vector lo genera un modelo de embeddings; acá son 4 dimensiones para que se entienda):
INSERT INTO documents (title, content, embedding) VALUES
('Machine learning basics', 'An introduction to ML concepts...', vector32('[0.2, 0.5, 0.1, 0.8]')),
('Database fundamentals', 'How relational databases work...', vector32('[0.1, 0.3, 0.9, 0.2]')),
('Neural networks guide', 'Deep learning architectures...', vector32('[0.3, 0.6, 0.2, 0.7]'));
Y se busca ordenando por distancia a la consulta:
SELECT title,
vector_distance_cos(embedding, vector32('[0.25, 0.55, 0.15, 0.75]')) AS distance
FROM documents
ORDER BY distance
LIMIT 5;
Límites que conviene conocer#
- Búsqueda por recorrido lineal: según la guía, las búsquedas de similitud recorren la tabla. El README del motor lo describe como soporte vectorial con búsqueda exacta. Es preciso, pero el costo crece con la cantidad de filas.
- Índice experimental: la referencia menciona un método de índice vectorial disperso experimental, detrás del flag
--experimental-index-method. No encontramos documentación de un índice DiskANN en este motor. - Hasta 65.536 dimensiones.
- Con
vector1bitno hay distancia L2, y el coseno devuelve distancia de Hamming.
libSQL y Turso Cloud: el índice DiskANN#
Si tu base corre sobre libSQL (el fork de SQLite, que es el motor por defecto al crear una base en Turso Cloud sin --tursodb), tenés otra implementación con índice de vecinos aproximados.
Columnas e índice#
La página de IA y embeddings documenta tipos de columna como F32_BLOB (el recomendado), F64_BLOB, F16_BLOB, FB16_BLOB, F8_BLOB y F1BIT_BLOB. Sobre una tabla con una de esas columnas, el índice se crea con libsql_vector_idx:
CREATE INDEX movies_idx ON movies(libsql_vector_idx(embedding));
Admite parámetros, como la métrica o la compresión de vecinos:
CREATE INDEX movies_idx
ON movies(libsql_vector_idx(embedding, 'metric=l2', 'compress_neighbors=float8'));
Consultar con vector_top_k#
La función vector_top_k devuelve los k vecinos más cercanos usando el índice, y podés unir el resultado con la tabla para aplicar filtros normales:
SELECT title, year
FROM vector_top_k('movies_idx', vector32('[0.064, 0.777, 0.661, 0.687]'), 3)
JOIN movies ON movies.rowid = id
WHERE year >= 2020;
Algunos detalles de la documentación: la métrica por defecto es coseno; hay parámetros como max_neighbors, alpha, search_l e insert_l para ajustar precisión y velocidad; y la tabla necesita ROWID o una PRIMARY KEY simple. El límite también es de 65.536 dimensiones.
Un pipeline real: Turso y Voyage AI#
En julio de 2026, Jeff Olson (Turso) e Ian Ward (MongoDB) publicaron en el blog de Turso una guía para armar un pipeline de recuperación con Turso y Voyage AI. Usa columnas F32_BLOB(1024), vector32(), vector_distance_cos(), el índice libsql_vector_idx y vector_top_k(), es decir, la implementación de libSQL. Según el post, la combinación reduce la pila habitual de RAG con varios servicios a una base embebible y una API de recuperación.
La tabla para no confundirse#
| Turso Database (Rust) | libSQL / Turso Cloud | |
|---|---|---|
| Vectores nativos | Sí (vector32, vector64, etc.) |
Sí (F32_BLOB, etc.) |
| Búsqueda exacta | Sí, por recorrido lineal | Sí, con funciones de distancia |
| Índice aproximado | Índice disperso experimental | DiskANN con libsql_vector_idx |
| Consulta top-k con índice | No documentada | vector_top_k |
| Máximo de dimensiones | 65.536 | 65.536 |
Qué significa para tu proyecto#
Para una pyme, el caso típico es un asistente que responde sobre documentos propios: manuales, preguntas frecuentes, fichas de productos o normativas internas. Si hablamos de cientos o pocos miles de fragmentos, la búsqueda exacta del motor nuevo probablemente alcance y te ahorra configurar índices; igual, medilo con tu volumen. Si hablamos de colecciones grandes, el índice DiskANN de libSQL en Turso Cloud es la opción documentada hoy.
Además, la búsqueda vectorial también llega a otros entornos: la guía de Drizzle cubre columnas vectoriales, y los bindings de React Native de Turso incluyen búsqueda vectorial en el dispositivo. El caso de Kin, un asistente de IA que según Turso guarda todos los datos en el dispositivo, es un buen ejemplo de RAG local.
Recomendaciones prácticas:
- Decidí el motor antes de escribir SQL: las funciones de índice no son las mismas.
- Guardá el texto original junto al vector para poder mostrar la fuente de cada respuesta.
- Si tenés una base por cliente o por agente, aprovechá ese aislamiento: la búsqueda nunca mezcla datos de otro.
Para el contexto de por qué Supabase anunció la compra de Turso pensando en agentes, mirá nuestro post sobre Supabase Select 2026 y la compra de Turso.
Preguntas frecuentes#
¿Necesito instalar una extensión para guardar embeddings en Turso?#
No. Tanto en Turso Database como en libSQL y Turso Cloud los tipos y funciones vectoriales vienen integrados.
¿Puedo usar vector_top_k en una base creada con --tursodb?#
La documentación de vector_top_k y libsql_vector_idx corresponde a libSQL y Turso Cloud. En la referencia del motor Turso Database no aparece; ahí la búsqueda es por recorrido lineal, con un índice disperso experimental.
¿Qué métrica de distancia conviene para embeddings de texto?#
La que recomiende el proveedor de tu modelo de embeddings. Coseno es el valor por defecto del índice DiskANN y la que usan los ejemplos oficiales.
¿Cuántas dimensiones admite un vector?#
Hasta 65.536, en los dos motores, según la documentación.
Cómo seguimos#
Si querés un asistente o agente de IA que responda con la información de tu empresa, en Mark-Co Digital diseñamos e implementamos agentes de IA a medida, incluida la base de datos que guarda su conocimiento, evaluando opciones como Turso y Supabase. Conocé también nuestro servicio de agentes de IA o escribinos.
Fuentes#
- Turso Docs: Vector search guide
- Turso Docs: Vector functions
- Turso Docs: AI and embeddings (libSQL y Turso Cloud)
- Turso Database en GitHub
- Jeff Olson e Ian Ward: Building a Retrieval Pipeline with Turso and Voyage AI
- Jamie Barton: You Don't Need A Separate Vector Database
- Turso Docs: Introduction
- Turso: solución para agentes de IA
- Turso: Kin y la búsqueda vectorial en el dispositivo
- Turso Docs: Drizzle
- Nikita Sivukhin: Introducing React Native bindings for Turso