Crea un buscador para tu asistente con SQLite, antes de usar vectores
Índice FTS5 en Python, código probado y prompt con citas. Una base simple para responder preguntas sobre tus documentos y detectar cuándo necesitas búsqueda semántica.

Başlıklar
Quieres que un asistente responda preguntas sobre tus documentos, pero todavía tienes 20 páginas, no millones. Antes de pagar por embeddings y una base vectorial, puedes construir una búsqueda local comprobable con SQLite. Esta guía crea un pequeño índice FTS5, recupera fragmentos relevantes y deja la decisión de respuesta a la IA. El código usa solo la biblioteca estándar de Python y lo ejecutamos con un caso de prueba.
Cuándo sirve FTS5
FTS5 es el módulo de búsqueda de texto completo de SQLite. Indexa palabras y devuelve coincidencias ordenadas; su documentación oficial explica MATCH, snippet() y bm25(). Resulta útil si tus consultas suelen usar las mismas palabras que los documentos: políticas, manuales, FAQs o notas. No entiende sinónimos ni intención semántica por sí solo. Si el usuario pregunta «quiero darme de baja» y el documento solo dice «cancelar suscripción», quizá no encuentre nada. Ese límite debe aparecer en la experiencia.
Construye el índice en diez minutos
Guarda el siguiente archivo como buscador_fts5.py y ejecútalo con python3 buscador_fts5.py. Las tres entradas son ejemplos ficticios: sustitúyelas por texto que tengas derecho a usar y conserva un identificador o URL de fuente por documento cuando pases a producción.
import sqlite3
db = sqlite3.connect(":memory:")
db.execute("CREATE VIRTUAL TABLE notas USING fts5(titulo, cuerpo, tokenize='unicode61 remove_diacritics 2')")
documentos = [
("Cancelación", "Para cancelar la suscripción, abre Cuenta > Facturación. La baja conserva acceso hasta fin del ciclo."),
("Reembolso", "Solicita un reembolso dentro de 14 días desde la compra mediante soporte."),
("Cambio de plan", "Puedes cambiar al plan anual desde Cuenta > Facturación."),
]
db.executemany("INSERT INTO notas(titulo,cuerpo) VALUES (?,?)", documentos)
consulta = 'cancelar suscripción'
# Comillas por término: entrada simple sin operadores FTS arbitrarios.
busqueda = ' '.join('"' + palabra.replace('"', '') + '"' for palabra in consulta.split())
filas = db.execute("""
SELECT titulo, snippet(notas, 1, '[', ']', '…', 12), bm25(notas)
FROM notas WHERE notas MATCH ? ORDER BY bm25(notas) LIMIT 3
""", (busqueda,)).fetchall()
for titulo, fragmento, puntuacion in filas:
print(titulo, '|', fragmento, '|', round(puntuacion, 3))
En nuestra prueba, la consulta «cancelar suscripción» devolvió «Cancelación» con un fragmento que resalta ambas palabras. bm25 ordena los resultados; en SQLite los valores menores se consideran mejores. El código convierte cada palabra del usuario en un término entre comillas y pasa la búsqueda como parámetro SQL. Para un buscador público necesitarás límites de longitud, tratamiento de operadores y pruebas de consultas vacías.

Conecta la recuperación a un asistente
No envíes todos los documentos al modelo. Recupera dos o tres fragmentos, añade título y URL, y dale una instrucción verificable. Un prompt inicial sería:
Responde solo con la información de los fragmentos adjuntos. Cita el título de la fuente en cada afirmación importante. Si los fragmentos no bastan, di «No encuentro esa respuesta en estos documentos» y explica qué dato falta. No inventes políticas ni pasos.
El modelo puede redactar con los fragmentos, pero tú debes comprobar que cada respuesta enlaza con una fuente y que no mezcla documentos de distintos clientes. Si hay permisos por usuario, filtra los documentos autorizados antes de construir el contexto. Un índice compartido sin control de acceso filtraría información aunque el prompt ordenara no hacerlo.
Cuándo pasar a búsqueda semántica
Prueba diez preguntas reales. Si fallan sobre todo por sinónimos o lenguaje natural, considera una capa semántica y compárala con esta base simple. Si fallan porque la documentación está incompleta, ningún vector arreglará el contenido. Guarda preguntas, resultado esperado, documentos recuperados y respuesta final: esa pequeña evaluación te dice si la complejidad adicional vale la pena. Para proyectos pequeños, empezar por FTS5 hace visibles los errores y mantiene bajo el costo de experimentación.
Fuente técnica: SQLite FTS5. Script y salida probados localmente por SoyJB el 13 de octubre de 2026; datos del ejemplo ficticios.
Recibe lo nuevo en tu correo
Workshops gratis, herramientas y novedades de IA aplicadas a negocio, sin humo.