Hay casos de uso para los que lo mejor es utilizar varios tipos de acceso a datos, como SQL, búsqueda vectorial, consultas geoespaciales y acceso clave-valor. Un enfoque consiste en combinar o encadenar varios sistemas de datos para cada método de acceso. Sin embargo, la Enfoque Couchbase permite combinar estos distintos tipos de consultas para resolver problemas del mundo real.
Este artículo recorre aspectos de la aplicación de demostración "¿Qué es esta cosa?" (también conocida como "WITT"). Para más contexto y antecedentes, consulte:
Esta entrada del blog forma parte del 2024 C# Adviento. Sin embargo, no es necesario entender C# para leer este post: los conceptos son aplicables a cualquiera de los muchos SDK disponibles para Couchbase.
Búsqueda vectorial: Conceptos básicos
La búsqueda vectorial es útil para aplicaciones que necesitan encontrar elementos similares. Por ejemplo, las incrustaciones creadas por modelos de IA pueden indexarse y buscarse. Cada elemento de WITT se modela así:
1 2 3 4 5 6 7 8 |
{ "nombre": "Estrías reticuladas", "desc": "Ranuras especializadas utilizadas en maquinaria avanzada para una alineación precisa"., "precio": 19.99, "imagen": " datos:image/png;base64,...", "valoración": 5, "VectorImagen": [ -4.5390625, 0.32543945, ... ] } |
Nota imagen del elemento se almacena como una cadena codificada en base64. En un proyecto de producción, recomendaría utilizar almacenamiento de archivos, S3, etc., en lugar de almacenarlo en la base de datos.
imageVector
se recupera cargando la imagen en un modelo de imagen AI, como Azure Computer Vision.
Nota: Una de las características del recién anunciado Servicios de IA de Capella es el alojamiento de modelos, lo que reducirá la latencia de este paso y también aumentará la privacidad y la flexibilidad, además de reducir potencialmente los costes.
Incrustación de imágenes y búsqueda del vecino más próximo
Con un índice de búsqueda vectorial en el imageVector Couchbase puede realizar búsquedas de vecinos más cercanos. En este caso, esa búsqueda encontraría elementos que son visualmente similares (según el modelo de IA). Así, si un usuario tiene una imagen, y quiere encontrar un elemento en Couchbase que sea más similar a esa imagen, un índice de búsqueda vectorial puede hacerlo:
Aquí está el código en WITT que, para una imagen dada, solicita una incrustación vectorial de Azure Computer Vision:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
// Nivel gratuito: 20 llamadas por minuto, 5.000 llamadas al mes // Nivel estándar: 10 llamadas por segundo, a partir de $1,00 USD/1000 llamadas (estimado) público async Tarea<float[]> GetImageEmbedding(cadena base64Imagen) { var punto final = Configuración.Valor.Punto final; var subscriptionKey = Configuración.Valor.Clave de suscripción; utilizando (HttpClient cliente = nuevo HttpClient()) { // Establecer la clave de suscripción y el punto final cliente.DefaultRequestHeaders.Añadir("Ocp-Apim-Clave de suscripción", subscriptionKey); // URL del punto final cadena url = $"{endpoint}/retrieval:vectorizeImage?overload=stream&api-version=2023-04-01-preview"; byte[] imageBytes = Base64PngToByteArray(base64Imagen); utilizando (ByteArrayContent contenido = nuevo ByteArrayContent(imageBytes)) { contenido.Cabeceras.Tipo de contenido = nuevo MediaTypeHeaderValue("application/octet-stream"); HttpResponseMessage respuesta = await cliente.PostAsync(url, contenido); cadena jsonResponse = await respuesta.Contenido.ReadAsStringAsync(); si (respuesta.IsSuccessStatusCode) { // Parsear la respuesta JSON para extraer las incrustaciones vectoriales JObjeto json = JObjeto.Analice(jsonResponse); JToken vectorEmbeddings = json["vector"]; devolver vectorEmbeddings.ToObject<float[]>(); } tirar nuevo Excepción("Imposible recuperar incrustaciones vectoriales para la imagen".); } } } |
Probablemente hay frameworks que pueden manejar esta llamada también, pero para esta sencilla demostración, que sólo requiere una única llamada REST, me pareció suficiente. Si quieres usar algo diferente a Azure con esta demo, necesitas implementar IEmbeddingService
.
Consultas polivalentes con SQL
Muchas bases de datos con búsqueda vectorial pueden realizar una operación muy similar. Lo que Couchbase te permite es realizar múltiples tipos de operaciones de datos con una única plataforma, un único conjunto de datos. Por ejemplo, dada una localización geoespacial (que puede ser recuperada a través de un navegador web), no sólo puedes hacer una consulta para encontrar un elemento similar por imagen, sino también combinar eso con una búsqueda geoespacial, todo a través de una única consulta SQL++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
CON tiendasmáscercanas AS ( /* CTE para obtener las tiendas más cercanas en función de la ubicación del usuario */ SELECCIONE x.nombre, META(x).id AS id DESDE qué es esto.Por defecto.Tiendas x DONDE BUSCAR(x, { "campos": ["*"], "consulta" : { "localización" : { "lat" : 39.8787, "lon" : -83.0805 }, "distancia" : "15mi", "campo" : "geo" } . . . }) LÍMITE 3 ) /* SELECCIONAR artículos con existencias cercanas */ SELECCIONE allItems.nombre, allItems.`desc`, allItems.imagen, allItems.precio, allItems.valoración, BUSCAR_SCORE(allItems) AS puntuación, /* subconsulta para obtener existencias de lugares cercanos */ (SELECCIONE . . . ) AS stock DESDE qué es esto.Por defecto.Artículos AS allItems /* búsqueda vectorial mediante incrustación de imágenes */ DONDE BUSCAR(allItems, { "campos": ["*"], "consulta": { "match_none": {} }, "knn": [ { "k": 4, "campo": "imagenVector", "vector": [ -0.9135742,1.1552734, ... ] } ] } ) PEDIR POR puntuación DESC |
Nota: esta consulta ha sido editada en aras de la brevedad. Echa un vistazo DataLayer.cs para una visión más completa de las consultas.
El resultado de esta consulta es una "coincidencia más probable" para una imagen determinada. Por ejemplo, este es el primer resultado al cargar una imagen de un bolígrafo:
La calidad de los partidos dependerá de:
-
- La calidad del modelo de IA
- La calidad/cantidad de las imágenes de un artículo determinado
En mis pruebas limitadas, he comprobado que el modelo Azure Computer Vision es muy bueno a la hora de emparejar imágenes relevantes.
El resultado también contendrá las tiendas cercanas, donde el artículo está disponible para su compra.
Más allá de la búsqueda vectorial y geoespacial
Esta consulta mostraba la capacidad de Couchbase para combinar búsqueda vectorial Y búsqueda geoespacial en una única operación. También contenía una CTE, JOINs y una subconsulta.
Dentro de una misma consulta, también puedes realizar:
-
- Búsqueda de texto completoincluyendo puntuación, facetas, potenciación, etc.
- Series temporales operaciones
- Funciones definidas por el usuario (UDF) para añadir código personalizado (JavaScript o SQL)
- Funciones SQL completasFunciones de ventana, CTE, JOIN, agregación, etc.
- Lectura de datos analíticos en tiempo real a través de write-back
- Consulta de datos sincronizados automáticamente desde dispositivos móviles/de vanguardia
- Automático almacenamiento en caché (incorporado)
Aquí está la sección de marketing: Es posible que algunas bases de datos sólo puedan realizar un subconjunto de estas operaciones y le obliguen a recurrir a otras herramientas cuando necesite funciones adicionales. Esto aumenta tus costes, latencia y complejidad. Con Couchbase, puedes mantener tu aplicación más simple, más rápida y más barata. Se acabó la sección de marketing.
Aspectos técnicos destacados
La aplicación de demostración WITT a la que se hace referencia está construida con:
-
- Interfaz de usuario React UI
- ASP.NET Core backend
- Azure Computer Vision
- SDK .NET de Couchbase
También puede consultar ¿Qué es esta cosa? como demostración pública. (Tenga en cuenta que todo está construido con hosting de nivel libre (Azure y Capella Nivel gratuito), y que sigue desarrollándose activamente. Si nota cierta lentitud o tiempo de inactividad, podría deberse a un exceso de tráfico, ¡lo sentimos!)