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 |
{ "name": "Reticulated Splines", "desc": "Specialized grooves used in advanced machinery for precise alignment.", "price": 19.99, "image": "data:image/png;base64,...", "rating": 5, "imageVector": [ -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 |
// Free tier: 20 Calls per minute, 5K Calls per month // Standard tier: 10 Calls per second, starting $1.00 USD/1000 calls (Estimated) public async Task<float[]> GetImageEmbedding(string base64Image) { var endpoint = _settings.Value.Endpoint; var subscriptionKey = _settings.Value.SubscriptionKey; using (HttpClient client = new HttpClient()) { // Set the subscription key and endpoint client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey); // Endpoint URL string url = $"{endpoint}/retrieval:vectorizeImage?overload=stream&api-version=2023-04-01-preview"; byte[] imageBytes = Base64PngToByteArray(base64Image); using (ByteArrayContent content = new ByteArrayContent(imageBytes)) { content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); HttpResponseMessage response = await client.PostAsync(url, content); string jsonResponse = await response.Content.ReadAsStringAsync(); if (response.IsSuccessStatusCode) { // Parse the JSON response to extract the vector embeddings JObject json = JObject.Parse(jsonResponse); JToken vectorEmbeddings = json["vector"]; return vectorEmbeddings.ToObject<float[]>(); } throw new Exception("Unable to retrieve vector embeddings for image."); } } } |
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 |
WITH closestStores AS ( /* CTE to get closest stores based on user's location */ SELECT x.name, META(x).id AS id FROM whatisthis._default.Stores x WHERE SEARCH(x, { "fields": ["*"], "query" : { "location" : { "lat" : 39.8787, "lon" : -83.0805 }, "distance" : "15mi", "field" : "geo" } . . . }) LIMIT 3 ) /* SELECT items with nearby stock */ SELECT allItems.name, allItems.`desc`, allItems.image, allItems.price, allItems.rating, SEARCH_SCORE(allItems) AS score, /* subquery to get stock from nearby locations */ (SELECT . . . ) AS stock FROM whatisthis._default.Items AS allItems /* vector search using image embedding */ WHERE SEARCH(allItems, { "fields": ["*"], "query": { "match_none": {} }, "knn": [ { "k": 4, "field": "imageVector", "vector": [ -0.9135742,1.1552734, ... ] } ] } ) ORDER BY score 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!)