1. Empieza por las preguntas que debes recuperar
Un sistema RAG tiene al menos dos trabajos distintos: encontrar evidencia pertinente y construir una respuesta a partir de ella. Evalúalos por separado. Si la búsqueda devuelve el documento incorrecto, cambiar de modelo generativo puede ocultar el fallo con una explicación más convincente.
Escribe preguntas con sus documentos o fragmentos válidos. Incluye consultas exactas por identificador, paráfrasis, vocabulario interno y preguntas sin respuesta en el corpus. Para un repositorio, una firma de función y una pregunta sobre comportamiento pueden necesitar rutas de recuperación diferentes. Prueba búsqueda léxica junto con la semántica antes de asumir que todo necesita vectores.
2. Fragmenta conservando estructura y procedencia
Un chunk debe tener suficiente contexto para entenderse y suficiente precisión para no diluir el tema. Conserva encabezados, rutas, versión del documento y límites de funciones cuando tengan sentido. Registra un identificador estable y un hash del contenido para detectar cambios. No partas tablas o ejemplos de código a la mitad sin una estrategia para reconstruirlos.
No existe un tamaño universal. Compara varias configuraciones con las mismas preguntas y revisa los errores. Un solapamiento amplio puede mejorar continuidad, pero también duplica texto recuperado, costo de ingestión y almacenamiento. Mide cuántos fragmentos aportan evidencia distinta al contexto final.
- Guarda document_id, chunk_id, versión, procedencia y permisos junto al vector.
- Detecta borrados y cambios de acceso; actualizar texto no es la única operación de sincronización.
- Usa el tokenizador y límites aplicables al proveedor. Los caracteres no equivalen a tokens.
3. Versiona el espacio vectorial
La dimensión define la forma del vector, no su significado. Dos modelos que devuelven 1024 números no producen necesariamente espacios compatibles. Versiona modelo, dimensión, normalización y estrategia de fragmentación como una unidad. Cambiar cualquiera de ellos requiere una evaluación y, cuando cambie el espacio, un índice separado.
Algunos proveedores distinguen el tipo de entrada query del tipo document. Esa configuración forma parte del contrato: no la omitas al comparar resultados. También conviene fallar de forma explícita ante entradas demasiado largas durante la ingestión, en lugar de truncar silenciosamente y perder el párrafo que contenía la respuesta.
Documentación: Voyage: tipos de entrada, dimensiones y truncamiento ↗ · Mistral: embeddings para código ↗
4. Autoriza antes de recuperar
El tenant o workspace de búsqueda debe salir de una sesión verificada en el servidor. Un identificador enviado por el navegador no demuestra acceso. Aplica restricciones de visibilidad dentro de la consulta al índice y vuelve a comprobar permisos al cargar el contenido. Filtrar después de entregar fragmentos al modelo ya es demasiado tarde.
session = requireVerifiedSession(request)
scope = authorizeWorkspace(session, requestedWorkspace)
queryVector = embedQuery(query, indexVersion)
hits = searchIndex(queryVector, {
workspace: scope.id,
allowedResources: scope.resourceIds,
indexVersion
})
context = loadAuthorizedChunks(session, hits)
answer = generateWithCitations(query, context)Una caché compartida necesita incluir alcance de autorización y versión de índice en su clave. Diseña también la invalidación al revocar permisos. El aislamiento no termina en la consulta vectorial: se extiende a citas, enlaces de descarga, trazas y respuestas almacenadas.
5. Mide recuperación antes de redactar
Para preguntas con varios fragmentos relevantes conocidos, recall@k expresa qué fracción de ellos aparece entre los primeros k resultados. Si solo marcas un documento aceptable, puedes medir además la proporción de preguntas donde aparece en ese grupo. Define exactamente tu unidad de relevancia; cambiar de documento a chunk cambia la interpretación.
| Experimento | Qué observar |
|---|---|
| Solo búsqueda léxica | Referencias exactas, nombres propios y códigos de error. |
| Búsqueda vectorial | Paráfrasis y vocabulario diferente con el mismo significado. |
| Recuperación combinada | Cobertura adicional frente al costo y complejidad. |
| Reranking de candidatos | Orden de evidencia útil y latencia añadida. |
El siguiente paso es evaluar la respuesta: respaldo en fuentes, contradicciones, citas que realmente contienen la afirmación y capacidad de abstenerse. Registra también ausencia de evidencia. Un sistema que siempre responde puede tener una experiencia aparente excelente y una fiabilidad baja.
6. Migra con una comparación paralela
Construye el nuevo índice junto al anterior y reproduce un conjunto de consultas autorizado sobre ambos. Revisa calidad, permisos, latencia y costo antes de cambiar lectura. Conserva un cursor de ingestión para incorporar modificaciones que ocurran durante la migración. El cambio debe incluir un punto claro de reversión.
Presupuesta la ingestión inicial, las actualizaciones, los vectores almacenados, el índice de búsqueda y el contexto enviado al generador. La tarifa de embeddings solo cubre una parte. Usa el comparador para elegir candidatos y confirma el resultado con tu corpus, especialmente si contiene código, imágenes o documentos multilingües.
Documentación: Cohere: modalidades y dimensiones de Embed ↗
Fuentes y alcance
Documentación consultada el 8 de septiembre de 2026. Los ejemplos y criterios de decisión son propuestas editoriales; adáptalos al contrato de tu aplicación y valídalos en tu entorno de pruebas autorizado.
Compara embeddings
Revisa tarifas, límites, condiciones y fuentes de cada opción.
Abrir comparador